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 _LINUX_NILFS_FS_H
39#define _LINUX_NILFS_FS_H
40
41#include <linux/types.h>
42#include <linux/ioctl.h>
43#include <linux/magic.h>
44#include <linux/bug.h>
45
46
47#define NILFS_INODE_BMAP_SIZE 7
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66struct nilfs_inode {
67 __le64 i_blocks;
68 __le64 i_size;
69 __le64 i_ctime;
70 __le64 i_mtime;
71 __le32 i_ctime_nsec;
72 __le32 i_mtime_nsec;
73 __le32 i_uid;
74 __le32 i_gid;
75 __le16 i_mode;
76 __le16 i_links_count;
77 __le32 i_flags;
78 __le64 i_bmap[NILFS_INODE_BMAP_SIZE];
79#define i_device_code i_bmap[0]
80 __le64 i_xattr;
81 __le32 i_generation;
82 __le32 i_pad;
83};
84
85
86
87
88
89
90
91
92
93
94
95struct nilfs_super_root {
96 __le32 sr_sum;
97 __le16 sr_bytes;
98 __le16 sr_flags;
99 __le64 sr_nongc_ctime;
100 struct nilfs_inode sr_dat;
101 struct nilfs_inode sr_cpfile;
102 struct nilfs_inode sr_sufile;
103};
104
105#define NILFS_SR_MDT_OFFSET(inode_size, i) \
106 ((unsigned long)&((struct nilfs_super_root *)0)->sr_dat + \
107 (inode_size) * (i))
108#define NILFS_SR_DAT_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 0)
109#define NILFS_SR_CPFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 1)
110#define NILFS_SR_SUFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 2)
111#define NILFS_SR_BYTES(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 3)
112
113
114
115
116#define NILFS_DFL_MAX_MNT_COUNT 50
117
118
119
120
121#define NILFS_VALID_FS 0x0001
122#define NILFS_ERROR_FS 0x0002
123#define NILFS_RESIZE_FS 0x0004
124
125
126
127
128#define NILFS_MOUNT_ERROR_MODE 0x0070
129#define NILFS_MOUNT_ERRORS_CONT 0x0010
130#define NILFS_MOUNT_ERRORS_RO 0x0020
131#define NILFS_MOUNT_ERRORS_PANIC 0x0040
132#define NILFS_MOUNT_BARRIER 0x1000
133#define NILFS_MOUNT_STRICT_ORDER 0x2000
134
135#define NILFS_MOUNT_NORECOVERY 0x4000
136
137#define NILFS_MOUNT_DISCARD 0x8000
138
139
140
141
142
143struct nilfs_super_block {
144 __le32 s_rev_level;
145 __le16 s_minor_rev_level;
146 __le16 s_magic;
147
148 __le16 s_bytes;
149
150
151 __le16 s_flags;
152 __le32 s_crc_seed;
153 __le32 s_sum;
154
155 __le32 s_log_block_size;
156
157
158 __le64 s_nsegments;
159 __le64 s_dev_size;
160 __le64 s_first_data_block;
161 __le32 s_blocks_per_segment;
162 __le32 s_r_segments_percentage;
163
164 __le64 s_last_cno;
165 __le64 s_last_pseg;
166 __le64 s_last_seq;
167 __le64 s_free_blocks_count;
168
169 __le64 s_ctime;
170
171 __le64 s_mtime;
172 __le64 s_wtime;
173 __le16 s_mnt_count;
174 __le16 s_max_mnt_count;
175 __le16 s_state;
176 __le16 s_errors;
177 __le64 s_lastcheck;
178
179 __le32 s_checkinterval;
180 __le32 s_creator_os;
181 __le16 s_def_resuid;
182 __le16 s_def_resgid;
183 __le32 s_first_ino;
184
185 __le16 s_inode_size;
186 __le16 s_dat_entry_size;
187 __le16 s_checkpoint_size;
188 __le16 s_segment_usage_size;
189
190 __u8 s_uuid[16];
191 char s_volume_name[80];
192
193 __le32 s_c_interval;
194 __le32 s_c_block_max;
195
196 __le64 s_feature_compat;
197 __le64 s_feature_compat_ro;
198 __le64 s_feature_incompat;
199 __u32 s_reserved[186];
200};
201
202
203
204
205#define NILFS_OS_LINUX 0
206
207
208
209
210
211#define NILFS_CURRENT_REV 2
212#define NILFS_MINOR_REV 0
213#define NILFS_MIN_SUPP_REV 2
214
215
216
217
218
219
220
221#define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT 0x00000001ULL
222
223#define NILFS_FEATURE_COMPAT_SUPP 0ULL
224#define NILFS_FEATURE_COMPAT_RO_SUPP NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT
225#define NILFS_FEATURE_INCOMPAT_SUPP 0ULL
226
227
228
229
230#define NILFS_SB_BYTES \
231 ((long)&((struct nilfs_super_block *)0)->s_reserved)
232
233
234
235
236#define NILFS_ROOT_INO 2
237#define NILFS_DAT_INO 3
238#define NILFS_CPFILE_INO 4
239#define NILFS_SUFILE_INO 5
240#define NILFS_IFILE_INO 6
241#define NILFS_ATIME_INO 7
242#define NILFS_XATTR_INO 8
243#define NILFS_SKETCH_INO 10
244#define NILFS_USER_INO 11
245
246#define NILFS_SB_OFFSET_BYTES 1024
247
248#define NILFS_SEG_MIN_BLOCKS 16
249
250#define NILFS_PSEG_MIN_BLOCKS 2
251
252#define NILFS_MIN_NRSVSEGS 8
253
254
255
256
257
258
259
260#define NILFS_ROOT_METADATA_FILE(ino) \
261 ((ino) >= NILFS_DAT_INO && (ino) <= NILFS_SUFILE_INO)
262
263
264
265
266#define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12)
267
268
269
270
271#define NILFS_LINK_MAX 32000
272
273
274
275
276
277
278#define NILFS_NAME_LEN 255
279
280
281
282
283#define NILFS_MIN_BLOCK_SIZE 1024
284#define NILFS_MAX_BLOCK_SIZE 65536
285
286
287
288
289
290
291
292struct nilfs_dir_entry {
293 __le64 inode;
294 __le16 rec_len;
295 __u8 name_len;
296 __u8 file_type;
297 char name[NILFS_NAME_LEN];
298 char pad;
299};
300
301
302
303
304
305enum {
306 NILFS_FT_UNKNOWN,
307 NILFS_FT_REG_FILE,
308 NILFS_FT_DIR,
309 NILFS_FT_CHRDEV,
310 NILFS_FT_BLKDEV,
311 NILFS_FT_FIFO,
312 NILFS_FT_SOCK,
313 NILFS_FT_SYMLINK,
314 NILFS_FT_MAX
315};
316
317
318
319
320
321
322#define NILFS_DIR_PAD 8
323#define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1)
324#define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \
325 ~NILFS_DIR_ROUND)
326#define NILFS_MAX_REC_LEN ((1<<16)-1)
327
328static inline unsigned nilfs_rec_len_from_disk(__le16 dlen)
329{
330 unsigned len = le16_to_cpu(dlen);
331
332#if !defined(__KERNEL__) || (PAGE_CACHE_SIZE >= 65536)
333 if (len == NILFS_MAX_REC_LEN)
334 return 1 << 16;
335#endif
336 return len;
337}
338
339static inline __le16 nilfs_rec_len_to_disk(unsigned len)
340{
341#if !defined(__KERNEL__) || (PAGE_CACHE_SIZE >= 65536)
342 if (len == (1 << 16))
343 return cpu_to_le16(NILFS_MAX_REC_LEN);
344 else if (len > (1 << 16))
345 BUG();
346#endif
347 return cpu_to_le16(len);
348}
349
350
351
352
353
354
355
356
357struct nilfs_finfo {
358 __le64 fi_ino;
359 __le64 fi_cno;
360 __le32 fi_nblocks;
361 __le32 fi_ndatablk;
362
363};
364
365
366
367
368
369
370struct nilfs_binfo_v {
371 __le64 bi_vblocknr;
372 __le64 bi_blkoff;
373};
374
375
376
377
378
379
380
381struct nilfs_binfo_dat {
382 __le64 bi_blkoff;
383 __u8 bi_level;
384 __u8 bi_pad[7];
385};
386
387
388
389
390
391
392union nilfs_binfo {
393 struct nilfs_binfo_v bi_v;
394 struct nilfs_binfo_dat bi_dat;
395};
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413struct nilfs_segment_summary {
414 __le32 ss_datasum;
415 __le32 ss_sumsum;
416 __le32 ss_magic;
417 __le16 ss_bytes;
418 __le16 ss_flags;
419 __le64 ss_seq;
420 __le64 ss_create;
421 __le64 ss_next;
422 __le32 ss_nblocks;
423 __le32 ss_nfinfo;
424 __le32 ss_sumbytes;
425 __le32 ss_pad;
426 __le64 ss_cno;
427
428};
429
430#define NILFS_SEGSUM_MAGIC 0x1eaffa11
431
432
433
434
435#define NILFS_SS_LOGBGN 0x0001
436#define NILFS_SS_LOGEND 0x0002
437#define NILFS_SS_SR 0x0004
438#define NILFS_SS_SYNDT 0x0008
439#define NILFS_SS_GC 0x0010
440
441
442
443
444
445
446
447
448struct nilfs_btree_node {
449 __u8 bn_flags;
450 __u8 bn_level;
451 __le16 bn_nchildren;
452 __le32 bn_pad;
453};
454
455
456#define NILFS_BTREE_NODE_ROOT 0x01
457
458
459#define NILFS_BTREE_LEVEL_DATA 0
460#define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1)
461#define NILFS_BTREE_LEVEL_MAX 14
462
463
464
465
466
467struct nilfs_palloc_group_desc {
468 __le32 pg_nfrees;
469};
470
471
472
473
474
475
476
477
478struct nilfs_dat_entry {
479 __le64 de_blocknr;
480 __le64 de_start;
481 __le64 de_end;
482 __le64 de_rsv;
483};
484
485
486
487
488
489
490struct nilfs_snapshot_list {
491 __le64 ssl_next;
492 __le64 ssl_prev;
493};
494
495
496
497
498
499
500
501
502
503
504
505
506
507struct nilfs_checkpoint {
508 __le32 cp_flags;
509 __le32 cp_checkpoints_count;
510 struct nilfs_snapshot_list cp_snapshot_list;
511 __le64 cp_cno;
512 __le64 cp_create;
513 __le64 cp_nblk_inc;
514 __le64 cp_inodes_count;
515 __le64 cp_blocks_count;
516
517
518
519
520 struct nilfs_inode cp_ifile_inode;
521};
522
523
524enum {
525 NILFS_CHECKPOINT_SNAPSHOT,
526 NILFS_CHECKPOINT_INVALID,
527 NILFS_CHECKPOINT_SKETCH,
528 NILFS_CHECKPOINT_MINOR,
529};
530
531#define NILFS_CHECKPOINT_FNS(flag, name) \
532static inline void \
533nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \
534{ \
535 cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) | \
536 (1UL << NILFS_CHECKPOINT_##flag)); \
537} \
538static inline void \
539nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \
540{ \
541 cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) & \
542 ~(1UL << NILFS_CHECKPOINT_##flag)); \
543} \
544static inline int \
545nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \
546{ \
547 return !!(le32_to_cpu(cp->cp_flags) & \
548 (1UL << NILFS_CHECKPOINT_##flag)); \
549}
550
551NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot)
552NILFS_CHECKPOINT_FNS(INVALID, invalid)
553NILFS_CHECKPOINT_FNS(MINOR, minor)
554
555
556
557
558
559
560
561
562
563
564
565
566struct nilfs_cpinfo {
567 __u32 ci_flags;
568 __u32 ci_pad;
569 __u64 ci_cno;
570 __u64 ci_create;
571 __u64 ci_nblk_inc;
572 __u64 ci_inodes_count;
573 __u64 ci_blocks_count;
574 __u64 ci_next;
575};
576
577#define NILFS_CPINFO_FNS(flag, name) \
578static inline int \
579nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo) \
580{ \
581 return !!(cpinfo->ci_flags & (1UL << NILFS_CHECKPOINT_##flag)); \
582}
583
584NILFS_CPINFO_FNS(SNAPSHOT, snapshot)
585NILFS_CPINFO_FNS(INVALID, invalid)
586NILFS_CPINFO_FNS(MINOR, minor)
587
588
589
590
591
592
593
594
595struct nilfs_cpfile_header {
596 __le64 ch_ncheckpoints;
597 __le64 ch_nsnapshots;
598 struct nilfs_snapshot_list ch_snapshot_list;
599};
600
601#define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \
602 ((sizeof(struct nilfs_cpfile_header) + \
603 sizeof(struct nilfs_checkpoint) - 1) / \
604 sizeof(struct nilfs_checkpoint))
605
606
607
608
609
610
611
612struct nilfs_segment_usage {
613 __le64 su_lastmod;
614 __le32 su_nblocks;
615 __le32 su_flags;
616};
617
618
619enum {
620 NILFS_SEGMENT_USAGE_ACTIVE,
621 NILFS_SEGMENT_USAGE_DIRTY,
622 NILFS_SEGMENT_USAGE_ERROR,
623
624
625};
626
627#define NILFS_SEGMENT_USAGE_FNS(flag, name) \
628static inline void \
629nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \
630{ \
631 su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) | \
632 (1UL << NILFS_SEGMENT_USAGE_##flag));\
633} \
634static inline void \
635nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \
636{ \
637 su->su_flags = \
638 cpu_to_le32(le32_to_cpu(su->su_flags) & \
639 ~(1UL << NILFS_SEGMENT_USAGE_##flag)); \
640} \
641static inline int \
642nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \
643{ \
644 return !!(le32_to_cpu(su->su_flags) & \
645 (1UL << NILFS_SEGMENT_USAGE_##flag)); \
646}
647
648NILFS_SEGMENT_USAGE_FNS(ACTIVE, active)
649NILFS_SEGMENT_USAGE_FNS(DIRTY, dirty)
650NILFS_SEGMENT_USAGE_FNS(ERROR, error)
651
652static inline void
653nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su)
654{
655 su->su_lastmod = cpu_to_le64(0);
656 su->su_nblocks = cpu_to_le32(0);
657 su->su_flags = cpu_to_le32(0);
658}
659
660static inline int
661nilfs_segment_usage_clean(const struct nilfs_segment_usage *su)
662{
663 return !le32_to_cpu(su->su_flags);
664}
665
666
667
668
669
670
671
672struct nilfs_sufile_header {
673 __le64 sh_ncleansegs;
674 __le64 sh_ndirtysegs;
675 __le64 sh_last_alloc;
676
677};
678
679#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \
680 ((sizeof(struct nilfs_sufile_header) + \
681 sizeof(struct nilfs_segment_usage) - 1) / \
682 sizeof(struct nilfs_segment_usage))
683
684
685
686
687
688
689
690struct nilfs_suinfo {
691 __u64 sui_lastmod;
692 __u32 sui_nblocks;
693 __u32 sui_flags;
694};
695
696#define NILFS_SUINFO_FNS(flag, name) \
697static inline int \
698nilfs_suinfo_##name(const struct nilfs_suinfo *si) \
699{ \
700 return si->sui_flags & (1UL << NILFS_SEGMENT_USAGE_##flag); \
701}
702
703NILFS_SUINFO_FNS(ACTIVE, active)
704NILFS_SUINFO_FNS(DIRTY, dirty)
705NILFS_SUINFO_FNS(ERROR, error)
706
707static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si)
708{
709 return !si->sui_flags;
710}
711
712
713enum {
714 NILFS_CHECKPOINT,
715 NILFS_SNAPSHOT,
716};
717
718
719
720
721
722
723
724struct nilfs_cpmode {
725 __u64 cm_cno;
726 __u32 cm_mode;
727 __u32 cm_pad;
728};
729
730
731
732
733
734
735
736
737
738struct nilfs_argv {
739 __u64 v_base;
740 __u32 v_nmembs;
741 __u16 v_size;
742 __u16 v_flags;
743 __u64 v_index;
744};
745
746
747
748
749
750
751struct nilfs_period {
752 __u64 p_start;
753 __u64 p_end;
754};
755
756
757
758
759
760
761
762struct nilfs_cpstat {
763 __u64 cs_cno;
764 __u64 cs_ncps;
765 __u64 cs_nsss;
766};
767
768
769
770
771
772
773
774
775
776
777struct nilfs_sustat {
778 __u64 ss_nsegs;
779 __u64 ss_ncleansegs;
780 __u64 ss_ndirtysegs;
781 __u64 ss_ctime;
782 __u64 ss_nongc_ctime;
783 __u64 ss_prot_seq;
784};
785
786
787
788
789
790
791
792
793struct nilfs_vinfo {
794 __u64 vi_vblocknr;
795 __u64 vi_start;
796 __u64 vi_end;
797 __u64 vi_blocknr;
798};
799
800
801
802
803
804
805
806
807
808
809
810
811struct nilfs_vdesc {
812 __u64 vd_ino;
813 __u64 vd_cno;
814 __u64 vd_vblocknr;
815 struct nilfs_period vd_period;
816 __u64 vd_blocknr;
817 __u64 vd_offset;
818 __u32 vd_flags;
819 __u32 vd_pad;
820};
821
822
823
824
825
826
827
828
829
830
831struct nilfs_bdesc {
832 __u64 bd_ino;
833 __u64 bd_oblocknr;
834 __u64 bd_blocknr;
835 __u64 bd_offset;
836 __u32 bd_level;
837 __u32 bd_pad;
838};
839
840#define NILFS_IOCTL_IDENT 'n'
841
842#define NILFS_IOCTL_CHANGE_CPMODE \
843 _IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode)
844#define NILFS_IOCTL_DELETE_CHECKPOINT \
845 _IOW(NILFS_IOCTL_IDENT, 0x81, __u64)
846#define NILFS_IOCTL_GET_CPINFO \
847 _IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv)
848#define NILFS_IOCTL_GET_CPSTAT \
849 _IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat)
850#define NILFS_IOCTL_GET_SUINFO \
851 _IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv)
852#define NILFS_IOCTL_GET_SUSTAT \
853 _IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat)
854#define NILFS_IOCTL_GET_VINFO \
855 _IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv)
856#define NILFS_IOCTL_GET_BDESCS \
857 _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv)
858#define NILFS_IOCTL_CLEAN_SEGMENTS \
859 _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5])
860#define NILFS_IOCTL_SYNC \
861 _IOR(NILFS_IOCTL_IDENT, 0x8A, __u64)
862#define NILFS_IOCTL_RESIZE \
863 _IOW(NILFS_IOCTL_IDENT, 0x8B, __u64)
864#define NILFS_IOCTL_SET_ALLOC_RANGE \
865 _IOW(NILFS_IOCTL_IDENT, 0x8C, __u64[2])
866
867#endif
868