|
@@ -87,7 +87,8 @@
|
|
|
|
|
|
#define OCFS2_FEATURE_COMPAT_SUPP OCFS2_FEATURE_COMPAT_BACKUP_SB
|
|
#define OCFS2_FEATURE_COMPAT_SUPP OCFS2_FEATURE_COMPAT_BACKUP_SB
|
|
#define OCFS2_FEATURE_INCOMPAT_SUPP (OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT \
|
|
#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_RO_COMPAT_SUPP OCFS2_FEATURE_RO_COMPAT_UNWRITTEN
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -121,6 +122,9 @@
|
|
*/
|
|
*/
|
|
#define OCFS2_FEATURE_INCOMPAT_TUNEFS_INPROG 0x0020
|
|
#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
|
|
* backup superblock flag is used to indicate that this volume
|
|
* has backup superblocks.
|
|
* has backup superblocks.
|
|
@@ -162,6 +166,17 @@
|
|
#define OCFS2_CHAIN_FL (0x00000400) /* Chain allocator */
|
|
#define OCFS2_CHAIN_FL (0x00000400) /* Chain allocator */
|
|
#define OCFS2_DEALLOC_FL (0x00000800) /* Truncate log */
|
|
#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 */
|
|
/* Inode attributes, keep in sync with EXT2 */
|
|
#define OCFS2_SECRM_FL (0x00000001) /* Secure deletion */
|
|
#define OCFS2_SECRM_FL (0x00000001) /* Secure deletion */
|
|
#define OCFS2_UNRM_FL (0x00000002) /* Undelete */
|
|
#define OCFS2_UNRM_FL (0x00000002) /* Undelete */
|
|
@@ -486,6 +501,19 @@ struct ocfs2_local_alloc
|
|
/*10*/ __u8 la_bitmap[0];
|
|
/*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
|
|
* On disk inode for OCFS2
|
|
*/
|
|
*/
|
|
@@ -518,7 +546,7 @@ struct ocfs2_dinode {
|
|
__le32 i_attr;
|
|
__le32 i_attr;
|
|
__le16 i_orphaned_slot; /* Only valid when OCFS2_ORPHANED_FL
|
|
__le16 i_orphaned_slot; /* Only valid when OCFS2_ORPHANED_FL
|
|
was set in i_flags */
|
|
was set in i_flags */
|
|
- __le16 i_reserved1;
|
|
|
|
|
|
+ __le16 i_dyn_features;
|
|
/*70*/ __le64 i_reserved2[8];
|
|
/*70*/ __le64 i_reserved2[8];
|
|
/*B8*/ union {
|
|
/*B8*/ union {
|
|
__le64 i_pad1; /* Generic way to refer to this
|
|
__le64 i_pad1; /* Generic way to refer to this
|
|
@@ -544,6 +572,7 @@ struct ocfs2_dinode {
|
|
struct ocfs2_chain_list i_chain;
|
|
struct ocfs2_chain_list i_chain;
|
|
struct ocfs2_extent_list i_list;
|
|
struct ocfs2_extent_list i_list;
|
|
struct ocfs2_truncate_log i_dealloc;
|
|
struct ocfs2_truncate_log i_dealloc;
|
|
|
|
+ struct ocfs2_inline_data i_data;
|
|
__u8 i_symlink[0];
|
|
__u8 i_symlink[0];
|
|
} id2;
|
|
} id2;
|
|
/* Actual on-disk size is one block */
|
|
/* 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);
|
|
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)
|
|
static inline int ocfs2_extent_recs_per_inode(struct super_block *sb)
|
|
{
|
|
{
|
|
int size;
|
|
int size;
|
|
@@ -672,6 +707,11 @@ static inline int ocfs2_fast_symlink_chars(int blocksize)
|
|
return blocksize - offsetof(struct ocfs2_dinode, id2.i_symlink);
|
|
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)
|
|
static inline int ocfs2_extent_recs_per_inode(int blocksize)
|
|
{
|
|
{
|
|
int size;
|
|
int size;
|