Message ID | 20220419173143.3564144-4-harshads@google.com |
---|---|
State | New |
Headers | show |
Series | ext4: improve commit path performance for fast commit | expand |
On Tue 19-04-22 10:31:40, Harshad Shirwadkar wrote: > From: Harshad Shirwadkar <harshadshirwadkar@gmail.com> > > Mark inode dirty first and then grab i_data_sem in ext4_setattr(). > > Signed-off-by: Harshad Shirwadkar <harshadshirwadkar@gmail.com> > 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
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; + /* * We have to update i_size under i_data_sem together * with i_disksize to avoid races with writeback code