]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ext4: mark inode dirty before grabbing i_data_sem in ext4_setattr
authorHarshad Shirwadkar <harshadshirwadkar@gmail.com>
Thu, 8 May 2025 17:59:02 +0000 (17:59 +0000)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 9 May 2025 01:56:17 +0000 (21:56 -0400)
Mark inode dirty first and then grab i_data_sem in ext4_setattr().

Signed-off-by: Harshad Shirwadkar <harshadshirwadkar@gmail.com>
Link: https://patch.msgid.link/20250508175908.1004880-4-harshadshirwadkar@gmail.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c

index d58b99407390febcf640cd506c8985be7f1a1696..3005053e92a757ceee999760a20a7032f374a20c 100644 (file)
@@ -5568,9 +5568,7 @@ int ext4_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                        down_write(&EXT4_I(inode)->i_data_sem);
                        old_disksize = EXT4_I(inode)->i_disksize;
                        EXT4_I(inode)->i_disksize = attr->ia_size;
-                       rc = ext4_mark_inode_dirty(handle, inode);
-                       if (!error)
-                               error = rc;
+
                        /*
                         * We have to update i_size under i_data_sem together
                         * with i_disksize to avoid races with writeback code
@@ -5581,6 +5579,9 @@ int ext4_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                        else
                                EXT4_I(inode)->i_disksize = old_disksize;
                        up_write(&EXT4_I(inode)->i_data_sem);
+                       rc = ext4_mark_inode_dirty(handle, inode);
+                       if (!error)
+                               error = rc;
                        ext4_journal_stop(handle);
                        if (error)
                                goto out_mmap_sem;