Andreas Dilger e50e5129f3 ext4: xattr-in-inode support
Large xattr support is implemented for EXT4_FEATURE_INCOMPAT_EA_INODE.

If the size of an xattr value is larger than will fit in a single
external block, then the xattr value will be saved into the body
of an external xattr inode.

The also helps support a larger number of xattr, since only the headers
will be stored in the in-inode space or the single external block.

The inode is referenced from the xattr header via "e_value_inum",
which was formerly "e_value_block", but that field was never used.
The e_value_size still contains the xattr size so that listing
xattrs does not need to look up the inode if the data is not accessed.

struct ext4_xattr_entry {
        __u8    e_name_len;     /* length of name */
        __u8    e_name_index;   /* attribute name index */
        __le16  e_value_offs;   /* offset in disk block of value */
        __le32  e_value_inum;   /* inode in which value is stored */
        __le32  e_value_size;   /* size of attribute value */
        __le32  e_hash;         /* hash value of name and value */
        char    e_name[0];      /* attribute name */
};

The xattr inode is marked with the EXT4_EA_INODE_FL flag and also
holds a back-reference to the owning inode in its i_mtime field,
allowing the ext4/e2fsck to verify the correct inode is accessed.

[ Applied fix by Dan Carpenter to avoid freeing an ERR_PTR. ]

Lustre-Jira: https://jira.hpdd.intel.com/browse/LU-80
Lustre-bugzilla: https://bugzilla.lustre.org/show_bug.cgi?id=4424
Signed-off-by: Kalpak Shah <kalpak.shah@sun.com>
Signed-off-by: James Simmons <uja.ornl@gmail.com>
Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Tahsin Erdogan <tahsin@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
2017-06-21 21:10:32 -04:00
..
2015-04-02 23:47:42 -04:00
2016-09-30 02:14:56 -04:00
2017-06-21 21:09:57 -04:00
2017-06-21 21:10:32 -04:00
2017-04-30 00:36:53 -04:00
2017-04-30 00:36:53 -04:00
2017-02-02 11:52:14 -05:00
2017-06-21 21:10:32 -04:00
2016-05-13 00:44:16 -04:00
2017-06-21 21:10:32 -04:00
2017-06-21 21:10:32 -04:00
2017-04-30 00:36:53 -04:00
2017-04-30 00:36:53 -04:00
2016-03-09 23:49:05 -05:00
2016-11-01 09:43:26 -06:00
2017-06-21 21:09:57 -04:00
2017-04-03 01:05:58 -04:00
2017-06-21 21:10:32 -04:00
2017-06-21 21:10:32 -04:00