diff options
author | Mark Fasheh <mark.fasheh@oracle.com> | 2007-09-07 16:58:15 -0400 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2007-10-12 14:54:39 -0400 |
commit | 15b1e36bdb487d67ef924a37b0967453143be53a (patch) | |
tree | 448e955663c183a12f574f0e470e842d7722c1fb /fs/ocfs2/ocfs2_fs.h | |
parent | 8553cf4f360d6fc4913a0bdd3b22dd7b5bb9a3be (diff) |
ocfs2: Structure updates for inline data
Add the disk, network and memory structures needed to support data in inode.
Struct ocfs2_inline_data is defined and embedded in ocfs2_dinode for storing
inline data.
A new inode field, i_dyn_features, is added to facilitate tracking of
dynamic inode state. Since it will be used often, we want to mirror it on
ocfs2_inode_info, and transfer it via the meta data lvb.
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Reviewed-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs/ocfs2/ocfs2_fs.h')
-rw-r--r-- | fs/ocfs2/ocfs2_fs.h | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h index bf10a5453833..6ef876759a73 100644 --- a/fs/ocfs2/ocfs2_fs.h +++ b/fs/ocfs2/ocfs2_fs.h | |||
@@ -87,7 +87,8 @@ | |||
87 | 87 | ||
88 | #define OCFS2_FEATURE_COMPAT_SUPP OCFS2_FEATURE_COMPAT_BACKUP_SB | 88 | #define OCFS2_FEATURE_COMPAT_SUPP OCFS2_FEATURE_COMPAT_BACKUP_SB |
89 | #define OCFS2_FEATURE_INCOMPAT_SUPP (OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT \ | 89 | #define OCFS2_FEATURE_INCOMPAT_SUPP (OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT \ |
90 | | OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC) | 90 | | OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC \ |
91 | | OCFS2_FEATURE_INCOMPAT_INLINE_DATA) | ||
91 | #define OCFS2_FEATURE_RO_COMPAT_SUPP OCFS2_FEATURE_RO_COMPAT_UNWRITTEN | 92 | #define OCFS2_FEATURE_RO_COMPAT_SUPP OCFS2_FEATURE_RO_COMPAT_UNWRITTEN |
92 | 93 | ||
93 | /* | 94 | /* |
@@ -121,6 +122,9 @@ | |||
121 | */ | 122 | */ |
122 | #define OCFS2_FEATURE_INCOMPAT_TUNEFS_INPROG 0x0020 | 123 | #define OCFS2_FEATURE_INCOMPAT_TUNEFS_INPROG 0x0020 |
123 | 124 | ||
125 | /* Support for data packed into inode blocks */ | ||
126 | #define OCFS2_FEATURE_INCOMPAT_INLINE_DATA 0x0040 | ||
127 | |||
124 | /* | 128 | /* |
125 | * backup superblock flag is used to indicate that this volume | 129 | * backup superblock flag is used to indicate that this volume |
126 | * has backup superblocks. | 130 | * has backup superblocks. |
@@ -162,6 +166,17 @@ | |||
162 | #define OCFS2_CHAIN_FL (0x00000400) /* Chain allocator */ | 166 | #define OCFS2_CHAIN_FL (0x00000400) /* Chain allocator */ |
163 | #define OCFS2_DEALLOC_FL (0x00000800) /* Truncate log */ | 167 | #define OCFS2_DEALLOC_FL (0x00000800) /* Truncate log */ |
164 | 168 | ||
169 | /* | ||
170 | * Flags on ocfs2_dinode.i_dyn_features | ||
171 | * | ||
172 | * These can change much more often than i_flags. When adding flags, | ||
173 | * keep in mind that i_dyn_features is only 16 bits wide. | ||
174 | */ | ||
175 | #define OCFS2_INLINE_DATA_FL (0x0001) /* Data stored in inode block */ | ||
176 | #define OCFS2_HAS_XATTR_FL (0x0002) | ||
177 | #define OCFS2_INLINE_XATTR_FL (0x0004) | ||
178 | #define OCFS2_INDEXED_DIR_FL (0x0008) | ||
179 | |||
165 | /* Inode attributes, keep in sync with EXT2 */ | 180 | /* Inode attributes, keep in sync with EXT2 */ |
166 | #define OCFS2_SECRM_FL (0x00000001) /* Secure deletion */ | 181 | #define OCFS2_SECRM_FL (0x00000001) /* Secure deletion */ |
167 | #define OCFS2_UNRM_FL (0x00000002) /* Undelete */ | 182 | #define OCFS2_UNRM_FL (0x00000002) /* Undelete */ |
@@ -487,6 +502,19 @@ struct ocfs2_local_alloc | |||
487 | }; | 502 | }; |
488 | 503 | ||
489 | /* | 504 | /* |
505 | * Data-in-inode header. This is only used if i_dyn_features has | ||
506 | * OCFS2_INLINE_DATA_FL set. | ||
507 | */ | ||
508 | struct ocfs2_inline_data | ||
509 | { | ||
510 | /*00*/ __le16 id_count; /* Number of bytes that can be used | ||
511 | * for data, starting at id_data */ | ||
512 | __le16 id_reserved0; | ||
513 | __le32 id_reserved1; | ||
514 | __u8 id_data[0]; /* Start of user data */ | ||
515 | }; | ||
516 | |||
517 | /* | ||
490 | * On disk inode for OCFS2 | 518 | * On disk inode for OCFS2 |
491 | */ | 519 | */ |
492 | struct ocfs2_dinode { | 520 | struct ocfs2_dinode { |
@@ -518,7 +546,7 @@ struct ocfs2_dinode { | |||
518 | __le32 i_attr; | 546 | __le32 i_attr; |
519 | __le16 i_orphaned_slot; /* Only valid when OCFS2_ORPHANED_FL | 547 | __le16 i_orphaned_slot; /* Only valid when OCFS2_ORPHANED_FL |
520 | was set in i_flags */ | 548 | was set in i_flags */ |
521 | __le16 i_reserved1; | 549 | __le16 i_dyn_features; |
522 | /*70*/ __le64 i_reserved2[8]; | 550 | /*70*/ __le64 i_reserved2[8]; |
523 | /*B8*/ union { | 551 | /*B8*/ union { |
524 | __le64 i_pad1; /* Generic way to refer to this | 552 | __le64 i_pad1; /* Generic way to refer to this |
@@ -544,6 +572,7 @@ struct ocfs2_dinode { | |||
544 | struct ocfs2_chain_list i_chain; | 572 | struct ocfs2_chain_list i_chain; |
545 | struct ocfs2_extent_list i_list; | 573 | struct ocfs2_extent_list i_list; |
546 | struct ocfs2_truncate_log i_dealloc; | 574 | struct ocfs2_truncate_log i_dealloc; |
575 | struct ocfs2_inline_data i_data; | ||
547 | __u8 i_symlink[0]; | 576 | __u8 i_symlink[0]; |
548 | } id2; | 577 | } id2; |
549 | /* Actual on-disk size is one block */ | 578 | /* Actual on-disk size is one block */ |
@@ -593,6 +622,12 @@ static inline int ocfs2_fast_symlink_chars(struct super_block *sb) | |||
593 | offsetof(struct ocfs2_dinode, id2.i_symlink); | 622 | offsetof(struct ocfs2_dinode, id2.i_symlink); |
594 | } | 623 | } |
595 | 624 | ||
625 | static inline int ocfs2_max_inline_data(struct super_block *sb) | ||
626 | { | ||
627 | return sb->s_blocksize - | ||
628 | offsetof(struct ocfs2_dinode, id2.i_data.id_data); | ||
629 | } | ||
630 | |||
596 | static inline int ocfs2_extent_recs_per_inode(struct super_block *sb) | 631 | static inline int ocfs2_extent_recs_per_inode(struct super_block *sb) |
597 | { | 632 | { |
598 | int size; | 633 | int size; |
@@ -672,6 +707,11 @@ static inline int ocfs2_fast_symlink_chars(int blocksize) | |||
672 | return blocksize - offsetof(struct ocfs2_dinode, id2.i_symlink); | 707 | return blocksize - offsetof(struct ocfs2_dinode, id2.i_symlink); |
673 | } | 708 | } |
674 | 709 | ||
710 | static inline int ocfs2_max_inline_data(int blocksize) | ||
711 | { | ||
712 | return blocksize - offsetof(struct ocfs2_dinode, id2.i_data.id_data); | ||
713 | } | ||
714 | |||
675 | static inline int ocfs2_extent_recs_per_inode(int blocksize) | 715 | static inline int ocfs2_extent_recs_per_inode(int blocksize) |
676 | { | 716 | { |
677 | int size; | 717 | int size; |