diff options
Diffstat (limited to 'fs/ocfs2/ocfs2_fs.h')
-rw-r--r-- | fs/ocfs2/ocfs2_fs.h | 107 |
1 files changed, 103 insertions, 4 deletions
diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h index 7ab6e9e5e77c..e9431e4a5e7c 100644 --- a/fs/ocfs2/ocfs2_fs.h +++ b/fs/ocfs2/ocfs2_fs.h | |||
@@ -68,6 +68,7 @@ | |||
68 | #define OCFS2_DIR_TRAILER_SIGNATURE "DIRTRL1" | 68 | #define OCFS2_DIR_TRAILER_SIGNATURE "DIRTRL1" |
69 | #define OCFS2_DX_ROOT_SIGNATURE "DXDIR01" | 69 | #define OCFS2_DX_ROOT_SIGNATURE "DXDIR01" |
70 | #define OCFS2_DX_LEAF_SIGNATURE "DXLEAF1" | 70 | #define OCFS2_DX_LEAF_SIGNATURE "DXLEAF1" |
71 | #define OCFS2_REFCOUNT_BLOCK_SIGNATURE "REFCNT1" | ||
71 | 72 | ||
72 | /* Compatibility flags */ | 73 | /* Compatibility flags */ |
73 | #define OCFS2_HAS_COMPAT_FEATURE(sb,mask) \ | 74 | #define OCFS2_HAS_COMPAT_FEATURE(sb,mask) \ |
@@ -98,7 +99,8 @@ | |||
98 | | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \ | 99 | | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \ |
99 | | OCFS2_FEATURE_INCOMPAT_XATTR \ | 100 | | OCFS2_FEATURE_INCOMPAT_XATTR \ |
100 | | OCFS2_FEATURE_INCOMPAT_META_ECC \ | 101 | | OCFS2_FEATURE_INCOMPAT_META_ECC \ |
101 | | OCFS2_FEATURE_INCOMPAT_INDEXED_DIRS) | 102 | | OCFS2_FEATURE_INCOMPAT_INDEXED_DIRS \ |
103 | | OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE) | ||
102 | #define OCFS2_FEATURE_RO_COMPAT_SUPP (OCFS2_FEATURE_RO_COMPAT_UNWRITTEN \ | 104 | #define OCFS2_FEATURE_RO_COMPAT_SUPP (OCFS2_FEATURE_RO_COMPAT_UNWRITTEN \ |
103 | | OCFS2_FEATURE_RO_COMPAT_USRQUOTA \ | 105 | | OCFS2_FEATURE_RO_COMPAT_USRQUOTA \ |
104 | | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA) | 106 | | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA) |
@@ -160,6 +162,9 @@ | |||
160 | /* Metadata checksum and error correction */ | 162 | /* Metadata checksum and error correction */ |
161 | #define OCFS2_FEATURE_INCOMPAT_META_ECC 0x0800 | 163 | #define OCFS2_FEATURE_INCOMPAT_META_ECC 0x0800 |
162 | 164 | ||
165 | /* Refcount tree support */ | ||
166 | #define OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE 0x1000 | ||
167 | |||
163 | /* | 168 | /* |
164 | * backup superblock flag is used to indicate that this volume | 169 | * backup superblock flag is used to indicate that this volume |
165 | * has backup superblocks. | 170 | * has backup superblocks. |
@@ -223,6 +228,7 @@ | |||
223 | #define OCFS2_HAS_XATTR_FL (0x0002) | 228 | #define OCFS2_HAS_XATTR_FL (0x0002) |
224 | #define OCFS2_INLINE_XATTR_FL (0x0004) | 229 | #define OCFS2_INLINE_XATTR_FL (0x0004) |
225 | #define OCFS2_INDEXED_DIR_FL (0x0008) | 230 | #define OCFS2_INDEXED_DIR_FL (0x0008) |
231 | #define OCFS2_HAS_REFCOUNT_FL (0x0010) | ||
226 | 232 | ||
227 | /* Inode attributes, keep in sync with EXT2 */ | 233 | /* Inode attributes, keep in sync with EXT2 */ |
228 | #define OCFS2_SECRM_FL (0x00000001) /* Secure deletion */ | 234 | #define OCFS2_SECRM_FL (0x00000001) /* Secure deletion */ |
@@ -241,8 +247,11 @@ | |||
241 | /* | 247 | /* |
242 | * Extent record flags (e_node.leaf.flags) | 248 | * Extent record flags (e_node.leaf.flags) |
243 | */ | 249 | */ |
244 | #define OCFS2_EXT_UNWRITTEN (0x01) /* Extent is allocated but | 250 | #define OCFS2_EXT_UNWRITTEN (0x01) /* Extent is allocated but |
245 | * unwritten */ | 251 | * unwritten */ |
252 | #define OCFS2_EXT_REFCOUNTED (0x02) /* Extent is reference | ||
253 | * counted in an associated | ||
254 | * refcount tree */ | ||
246 | 255 | ||
247 | /* | 256 | /* |
248 | * ioctl commands | 257 | * ioctl commands |
@@ -292,6 +301,15 @@ struct ocfs2_new_group_input { | |||
292 | #define OCFS2_IOC_GROUP_ADD _IOW('o', 2,struct ocfs2_new_group_input) | 301 | #define OCFS2_IOC_GROUP_ADD _IOW('o', 2,struct ocfs2_new_group_input) |
293 | #define OCFS2_IOC_GROUP_ADD64 _IOW('o', 3,struct ocfs2_new_group_input) | 302 | #define OCFS2_IOC_GROUP_ADD64 _IOW('o', 3,struct ocfs2_new_group_input) |
294 | 303 | ||
304 | /* Used to pass 2 file names to reflink. */ | ||
305 | struct reflink_arguments { | ||
306 | __u64 old_path; | ||
307 | __u64 new_path; | ||
308 | __u64 preserve; | ||
309 | }; | ||
310 | #define OCFS2_IOC_REFLINK _IOW('o', 4, struct reflink_arguments) | ||
311 | |||
312 | |||
295 | /* | 313 | /* |
296 | * Journal Flags (ocfs2_dinode.id1.journal1.i_flags) | 314 | * Journal Flags (ocfs2_dinode.id1.journal1.i_flags) |
297 | */ | 315 | */ |
@@ -717,7 +735,8 @@ struct ocfs2_dinode { | |||
717 | __le64 i_xattr_loc; | 735 | __le64 i_xattr_loc; |
718 | /*80*/ struct ocfs2_block_check i_check; /* Error checking */ | 736 | /*80*/ struct ocfs2_block_check i_check; /* Error checking */ |
719 | /*88*/ __le64 i_dx_root; /* Pointer to dir index root block */ | 737 | /*88*/ __le64 i_dx_root; /* Pointer to dir index root block */ |
720 | __le64 i_reserved2[5]; | 738 | /*90*/ __le64 i_refcount_loc; |
739 | __le64 i_reserved2[4]; | ||
721 | /*B8*/ union { | 740 | /*B8*/ union { |
722 | __le64 i_pad1; /* Generic way to refer to this | 741 | __le64 i_pad1; /* Generic way to refer to this |
723 | 64bit union */ | 742 | 64bit union */ |
@@ -901,6 +920,60 @@ struct ocfs2_group_desc | |||
901 | /*40*/ __u8 bg_bitmap[0]; | 920 | /*40*/ __u8 bg_bitmap[0]; |
902 | }; | 921 | }; |
903 | 922 | ||
923 | struct ocfs2_refcount_rec { | ||
924 | /*00*/ __le64 r_cpos; /* Physical offset, in clusters */ | ||
925 | __le32 r_clusters; /* Clusters covered by this extent */ | ||
926 | __le32 r_refcount; /* Reference count of this extent */ | ||
927 | /*10*/ | ||
928 | }; | ||
929 | #define OCFS2_32BIT_POS_MASK (0xffffffffULL) | ||
930 | |||
931 | #define OCFS2_REFCOUNT_LEAF_FL (0x00000001) | ||
932 | #define OCFS2_REFCOUNT_TREE_FL (0x00000002) | ||
933 | |||
934 | struct ocfs2_refcount_list { | ||
935 | /*00*/ __le16 rl_count; /* Maximum number of entries possible | ||
936 | in rl_records */ | ||
937 | __le16 rl_used; /* Current number of used records */ | ||
938 | __le32 rl_reserved2; | ||
939 | __le64 rl_reserved1; /* Pad to sizeof(ocfs2_refcount_record) */ | ||
940 | /*10*/ struct ocfs2_refcount_rec rl_recs[0]; /* Refcount records */ | ||
941 | }; | ||
942 | |||
943 | |||
944 | struct ocfs2_refcount_block { | ||
945 | /*00*/ __u8 rf_signature[8]; /* Signature for verification */ | ||
946 | __le16 rf_suballoc_slot; /* Slot suballocator this block | ||
947 | belongs to */ | ||
948 | __le16 rf_suballoc_bit; /* Bit offset in suballocator | ||
949 | block group */ | ||
950 | __le32 rf_fs_generation; /* Must match superblock */ | ||
951 | /*10*/ __le64 rf_blkno; /* Offset on disk, in blocks */ | ||
952 | __le64 rf_parent; /* Parent block, only valid if | ||
953 | OCFS2_REFCOUNT_LEAF_FL is set in | ||
954 | rf_flags */ | ||
955 | /*20*/ struct ocfs2_block_check rf_check; /* Error checking */ | ||
956 | __le64 rf_last_eb_blk; /* Pointer to last extent block */ | ||
957 | /*30*/ __le32 rf_count; /* Number of inodes sharing this | ||
958 | refcount tree */ | ||
959 | __le32 rf_flags; /* See the flags above */ | ||
960 | __le32 rf_clusters; /* clusters covered by refcount tree. */ | ||
961 | __le32 rf_cpos; /* cluster offset in refcount tree.*/ | ||
962 | /*40*/ __le32 rf_generation; /* generation number. all be the same | ||
963 | * for the same refcount tree. */ | ||
964 | __le32 rf_reserved0; | ||
965 | __le64 rf_reserved1[7]; | ||
966 | /*80*/ union { | ||
967 | struct ocfs2_refcount_list rf_records; /* List of refcount | ||
968 | records */ | ||
969 | struct ocfs2_extent_list rf_list; /* Extent record list, | ||
970 | only valid if | ||
971 | OCFS2_REFCOUNT_TREE_FL | ||
972 | is set in rf_flags */ | ||
973 | }; | ||
974 | /* Actual on-disk size is one block */ | ||
975 | }; | ||
976 | |||
904 | /* | 977 | /* |
905 | * On disk extended attribute structure for OCFS2. | 978 | * On disk extended attribute structure for OCFS2. |
906 | */ | 979 | */ |
@@ -1312,6 +1385,32 @@ static inline u16 ocfs2_xattr_recs_per_xb(struct super_block *sb) | |||
1312 | 1385 | ||
1313 | return size / sizeof(struct ocfs2_extent_rec); | 1386 | return size / sizeof(struct ocfs2_extent_rec); |
1314 | } | 1387 | } |
1388 | |||
1389 | static inline u16 ocfs2_extent_recs_per_rb(struct super_block *sb) | ||
1390 | { | ||
1391 | int size; | ||
1392 | |||
1393 | size = sb->s_blocksize - | ||
1394 | offsetof(struct ocfs2_refcount_block, rf_list.l_recs); | ||
1395 | |||
1396 | return size / sizeof(struct ocfs2_extent_rec); | ||
1397 | } | ||
1398 | |||
1399 | static inline u16 ocfs2_refcount_recs_per_rb(struct super_block *sb) | ||
1400 | { | ||
1401 | int size; | ||
1402 | |||
1403 | size = sb->s_blocksize - | ||
1404 | offsetof(struct ocfs2_refcount_block, rf_records.rl_recs); | ||
1405 | |||
1406 | return size / sizeof(struct ocfs2_refcount_rec); | ||
1407 | } | ||
1408 | |||
1409 | static inline u32 | ||
1410 | ocfs2_get_ref_rec_low_cpos(const struct ocfs2_refcount_rec *rec) | ||
1411 | { | ||
1412 | return le64_to_cpu(rec->r_cpos) & OCFS2_32BIT_POS_MASK; | ||
1413 | } | ||
1315 | #else | 1414 | #else |
1316 | static inline int ocfs2_fast_symlink_chars(int blocksize) | 1415 | static inline int ocfs2_fast_symlink_chars(int blocksize) |
1317 | { | 1416 | { |