summaryrefslogtreecommitdiffstats
path: root/fs/ext4/xattr.c
diff options
context:
space:
mode:
authorMiao Xie <miaoxie@huawei.com>2017-08-06 00:40:01 -0400
committerTheodore Ts'o <tytso@mit.edu>2017-08-06 00:40:01 -0400
commitcf0a5e818fe216dbdf5da4e829e157d27ebfc8a4 (patch)
tree2bfe8893f6a5c206521d2cc934015fba5baba9cb /fs/ext4/xattr.c
parent3b10fdc6d8bd048f4fb14af5eda2051ace7b8b16 (diff)
downloadlinux-cf0a5e818fe216dbdf5da4e829e157d27ebfc8a4.tar.gz
linux-cf0a5e818fe216dbdf5da4e829e157d27ebfc8a4.tar.bz2
linux-cf0a5e818fe216dbdf5da4e829e157d27ebfc8a4.zip
ext4: restructure ext4_expand_extra_isize
Current ext4_expand_extra_isize just tries to expand extra isize, if someone is holding xattr lock or some check fails, it will give up. So rename its name to ext4_try_to_expand_extra_isize. Besides that, we clean up unnecessary check and move some relative checks into it. Signed-off-by: Miao Xie <miaoxie@huawei.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Wang Shilong <wshilong@ddn.com>
Diffstat (limited to 'fs/ext4/xattr.c')
-rw-r--r--fs/ext4/xattr.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
index 862ba3891398..7f5f4b63782b 100644
--- a/fs/ext4/xattr.c
+++ b/fs/ext4/xattr.c
@@ -2638,12 +2638,14 @@ int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize,
{
struct ext4_xattr_ibody_header *header;
struct buffer_head *bh = NULL;
+ struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
+ static unsigned int mnt_count;
size_t min_offs;
size_t ifree, bfree;
int total_ino;
void *base, *end;
int error = 0, tried_min_extra_isize = 0;
- int s_min_extra_isize = le16_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_min_extra_isize);
+ int s_min_extra_isize = le16_to_cpu(sbi->s_es->s_min_extra_isize);
int isize_diff; /* How much do we need to grow i_extra_isize */
retry:
@@ -2731,6 +2733,11 @@ out:
cleanup:
brelse(bh);
+ if (mnt_count != le16_to_cpu(sbi->s_es->s_mnt_count)) {
+ ext4_warning(inode->i_sb, "Unable to expand inode %lu. Delete some EAs or run e2fsck.",
+ inode->i_ino);
+ mnt_count = le16_to_cpu(sbi->s_es->s_mnt_count);
+ }
return error;
}