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
39
40
41#ifndef __LUSTRE_FID_H
42#define __LUSTRE_FID_H
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
153
154
155#include <linux/libcfs/libcfs.h>
156#include <lustre/lustre_idl.h>
157
158struct lu_env;
159struct lu_site;
160struct lu_context;
161struct obd_device;
162struct obd_export;
163
164
165extern const struct lu_seq_range LUSTRE_SEQ_SPACE_RANGE;
166extern const struct lu_seq_range LUSTRE_SEQ_ZERO_RANGE;
167extern const struct lu_fid LUSTRE_BFL_FID;
168extern const struct lu_fid LU_OBF_FID;
169extern const struct lu_fid LU_DOT_LUSTRE_FID;
170
171enum {
172
173
174
175 LUSTRE_METADATA_SEQ_MAX_WIDTH = 0x0000000000020000ULL,
176
177
178
179
180 LUSTRE_DATA_SEQ_MAX_WIDTH = 0x00000000FFFFFFFFULL,
181
182
183
184
185 LUSTRE_SEQ_META_WIDTH = 0x0000000000000001ULL,
186
187
188
189
190 LUSTRE_SEQ_BATCH_WIDTH = LUSTRE_SEQ_META_WIDTH * 1000,
191
192
193
194
195
196 LUSTRE_SEQ_SUPER_WIDTH = ((1ULL << 30ULL) * LUSTRE_SEQ_META_WIDTH)
197};
198
199enum {
200
201 OSD_OI_FID_OID_BITS = 6,
202
203 OSD_OI_FID_OID_BITS_MAX = 10,
204};
205
206
207enum local_oid {
208
209 FLD_INDEX_OID = 3UL,
210
211 FID_SEQ_CTL_OID = 4UL,
212 FID_SEQ_SRV_OID = 5UL,
213
214 MDD_ROOT_INDEX_OID = 6UL,
215 MDD_ORPHAN_OID = 7UL,
216 MDD_LOV_OBJ_OID = 8UL,
217 MDD_CAPA_KEYS_OID = 9UL,
218
219 LAST_RECV_OID = 11UL,
220 OSD_FS_ROOT_OID = 13UL,
221 ACCT_USER_OID = 15UL,
222 ACCT_GROUP_OID = 16UL,
223 LFSCK_BOOKMARK_OID = 17UL,
224 OTABLE_IT_OID = 18UL,
225
226
227
228
229 OFD_LAST_GROUP_OID = 4117UL,
230 LLOG_CATALOGS_OID = 4118UL,
231 MGS_CONFIGS_OID = 4119UL,
232 OFD_HEALTH_CHECK_OID = 4120UL,
233 MDD_LOV_OBJ_OSEQ = 4121UL,
234 LFSCK_NAMESPACE_OID = 4122UL,
235 REMOTE_PARENT_DIR_OID = 4123UL,
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
255static inline int fid_is_root(const struct lu_fid *fid)
256{
257 return unlikely((fid_seq(fid) == FID_SEQ_ROOT &&
258 fid_oid(fid) == 1));
259}
260
261static inline int fid_is_dot_lustre(const struct lu_fid *fid)
262{
263 return unlikely(fid_seq(fid) == FID_SEQ_DOT_LUSTRE &&
264 fid_oid(fid) == FID_OID_DOT_LUSTRE);
265}
266
267static inline int fid_is_obf(const struct lu_fid *fid)
268{
269 return unlikely(fid_seq(fid) == FID_SEQ_DOT_LUSTRE &&
270 fid_oid(fid) == FID_OID_DOT_LUSTRE_OBF);
271}
272
273static inline int fid_is_otable_it(const struct lu_fid *fid)
274{
275 return unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE &&
276 fid_oid(fid) == OTABLE_IT_OID);
277}
278
279static inline int fid_is_acct(const struct lu_fid *fid)
280{
281 return fid_seq(fid) == FID_SEQ_LOCAL_FILE &&
282 (fid_oid(fid) == ACCT_USER_OID ||
283 fid_oid(fid) == ACCT_GROUP_OID);
284}
285
286static inline int fid_is_quota(const struct lu_fid *fid)
287{
288 return fid_seq(fid) == FID_SEQ_QUOTA ||
289 fid_seq(fid) == FID_SEQ_QUOTA_GLB;
290}
291
292static inline int fid_is_namespace_visible(const struct lu_fid *fid)
293{
294 const __u64 seq = fid_seq(fid);
295
296
297
298 return (!fid_is_last_id(fid) &&
299 (fid_seq_is_norm(seq) || fid_seq_is_igif(seq))) ||
300 fid_is_root(fid) || fid_is_dot_lustre(fid);
301}
302
303static inline int fid_seq_in_fldb(__u64 seq)
304{
305 return fid_seq_is_igif(seq) || fid_seq_is_norm(seq) ||
306 fid_seq_is_root(seq) || fid_seq_is_dot(seq);
307}
308
309static inline void lu_last_id_fid(struct lu_fid *fid, __u64 seq)
310{
311 if (fid_seq_is_mdt0(seq)) {
312 fid->f_seq = fid_idif_seq(0, 0);
313 } else {
314 LASSERTF(fid_seq_is_norm(seq) || fid_seq_is_echo(seq) ||
315 fid_seq_is_idif(seq), LPX64"\n", seq);
316 fid->f_seq = seq;
317 }
318 fid->f_oid = 0;
319 fid->f_ver = 0;
320}
321
322
323enum lu_cli_type {
324 LUSTRE_SEQ_METADATA = 1,
325 LUSTRE_SEQ_DATA
326};
327
328enum lu_mgr_type {
329 LUSTRE_SEQ_SERVER,
330 LUSTRE_SEQ_CONTROLLER
331};
332
333struct lu_server_seq;
334
335
336struct lu_client_seq {
337
338 struct obd_export *lcs_exp;
339 struct mutex lcs_mutex;
340
341
342
343
344
345
346 struct lu_seq_range lcs_space;
347
348
349 struct proc_dir_entry *lcs_proc_dir;
350
351
352 struct lu_fid lcs_fid;
353
354
355 enum lu_cli_type lcs_type;
356
357
358
359
360
361 char lcs_name[80];
362
363
364
365
366
367 __u64 lcs_width;
368
369
370 struct lu_server_seq *lcs_srv;
371
372
373 wait_queue_head_t lcs_waitq;
374 int lcs_update;
375};
376
377
378struct lu_server_seq {
379
380 struct lu_seq_range lss_space;
381
382
383 struct lu_seq_range lss_lowater_set;
384 struct lu_seq_range lss_hiwater_set;
385
386
387
388
389
390 struct dt_device *lss_dev;
391
392
393 struct dt_object *lss_obj;
394
395
396 struct proc_dir_entry *lss_proc_dir;
397
398
399 enum lu_mgr_type lss_type;
400
401
402 struct lu_client_seq *lss_cli;
403
404
405 struct mutex lss_mutex;
406
407
408
409
410
411 char lss_name[80];
412
413
414
415
416
417 __u64 lss_width;
418
419
420
421
422
423 __u64 lss_set_width;
424
425
426 __u32 lss_need_sync;
427
428
429
430
431 struct seq_server_site *lss_site;
432};
433
434struct com_thread_info;
435int seq_query(struct com_thread_info *info);
436
437struct ptlrpc_request;
438int seq_handle(struct ptlrpc_request *req);
439
440
441
442int seq_server_init(struct lu_server_seq *seq,
443 struct dt_device *dev,
444 const char *prefix,
445 enum lu_mgr_type type,
446 struct seq_server_site *ss,
447 const struct lu_env *env);
448
449void seq_server_fini(struct lu_server_seq *seq,
450 const struct lu_env *env);
451
452int seq_server_alloc_super(struct lu_server_seq *seq,
453 struct lu_seq_range *out,
454 const struct lu_env *env);
455
456int seq_server_alloc_meta(struct lu_server_seq *seq,
457 struct lu_seq_range *out,
458 const struct lu_env *env);
459
460int seq_server_set_cli(struct lu_server_seq *seq,
461 struct lu_client_seq *cli,
462 const struct lu_env *env);
463
464
465int seq_client_init(struct lu_client_seq *seq,
466 struct obd_export *exp,
467 enum lu_cli_type type,
468 const char *prefix,
469 struct lu_server_seq *srv);
470
471void seq_client_fini(struct lu_client_seq *seq);
472
473void seq_client_flush(struct lu_client_seq *seq);
474
475int seq_client_alloc_fid(const struct lu_env *env, struct lu_client_seq *seq,
476 struct lu_fid *fid);
477int seq_client_get_seq(const struct lu_env *env, struct lu_client_seq *seq,
478 seqno_t *seqnr);
479int seq_site_fini(const struct lu_env *env, struct seq_server_site *ss);
480
481int fid_is_local(const struct lu_env *env,
482 struct lu_site *site, const struct lu_fid *fid);
483
484enum lu_cli_type;
485int client_fid_init(struct obd_device *obd, struct obd_export *exp,
486 enum lu_cli_type type);
487int client_fid_fini(struct obd_device *obd);
488
489
490
491struct ldlm_namespace;
492
493
494
495
496
497
498
499
500static inline struct ldlm_res_id *
501fid_build_reg_res_name(const struct lu_fid *fid, struct ldlm_res_id *res)
502{
503 memset(res, 0, sizeof(*res));
504 res->name[LUSTRE_RES_ID_SEQ_OFF] = fid_seq(fid);
505 res->name[LUSTRE_RES_ID_VER_OID_OFF] = fid_ver_oid(fid);
506
507 return res;
508}
509
510
511
512
513static inline int fid_res_name_eq(const struct lu_fid *fid,
514 const struct ldlm_res_id *res)
515{
516 return res->name[LUSTRE_RES_ID_SEQ_OFF] == fid_seq(fid) &&
517 res->name[LUSTRE_RES_ID_VER_OID_OFF] == fid_ver_oid(fid);
518}
519
520
521
522
523static inline struct lu_fid *
524fid_extract_from_res_name(struct lu_fid *fid, const struct ldlm_res_id *res)
525{
526 fid->f_seq = res->name[LUSTRE_RES_ID_SEQ_OFF];
527 fid->f_oid = (__u32)(res->name[LUSTRE_RES_ID_VER_OID_OFF]);
528 fid->f_ver = (__u32)(res->name[LUSTRE_RES_ID_VER_OID_OFF] >> 32);
529 LASSERT(fid_res_name_eq(fid, res));
530
531 return fid;
532}
533
534
535
536
537static inline struct ldlm_res_id *
538fid_build_quota_res_name(const struct lu_fid *glb_fid, union lquota_id *qid,
539 struct ldlm_res_id *res)
540{
541 fid_build_reg_res_name(glb_fid, res);
542 res->name[LUSTRE_RES_ID_QUOTA_SEQ_OFF] = fid_seq(&qid->qid_fid);
543 res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF] = fid_ver_oid(&qid->qid_fid);
544
545 return res;
546}
547
548
549
550
551static inline void fid_extract_from_quota_res(struct lu_fid *glb_fid,
552 union lquota_id *qid,
553 const struct ldlm_res_id *res)
554{
555 fid_extract_from_res_name(glb_fid, res);
556 qid->qid_fid.f_seq = res->name[LUSTRE_RES_ID_QUOTA_SEQ_OFF];
557 qid->qid_fid.f_oid = (__u32)res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF];
558 qid->qid_fid.f_ver =
559 (__u32)(res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF] >> 32);
560}
561
562static inline struct ldlm_res_id *
563fid_build_pdo_res_name(const struct lu_fid *fid, unsigned int hash,
564 struct ldlm_res_id *res)
565{
566 fid_build_reg_res_name(fid, res);
567 res->name[LUSTRE_RES_ID_HSH_OFF] = hash;
568
569 return res;
570}
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590static inline void ostid_build_res_name(struct ost_id *oi,
591 struct ldlm_res_id *name)
592{
593 memset(name, 0, sizeof(*name));
594 if (fid_seq_is_mdt0(ostid_seq(oi))) {
595 name->name[LUSTRE_RES_ID_SEQ_OFF] = ostid_id(oi);
596 name->name[LUSTRE_RES_ID_VER_OID_OFF] = ostid_seq(oi);
597 } else {
598 fid_build_reg_res_name(&oi->oi_fid, name);
599 }
600}
601
602static inline void ostid_res_name_to_id(struct ost_id *oi,
603 struct ldlm_res_id *name)
604{
605 if (fid_seq_is_mdt0(name->name[LUSTRE_RES_ID_SEQ_OFF])) {
606
607 ostid_set_seq(oi, name->name[LUSTRE_RES_ID_VER_OID_OFF]);
608 ostid_set_id(oi, name->name[LUSTRE_RES_ID_SEQ_OFF]);
609 } else {
610
611 fid_extract_from_res_name(&oi->oi_fid, name);
612 }
613}
614
615
616
617
618static inline int ostid_res_name_eq(struct ost_id *oi,
619 struct ldlm_res_id *name)
620{
621
622
623 if (fid_seq_is_mdt0(ostid_seq(oi))) {
624 return name->name[LUSTRE_RES_ID_SEQ_OFF] == ostid_id(oi) &&
625 name->name[LUSTRE_RES_ID_VER_OID_OFF] == ostid_seq(oi);
626 } else {
627 return name->name[LUSTRE_RES_ID_SEQ_OFF] == ostid_seq(oi) &&
628 name->name[LUSTRE_RES_ID_VER_OID_OFF] == ostid_id(oi);
629 }
630}
631
632
633static inline void ost_fid_build_resid(const struct lu_fid *fid,
634 struct ldlm_res_id *resname)
635{
636 if (fid_is_mdt0(fid) || fid_is_idif(fid)) {
637 struct ost_id oi;
638 oi.oi.oi_id = 0;
639 if (fid_to_ostid(fid, &oi) != 0)
640 return;
641 ostid_build_res_name(&oi, resname);
642 } else {
643 fid_build_reg_res_name(fid, resname);
644 }
645}
646
647static inline void ost_fid_from_resid(struct lu_fid *fid,
648 const struct ldlm_res_id *name)
649{
650 if (fid_seq_is_mdt0(name->name[LUSTRE_RES_ID_VER_OID_OFF])) {
651
652 struct ost_id oi;
653 ostid_set_seq(&oi, name->name[LUSTRE_RES_ID_VER_OID_OFF]);
654 ostid_set_id(&oi, name->name[LUSTRE_RES_ID_SEQ_OFF]);
655 ostid_to_fid(fid, &oi, 0);
656 } else {
657
658 fid_extract_from_res_name(fid, name);
659 }
660}
661
662
663
664
665
666
667
668
669
670
671
672
673static inline __u64 fid_flatten(const struct lu_fid *fid)
674{
675 __u64 ino;
676 __u64 seq;
677
678 if (fid_is_igif(fid)) {
679 ino = lu_igif_ino(fid);
680 return ino;
681 }
682
683 seq = fid_seq(fid);
684
685 ino = (seq << 24) + ((seq >> 24) & 0xffffff0000ULL) + fid_oid(fid);
686
687 return ino ? ino : fid_oid(fid);
688}
689
690static inline __u32 fid_hash(const struct lu_fid *f, int bits)
691{
692
693
694 return cfs_hash_long(fid_flatten(f), bits);
695}
696
697
698
699static inline __u32 fid_flatten32(const struct lu_fid *fid)
700{
701 __u32 ino;
702 __u64 seq;
703
704 if (fid_is_igif(fid)) {
705 ino = lu_igif_ino(fid);
706 return ino;
707 }
708
709 seq = fid_seq(fid) - FID_SEQ_START;
710
711
712
713
714
715
716 ino = ((seq & 0x000fffffULL) << 12) + ((seq >> 8) & 0xfffff000) +
717 (seq >> (64 - (40-8)) & 0xffffff00) +
718 (fid_oid(fid) & 0xff000fff) + ((fid_oid(fid) & 0x00fff000) << 8);
719
720 return ino ? ino : fid_oid(fid);
721}
722
723static inline int lu_fid_diff(struct lu_fid *fid1, struct lu_fid *fid2)
724{
725 LASSERTF(fid_seq(fid1) == fid_seq(fid2), "fid1:"DFID", fid2:"DFID"\n",
726 PFID(fid1), PFID(fid2));
727
728 if (fid_is_idif(fid1) && fid_is_idif(fid2))
729 return fid_idif_id(fid1->f_seq, fid1->f_oid, fid1->f_ver) -
730 fid_idif_id(fid2->f_seq, fid2->f_oid, fid2->f_ver);
731
732 return fid_oid(fid1) - fid_oid(fid2);
733}
734
735#define LUSTRE_SEQ_SRV_NAME "seq_srv"
736#define LUSTRE_SEQ_CTL_NAME "seq_ctl"
737
738
739static inline void range_cpu_to_le(struct lu_seq_range *dst, const struct lu_seq_range *src)
740{
741 dst->lsr_start = cpu_to_le64(src->lsr_start);
742 dst->lsr_end = cpu_to_le64(src->lsr_end);
743 dst->lsr_index = cpu_to_le32(src->lsr_index);
744 dst->lsr_flags = cpu_to_le32(src->lsr_flags);
745}
746
747static inline void range_le_to_cpu(struct lu_seq_range *dst, const struct lu_seq_range *src)
748{
749 dst->lsr_start = le64_to_cpu(src->lsr_start);
750 dst->lsr_end = le64_to_cpu(src->lsr_end);
751 dst->lsr_index = le32_to_cpu(src->lsr_index);
752 dst->lsr_flags = le32_to_cpu(src->lsr_flags);
753}
754
755static inline void range_cpu_to_be(struct lu_seq_range *dst, const struct lu_seq_range *src)
756{
757 dst->lsr_start = cpu_to_be64(src->lsr_start);
758 dst->lsr_end = cpu_to_be64(src->lsr_end);
759 dst->lsr_index = cpu_to_be32(src->lsr_index);
760 dst->lsr_flags = cpu_to_be32(src->lsr_flags);
761}
762
763static inline void range_be_to_cpu(struct lu_seq_range *dst, const struct lu_seq_range *src)
764{
765 dst->lsr_start = be64_to_cpu(src->lsr_start);
766 dst->lsr_end = be64_to_cpu(src->lsr_end);
767 dst->lsr_index = be32_to_cpu(src->lsr_index);
768 dst->lsr_flags = be32_to_cpu(src->lsr_flags);
769}
770
771
772
773#endif
774