On Tue 19-04-22 10:31:40, Harshad Shirwadkar wrote: > From: Harshad Shirwadkar <harshadshirwadkar@xxxxxxxxx> > > Mark inode dirty first and then grab i_data_sem in ext4_setattr(). > > Signed-off-by: Harshad Shirwadkar <harshadshirwadkar@xxxxxxxxx> > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index e88940251afd..6eae0804c6fd 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -5455,11 +5455,12 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry, > (attr->ia_size > 0 ? attr->ia_size - 1 : 0) >> > inode->i_sb->s_blocksize_bits); > > - down_write(&EXT4_I(inode)->i_data_sem); > - EXT4_I(inode)->i_disksize = attr->ia_size; > rc = ext4_mark_inode_dirty(handle, inode); > if (!error) > error = rc; > + down_write(&EXT4_I(inode)->i_data_sem); > + EXT4_I(inode)->i_disksize = attr->ia_size; > + Hum, this isn't going to fly because ext4_mark_inode_dirty() copies data from ext4_inode_info to the on-disk buffer and thus new i_disksize will not be stored on the disk after your change. Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR