[Ocfs2-tools-devel] [PATCH 1/2] ocfs2-tools: Add extended attribute support in mkfs.ocfs2

Tao Ma tao.ma at oracle.com
Mon Aug 25 23:17:38 PDT 2008



Tiger Yang wrote:
> This patch add support for new feature xattr in mkfs.ocfs2.
> 
> Signed-off-by: Tiger Yang <tiger.yang at oracle.com>
> ---
>  include/ocfs2-kernel/ocfs2_fs.h |   89 ++++++++++++++++++++++++++++++++++----
>  include/ocfs2/ocfs2.h           |    2 +
>  libocfs2/Makefile               |    3 +-
>  libocfs2/feature_string.c       |    9 ++++-
>  libocfs2/inode.c                |    7 +++
>  libocfs2/xattr.c                |   37 ++++++++++++++++
>  mkfs.ocfs2/mkfs.c               |    6 +++
>  mkfs.ocfs2/mkfs.ocfs2.8.in      |    5 ++
>  sizetest/sizetest.c             |   12 +++++-
>  9 files changed, 157 insertions(+), 13 deletions(-)
>  create mode 100644 libocfs2/xattr.c
> 
> diff --git a/include/ocfs2-kernel/ocfs2_fs.h b/include/ocfs2-kernel/ocfs2_fs.h
> index 0cfef2a..ade9ec1 100644
> --- a/include/ocfs2-kernel/ocfs2_fs.h
> +++ b/include/ocfs2-kernel/ocfs2_fs.h
> @@ -64,6 +64,7 @@
>  #define OCFS2_INODE_SIGNATURE		"INODE01"
>  #define OCFS2_EXTENT_BLOCK_SIGNATURE	"EXBLK01"
>  #define OCFS2_GROUP_DESC_SIGNATURE      "GROUP01"
> +#define OCFS2_XATTR_BLOCK_SIGNATURE	"XATTR01"
>  
>  /* Compatibility flags */
>  #define OCFS2_HAS_COMPAT_FEATURE(sb,mask)			\
> @@ -89,8 +90,9 @@
>  #define OCFS2_FEATURE_INCOMPAT_SUPP	(OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT \
>  					 | OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC \
>  					 | OCFS2_FEATURE_INCOMPAT_INLINE_DATA \
>  					 | OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP \
> -					 | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK)
> +					 | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \
> +					 | OCFS2_FEATURE_INCOMPAT_XATTR)
>  #define OCFS2_FEATURE_RO_COMPAT_SUPP	OCFS2_FEATURE_RO_COMPAT_UNWRITTEN
>  
>  /*
> @@ -126,10 +128,6 @@
>  /* Support for data packed into inode blocks */
>  #define OCFS2_FEATURE_INCOMPAT_INLINE_DATA	0x0040
>  
> -/* Support for the extended slot map */
> -#define OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP 0x100
> -
> -
>  /*
>   * Support for alternate, userspace cluster stacks.  If set, the superblock
>   * field s_cluster_info contains a tag for the alternate stack in use as
> @@ -141,6 +139,12 @@
>   */
>  #define OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK	0x0080
>  
> +/* Support for the extended slot map */
> +#define OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP 0x100
> +
> +/* Support for extended attributes */
> +#define OCFS2_FEATURE_INCOMPAT_XATTR		0x0200
> +
>  /*
>   * backup superblock flag is used to indicate that this volume
>   * has backup superblocks.
> @@ -554,7 +558,7 @@ struct ocfs2_super_block {
>  /*40*/	__le16 s_max_slots;		/* Max number of simultaneous mounts
>  					   before tunefs required */
>  	__le16 s_tunefs_flag;
> -	__le32 s_reserved1;
> +	__le32 s_uuid_hash;
>  	__le64 s_first_cluster_group;	/* Block offset of 1st cluster
>  					 * group header */
>  /*50*/	__u8  s_label[OCFS2_MAX_VOL_LABEL_LEN];	/* Label for mounting, etc. */
> @@ -562,7 +566,11 @@ struct ocfs2_super_block {
>  /*A0*/  struct ocfs2_cluster_info s_cluster_info; /* Selected userspace
>  						     stack.  Only valid
>  						     with INCOMPAT flag. */
> -/*B8*/  __le64 s_reserved2[17];		/* Fill out superblock */
> +/*B8*/	__le16 s_xattr_inline_size;	/* extended attribute inline size
> +					   for this fs*/
> +	__le16 s_reserved0;
> +	__le32 s_reserved1;
> +/*C0*/  __le64 s_reserved2[16];		/* Fill out superblock */
>  /*140*/
>  
>  	/*
> @@ -612,7 +620,8 @@ struct ocfs2_dinode {
>  					   belongs to */
>  	__le16 i_suballoc_bit;		/* Bit offset in suballocator
>  					   block group */
> -/*10*/	__le32 i_reserved0;
> +/*10*/	__le16 i_reserved0;
> +	__le16 i_xattr_inline_size;
>  	__le32 i_clusters;		/* Cluster count */
>  	__le32 i_uid;			/* Owner UID */
>  	__le32 i_gid;			/* Owning GID */
> @@ -631,11 +640,12 @@ struct ocfs2_dinode {
>  	__le32 i_atime_nsec;
>  	__le32 i_ctime_nsec;
>  	__le32 i_mtime_nsec;
> -	__le32 i_attr;
> +/*70*/	__le32 i_attr;
>  	__le16 i_orphaned_slot;		/* Only valid when OCFS2_ORPHANED_FL
>  					   was set in i_flags */
>  	__le16 i_dyn_features;
> -/*70*/	__le64 i_reserved2[8];
> +	__le64 i_xattr_loc;
> +/*80*/	__le64 i_reserved2[7];
>  /*B8*/	union {
>  		__le64 i_pad1;		/* Generic way to refer to this
>  					   64bit union */
> @@ -706,6 +716,65 @@ struct ocfs2_group_desc
>  /*40*/	__u8    bg_bitmap[0];
>  };
>  
> +/*
> + * On disk extended attribute structure for OCFS2
> + * Include ocfs2_xattr_entry, ocfs2_xattr_header, ocfs2_xattr_value_root
> + * ocfs2_xattr_tree_root and ocfs2_xattr_block.
> + */
> +#define OCFS2_XATTR_INDEXED		0x1
> +
> +#define OCFS2_HASH_SHIFT		5
> +
> +/* Inline extended attribute size (in bytes) */
> +#define OCFS2_MIN_XATTR_INLINE_SIZE     256
> +
> +struct ocfs2_xattr_entry {
> +	__le32	xe_name_hash;
> +	__le16	xe_name_offset;
> +	__u8	xe_name_len;
> +	__u8	xe_type : 7;
> +	__u8	xe_local : 1;
> +	__le64	xe_value_size;
> +};
the structure here has been changed.
> +
> +struct ocfs2_xattr_header {
> +	__le16	xh_count;
> +	__le16	xh_reserved1;
> +	__le32	xh_csum;
> +	__le64  xh_reserved2;
> +	struct ocfs2_xattr_entry	xh_entries[0];
> +};
also here xh_csum is moved to the end. So please update the disk layout 
so that we can use it.

Regards,
Tao



More information about the Ocfs2-tools-devel mailing list