1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38#ifndef __LUSTRE_FID_H
39#define __LUSTRE_FID_H
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152#include <linux/libcfs/libcfs.h>
153#include <uapi/linux/lustre/lustre_fid.h>
154#include <uapi/linux/lustre/lustre_idl.h>
155#include <uapi/linux/lustre/lustre_ostid.h>
156
157struct lu_env;
158struct lu_site;
159struct lu_context;
160struct obd_device;
161struct obd_export;
162
163
164extern const struct lu_seq_range LUSTRE_SEQ_SPACE_RANGE;
165extern const struct lu_seq_range LUSTRE_SEQ_ZERO_RANGE;
166extern const struct lu_fid LUSTRE_BFL_FID;
167extern const struct lu_fid LU_OBF_FID;
168extern const struct lu_fid LU_DOT_LUSTRE_FID;
169
170enum {
171
172
173
174 LUSTRE_METADATA_SEQ_MAX_WIDTH = 0x0000000000020000ULL,
175
176
177
178
179 LUSTRE_DATA_SEQ_MAX_WIDTH = 0x00000000FFFFFFFFULL,
180
181
182
183
184 LUSTRE_SEQ_META_WIDTH = 0x0000000000000001ULL,
185
186
187
188
189 LUSTRE_SEQ_BATCH_WIDTH = LUSTRE_SEQ_META_WIDTH * 1000,
190
191
192
193
194
195 LUSTRE_SEQ_SUPER_WIDTH = ((1ULL << 30ULL) * LUSTRE_SEQ_META_WIDTH)
196};
197
198enum {
199
200 OSD_OI_FID_OID_BITS = 6,
201
202 OSD_OI_FID_OID_BITS_MAX = 10,
203};
204
205
206enum local_oid {
207
208 FLD_INDEX_OID = 3UL,
209
210 FID_SEQ_CTL_OID = 4UL,
211 FID_SEQ_SRV_OID = 5UL,
212
213 MDD_ROOT_INDEX_OID = 6UL,
214 MDD_ORPHAN_OID = 7UL,
215 MDD_LOV_OBJ_OID = 8UL,
216 MDD_CAPA_KEYS_OID = 9UL,
217
218 LAST_RECV_OID = 11UL,
219 OSD_FS_ROOT_OID = 13UL,
220 ACCT_USER_OID = 15UL,
221 ACCT_GROUP_OID = 16UL,
222 LFSCK_BOOKMARK_OID = 17UL,
223 OTABLE_IT_OID = 18UL,
224
225
226
227
228 OFD_LAST_GROUP_OID = 4117UL,
229 LLOG_CATALOGS_OID = 4118UL,
230 MGS_CONFIGS_OID = 4119UL,
231 OFD_HEALTH_CHECK_OID = 4120UL,
232 MDD_LOV_OBJ_OSEQ = 4121UL,
233 LFSCK_NAMESPACE_OID = 4122UL,
234 REMOTE_PARENT_DIR_OID = 4123UL,
235 SLAVE_LLOG_CATALOGS_OID = 4124UL,
236};
237
238static inline void lu_local_obj_fid(struct lu_fid *fid, __u32 oid)
239{
240 fid->f_seq = FID_SEQ_LOCAL_FILE;
241 fid->f_oid = oid;
242 fid->f_ver = 0;
243}
244
245static inline void lu_local_name_obj_fid(struct lu_fid *fid, __u32 oid)
246{
247 fid->f_seq = FID_SEQ_LOCAL_NAME;
248 fid->f_oid = oid;
249 fid->f_ver = 0;
250}
251
252
253
254
255
256static inline int fid_is_root(const struct lu_fid *fid)
257{
258 return unlikely((fid_seq(fid) == FID_SEQ_ROOT &&
259 fid_oid(fid) == 1));
260}
261
262static inline int fid_is_dot_lustre(const struct lu_fid *fid)
263{
264 return unlikely(fid_seq(fid) == FID_SEQ_DOT_LUSTRE &&
265 fid_oid(fid) == FID_OID_DOT_LUSTRE);
266}
267
268static inline int fid_is_obf(const struct lu_fid *fid)
269{
270 return unlikely(fid_seq(fid) == FID_SEQ_DOT_LUSTRE &&
271 fid_oid(fid) == FID_OID_DOT_LUSTRE_OBF);
272}
273
274static inline int fid_is_otable_it(const struct lu_fid *fid)
275{
276 return unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE &&
277 fid_oid(fid) == OTABLE_IT_OID);
278}
279
280static inline int fid_is_acct(const struct lu_fid *fid)
281{
282 return fid_seq(fid) == FID_SEQ_LOCAL_FILE &&
283 (fid_oid(fid) == ACCT_USER_OID ||
284 fid_oid(fid) == ACCT_GROUP_OID);
285}
286
287static inline int fid_is_quota(const struct lu_fid *fid)
288{
289 return fid_seq(fid) == FID_SEQ_QUOTA ||
290 fid_seq(fid) == FID_SEQ_QUOTA_GLB;
291}
292
293static inline int fid_seq_in_fldb(__u64 seq)
294{
295 return fid_seq_is_igif(seq) || fid_seq_is_norm(seq) ||
296 fid_seq_is_root(seq) || fid_seq_is_dot(seq);
297}
298
299static inline void lu_last_id_fid(struct lu_fid *fid, __u64 seq, __u32 ost_idx)
300{
301 if (fid_seq_is_mdt0(seq)) {
302 fid->f_seq = fid_idif_seq(0, ost_idx);
303 } else {
304 LASSERTF(fid_seq_is_norm(seq) || fid_seq_is_echo(seq) ||
305 fid_seq_is_idif(seq), "%#llx\n", seq);
306 fid->f_seq = seq;
307 }
308 fid->f_oid = 0;
309 fid->f_ver = 0;
310}
311
312
313enum lu_cli_type {
314 LUSTRE_SEQ_METADATA = 1,
315 LUSTRE_SEQ_DATA
316};
317
318enum lu_mgr_type {
319 LUSTRE_SEQ_SERVER,
320 LUSTRE_SEQ_CONTROLLER
321};
322
323
324struct lu_client_seq {
325
326 struct obd_export *lcs_exp;
327 spinlock_t lcs_lock;
328
329
330
331
332
333
334 struct lu_seq_range lcs_space;
335
336
337 struct dentry *lcs_debugfs_entry;
338
339
340 struct lu_fid lcs_fid;
341
342
343 enum lu_cli_type lcs_type;
344
345
346
347
348
349 char lcs_name[LUSTRE_MDT_MAXNAMELEN];
350
351
352
353
354
355 __u64 lcs_width;
356
357
358 wait_queue_head_t lcs_waitq;
359 int lcs_update;
360};
361
362
363void seq_client_flush(struct lu_client_seq *seq);
364
365int seq_client_alloc_fid(const struct lu_env *env, struct lu_client_seq *seq,
366 struct lu_fid *fid);
367
368int fid_is_local(const struct lu_env *env,
369 struct lu_site *site, const struct lu_fid *fid);
370
371enum lu_cli_type;
372int client_fid_init(struct obd_device *obd, struct obd_export *exp,
373 enum lu_cli_type type);
374int client_fid_fini(struct obd_device *obd);
375
376
377
378struct ldlm_namespace;
379
380
381
382
383
384
385
386
387static inline void
388fid_build_reg_res_name(const struct lu_fid *fid, struct ldlm_res_id *res)
389{
390 memset(res, 0, sizeof(*res));
391 res->name[LUSTRE_RES_ID_SEQ_OFF] = fid_seq(fid);
392 res->name[LUSTRE_RES_ID_VER_OID_OFF] = fid_ver_oid(fid);
393}
394
395
396
397
398static inline bool fid_res_name_eq(const struct lu_fid *fid,
399 const struct ldlm_res_id *res)
400{
401 return res->name[LUSTRE_RES_ID_SEQ_OFF] == fid_seq(fid) &&
402 res->name[LUSTRE_RES_ID_VER_OID_OFF] == fid_ver_oid(fid);
403}
404
405
406
407
408static inline void
409fid_extract_from_res_name(struct lu_fid *fid, const struct ldlm_res_id *res)
410{
411 fid->f_seq = res->name[LUSTRE_RES_ID_SEQ_OFF];
412 fid->f_oid = (__u32)(res->name[LUSTRE_RES_ID_VER_OID_OFF]);
413 fid->f_ver = (__u32)(res->name[LUSTRE_RES_ID_VER_OID_OFF] >> 32);
414 LASSERT(fid_res_name_eq(fid, res));
415}
416
417
418
419
420static inline void
421fid_build_quota_res_name(const struct lu_fid *glb_fid, union lquota_id *qid,
422 struct ldlm_res_id *res)
423{
424 fid_build_reg_res_name(glb_fid, res);
425 res->name[LUSTRE_RES_ID_QUOTA_SEQ_OFF] = fid_seq(&qid->qid_fid);
426 res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF] = fid_ver_oid(&qid->qid_fid);
427}
428
429
430
431
432static inline void fid_extract_from_quota_res(struct lu_fid *glb_fid,
433 union lquota_id *qid,
434 const struct ldlm_res_id *res)
435{
436 fid_extract_from_res_name(glb_fid, res);
437 qid->qid_fid.f_seq = res->name[LUSTRE_RES_ID_QUOTA_SEQ_OFF];
438 qid->qid_fid.f_oid = (__u32)res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF];
439 qid->qid_fid.f_ver =
440 (__u32)(res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF] >> 32);
441}
442
443static inline void
444fid_build_pdo_res_name(const struct lu_fid *fid, unsigned int hash,
445 struct ldlm_res_id *res)
446{
447 fid_build_reg_res_name(fid, res);
448 res->name[LUSTRE_RES_ID_HSH_OFF] = hash;
449}
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469static inline void ostid_build_res_name(const struct ost_id *oi,
470 struct ldlm_res_id *name)
471{
472 memset(name, 0, sizeof(*name));
473 if (fid_seq_is_mdt0(ostid_seq(oi))) {
474 name->name[LUSTRE_RES_ID_SEQ_OFF] = ostid_id(oi);
475 name->name[LUSTRE_RES_ID_VER_OID_OFF] = ostid_seq(oi);
476 } else {
477 fid_build_reg_res_name(&oi->oi_fid, name);
478 }
479}
480
481
482
483
484static inline int ostid_res_name_eq(const struct ost_id *oi,
485 const struct ldlm_res_id *name)
486{
487
488
489
490 if (fid_seq_is_mdt0(ostid_seq(oi))) {
491 return name->name[LUSTRE_RES_ID_SEQ_OFF] == ostid_id(oi) &&
492 name->name[LUSTRE_RES_ID_VER_OID_OFF] == ostid_seq(oi);
493 } else {
494 return name->name[LUSTRE_RES_ID_SEQ_OFF] == ostid_seq(oi) &&
495 name->name[LUSTRE_RES_ID_VER_OID_OFF] == ostid_id(oi);
496 }
497}
498
499
500
501
502
503static inline int ostid_set_id(struct ost_id *oi, __u64 oid)
504{
505 if (fid_seq_is_mdt0(oi->oi.oi_seq)) {
506 if (oid >= IDIF_MAX_OID)
507 return -E2BIG;
508 oi->oi.oi_id = oid;
509 } else if (fid_is_idif(&oi->oi_fid)) {
510 if (oid >= IDIF_MAX_OID)
511 return -E2BIG;
512 oi->oi_fid.f_seq = fid_idif_seq(oid,
513 fid_idif_ost_idx(&oi->oi_fid));
514 oi->oi_fid.f_oid = oid;
515 oi->oi_fid.f_ver = oid >> 48;
516 } else {
517 if (oid >= OBIF_MAX_OID)
518 return -E2BIG;
519 oi->oi_fid.f_oid = oid;
520 }
521 return 0;
522}
523
524
525static inline int fid_to_ostid(const struct lu_fid *fid, struct ost_id *ostid)
526{
527 int rc = 0;
528
529 if (fid_seq_is_igif(fid->f_seq))
530 return -EBADF;
531
532 if (fid_is_idif(fid)) {
533 u64 objid = fid_idif_id(fid_seq(fid), fid_oid(fid),
534 fid_ver(fid));
535
536 ostid_set_seq_mdt0(ostid);
537 rc = ostid_set_id(ostid, objid);
538 } else {
539 ostid->oi_fid = *fid;
540 }
541
542 return rc;
543}
544
545
546static inline void ost_fid_build_resid(const struct lu_fid *fid,
547 struct ldlm_res_id *resname)
548{
549 if (fid_is_mdt0(fid) || fid_is_idif(fid)) {
550 struct ost_id oi;
551
552 oi.oi.oi_id = 0;
553 if (fid_to_ostid(fid, &oi) != 0)
554 return;
555 ostid_build_res_name(&oi, resname);
556 } else {
557 fid_build_reg_res_name(fid, resname);
558 }
559}
560
561
562
563
564
565
566
567
568
569
570
571
572static inline __u64 fid_flatten(const struct lu_fid *fid)
573{
574 __u64 ino;
575 __u64 seq;
576
577 if (fid_is_igif(fid)) {
578 ino = lu_igif_ino(fid);
579 return ino;
580 }
581
582 seq = fid_seq(fid);
583
584 ino = (seq << 24) + ((seq >> 24) & 0xffffff0000ULL) + fid_oid(fid);
585
586 return ino ? ino : fid_oid(fid);
587}
588
589static inline __u32 fid_hash(const struct lu_fid *f, int bits)
590{
591
592
593
594 return hash_long(fid_flatten(f), bits);
595}
596
597
598
599
600static inline __u32 fid_flatten32(const struct lu_fid *fid)
601{
602 __u32 ino;
603 __u64 seq;
604
605 if (fid_is_igif(fid)) {
606 ino = lu_igif_ino(fid);
607 return ino;
608 }
609
610 seq = fid_seq(fid) - FID_SEQ_START;
611
612
613
614
615
616
617
618 ino = ((seq & 0x000fffffULL) << 12) + ((seq >> 8) & 0xfffff000) +
619 (seq >> (64 - (40 - 8)) & 0xffffff00) +
620 (fid_oid(fid) & 0xff000fff) + ((fid_oid(fid) & 0x00fff000) << 8);
621
622 return ino ? ino : fid_oid(fid);
623}
624
625static inline int lu_fid_diff(const struct lu_fid *fid1,
626 const struct lu_fid *fid2)
627{
628 LASSERTF(fid_seq(fid1) == fid_seq(fid2), "fid1:" DFID ", fid2:" DFID "\n",
629 PFID(fid1), PFID(fid2));
630
631 if (fid_is_idif(fid1) && fid_is_idif(fid2))
632 return fid_idif_id(fid1->f_seq, fid1->f_oid, fid1->f_ver) -
633 fid_idif_id(fid2->f_seq, fid2->f_oid, fid2->f_ver);
634
635 return fid_oid(fid1) - fid_oid(fid2);
636}
637
638#define LUSTRE_SEQ_SRV_NAME "seq_srv"
639#define LUSTRE_SEQ_CTL_NAME "seq_ctl"
640
641
642static inline void range_cpu_to_le(struct lu_seq_range *dst, const struct lu_seq_range *src)
643{
644 dst->lsr_start = cpu_to_le64(src->lsr_start);
645 dst->lsr_end = cpu_to_le64(src->lsr_end);
646 dst->lsr_index = cpu_to_le32(src->lsr_index);
647 dst->lsr_flags = cpu_to_le32(src->lsr_flags);
648}
649
650static inline void range_le_to_cpu(struct lu_seq_range *dst, const struct lu_seq_range *src)
651{
652 dst->lsr_start = le64_to_cpu(src->lsr_start);
653 dst->lsr_end = le64_to_cpu(src->lsr_end);
654 dst->lsr_index = le32_to_cpu(src->lsr_index);
655 dst->lsr_flags = le32_to_cpu(src->lsr_flags);
656}
657
658static inline void range_cpu_to_be(struct lu_seq_range *dst, const struct lu_seq_range *src)
659{
660 dst->lsr_start = cpu_to_be64(src->lsr_start);
661 dst->lsr_end = cpu_to_be64(src->lsr_end);
662 dst->lsr_index = cpu_to_be32(src->lsr_index);
663 dst->lsr_flags = cpu_to_be32(src->lsr_flags);
664}
665
666static inline void range_be_to_cpu(struct lu_seq_range *dst, const struct lu_seq_range *src)
667{
668 dst->lsr_start = be64_to_cpu(src->lsr_start);
669 dst->lsr_end = be64_to_cpu(src->lsr_end);
670 dst->lsr_index = be32_to_cpu(src->lsr_index);
671 dst->lsr_flags = be32_to_cpu(src->lsr_flags);
672}
673
674
675
676#endif
677