allow in-inode EAs on ext4 root inode
PATCH 1/1 allow in-inode EAs on ext4 root inode
The ext3 root inode was treated specially with respect to in-inode extended attributes, for reasons detailed in the removed comment below. The first mkfs-created inodes would not get extra_i_size or the EXT3_STATE_XATTR flag set in ext3_read_inode, which disallowed reading or setting in-inode EAs on the root.
However, in ext4, ext4_mark_inode_dirty calls ext4_expand_extra_isize for all inodes; once this is done EAs may be placed in the root ext4 inode body.
But for reasons above, it won't be found after a reboot.
testcase:
setfattr -n user.name -v value mntpt/
setfattr -n user.name2 -v value2 mntpt/
umount mntpt/; remount mntpt/
getfattr -d mntpt/
name2/value2 has gone missing; debugfs shows it in the inode body, but it is not found there by getattr.
The following fixes it up; newer mkfs appears to properly zero the inodes, so this workaround isn't needed for ext4.
---
fs/ext4/inode.c +1 -7
@@ -2750,13 +2750,7 @@ void ext4_read_inode(struct inode * inod ei->i_data[block] = raw_inode->i_block[block];INIT_LIST_HEAD (&ei->i_orphan); -if (inode->i_ino >=EXT4_FIRST_INO (inode->i_sb) +1 && -EXT4_INODE_SIZE (inode->i_sb) >EXT4_GOOD_OLD_INODE_SIZE ) { -/* -* When mke2fs creates big inodes it does not zero out -* the unused bytes above EXT4_GOOD_OLD_INODE_SIZE, -* so ignore those first few inodes. -*/ +if (EXT4_INODE_SIZE (inode->i_sb) >EXT4_GOOD_OLD_INODE_SIZE ) { ei->i_extra_isize =le16_to_cpu (raw_inode->i_extra_isize);if (EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize >EXT4_INODE_SIZE (inode->i_sb)) {
Theodore Tso
maintainerThanks, I've included this into the ext4 patch queue and into the 2.6.24-git6-ext4-1 tree.
- Ted