ext4: fixup free space calculations when expanding inodes
authorJan Kara <jack@suse.cz>
Mon, 29 Aug 2016 19:38:11 +0000 (15:38 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 29 Aug 2016 19:38:11 +0000 (15:38 -0400)
commite3014d14a81edde488d9a6758eea8afc41752d2d
tree4f367d8df1b7df51d27790bb16bf4bdf39bfefc5
parentb8927721ae9d5ac0582d29d7b8c267d465ad5f00
ext4: fixup free space calculations when expanding inodes

Conditions checking whether there is enough free space in an xattr block
and when xattr is large enough to make enough space in the inode forgot
to account for the fact that inode need not be completely filled up with
xattrs. Thus we could move unnecessarily many xattrs out of inode or
even falsely claim there is not enough space to expand the inode. We
also forgot to update the amount of free space in xattr block when moving
more xattrs and thus could decide to move too big xattr resulting in
unexpected failure.

Fix these problems by properly updating free space in the inode and
xattr block as we move xattrs. To simplify the math, avoid shifting
xattrs after removing each one xattr and instead just shift xattrs only
once there is enough free space in the inode.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/xattr.c