]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/ocfs2/ocfs2_fs.h
ocfs2: Structure updates for inline data
[linux-2.6-omap-h63xx.git] / fs / ocfs2 / ocfs2_fs.h
index bf10a545383318b06feffa9902abcc3313761b02..6ef876759a737eb098d7abbf70e87d69663114f9 100644 (file)
@@ -87,7 +87,8 @@
 
 #define OCFS2_FEATURE_COMPAT_SUPP      OCFS2_FEATURE_COMPAT_BACKUP_SB
 #define OCFS2_FEATURE_INCOMPAT_SUPP    (OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT \
-                                        | OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC)
+                                        | OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC \
+                                        | OCFS2_FEATURE_INCOMPAT_INLINE_DATA)
 #define OCFS2_FEATURE_RO_COMPAT_SUPP   OCFS2_FEATURE_RO_COMPAT_UNWRITTEN
 
 /*
  */
 #define OCFS2_FEATURE_INCOMPAT_TUNEFS_INPROG   0x0020
 
+/* Support for data packed into inode blocks */
+#define OCFS2_FEATURE_INCOMPAT_INLINE_DATA     0x0040
+
 /*
  * backup superblock flag is used to indicate that this volume
  * has backup superblocks.
 #define OCFS2_CHAIN_FL         (0x00000400)    /* Chain allocator */
 #define OCFS2_DEALLOC_FL       (0x00000800)    /* Truncate log */
 
+/*
+ * Flags on ocfs2_dinode.i_dyn_features
+ *
+ * These can change much more often than i_flags. When adding flags,
+ * keep in mind that i_dyn_features is only 16 bits wide.
+ */
+#define OCFS2_INLINE_DATA_FL   (0x0001)        /* Data stored in inode block */
+#define OCFS2_HAS_XATTR_FL     (0x0002)
+#define OCFS2_INLINE_XATTR_FL  (0x0004)
+#define OCFS2_INDEXED_DIR_FL   (0x0008)
+
 /* Inode attributes, keep in sync with EXT2 */
 #define OCFS2_SECRM_FL         (0x00000001)    /* Secure deletion */
 #define OCFS2_UNRM_FL          (0x00000002)    /* Undelete */
@@ -486,6 +501,19 @@ struct ocfs2_local_alloc
 /*10*/ __u8   la_bitmap[0];
 };
 
+/*
+ * Data-in-inode header. This is only used if i_dyn_features has
+ * OCFS2_INLINE_DATA_FL set.
+ */
+struct ocfs2_inline_data
+{
+/*00*/ __le16  id_count;       /* Number of bytes that can be used
+                                * for data, starting at id_data */
+       __le16  id_reserved0;
+       __le32  id_reserved1;
+       __u8    id_data[0];     /* Start of user data */
+};
+
 /*
  * On disk inode for OCFS2
  */
@@ -518,7 +546,7 @@ struct ocfs2_dinode {
        __le32 i_attr;
        __le16 i_orphaned_slot;         /* Only valid when OCFS2_ORPHANED_FL
                                           was set in i_flags */
-       __le16 i_reserved1;
+       __le16 i_dyn_features;
 /*70*/ __le64 i_reserved2[8];
 /*B8*/ union {
                __le64 i_pad1;          /* Generic way to refer to this
@@ -544,6 +572,7 @@ struct ocfs2_dinode {
                struct ocfs2_chain_list         i_chain;
                struct ocfs2_extent_list        i_list;
                struct ocfs2_truncate_log       i_dealloc;
+               struct ocfs2_inline_data        i_data;
                __u8                            i_symlink[0];
        } id2;
 /* Actual on-disk size is one block */
@@ -593,6 +622,12 @@ static inline int ocfs2_fast_symlink_chars(struct super_block *sb)
                 offsetof(struct ocfs2_dinode, id2.i_symlink);
 }
 
+static inline int ocfs2_max_inline_data(struct super_block *sb)
+{
+       return sb->s_blocksize -
+               offsetof(struct ocfs2_dinode, id2.i_data.id_data);
+}
+
 static inline int ocfs2_extent_recs_per_inode(struct super_block *sb)
 {
        int size;
@@ -672,6 +707,11 @@ static inline int ocfs2_fast_symlink_chars(int blocksize)
        return blocksize - offsetof(struct ocfs2_dinode, id2.i_symlink);
 }
 
+static inline int ocfs2_max_inline_data(int blocksize)
+{
+       return blocksize - offsetof(struct ocfs2_dinode, id2.i_data.id_data);
+}
+
 static inline int ocfs2_extent_recs_per_inode(int blocksize)
 {
        int size;