Skip to content

Commit a44be64

Browse files
committed
ext4: don't clear SB_RDONLY when remounting r/w until quota is re-enabled
When a file system currently mounted read/only is remounted read/write, if we clear the SB_RDONLY flag too early, before the quota is initialized, and there is another process/thread constantly attempting to create a directory, it's possible to trigger the WARN_ON_ONCE(dquot_initialize_needed(inode)); in ext4_xattr_block_set(), with the following stack trace: WARNING: CPU: 0 PID: 5338 at fs/ext4/xattr.c:2141 ext4_xattr_block_set+0x2ef2/0x3680 RIP: 0010:ext4_xattr_block_set+0x2ef2/0x3680 fs/ext4/xattr.c:2141 Call Trace: ext4_xattr_set_handle+0xcd4/0x15c0 fs/ext4/xattr.c:2458 ext4_initxattrs+0xa3/0x110 fs/ext4/xattr_security.c:44 security_inode_init_security+0x2df/0x3f0 security/security.c:1147 __ext4_new_inode+0x347e/0x43d0 fs/ext4/ialloc.c:1324 ext4_mkdir+0x425/0xce0 fs/ext4/namei.c:2992 vfs_mkdir+0x29d/0x450 fs/namei.c:4038 do_mkdirat+0x264/0x520 fs/namei.c:4061 __do_sys_mkdirat fs/namei.c:4076 [inline] __se_sys_mkdirat fs/namei.c:4074 [inline] __x64_sys_mkdirat+0x89/0xa0 fs/namei.c:4074 Cc: [email protected] Link: https://lore.kernel.org/r/[email protected] Reported-by: [email protected] Link: https://syzkaller.appspot.com/bug?id=6513f6cb5cd6b5fc9f37e3bb70d273b94be9c34c Signed-off-by: Theodore Ts'o <[email protected]>
1 parent fa83c34 commit a44be64

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

fs/ext4/super.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6387,6 +6387,7 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
63876387
struct ext4_mount_options old_opts;
63886388
ext4_group_t g;
63896389
int err = 0;
6390+
int enable_rw = 0;
63906391
#ifdef CONFIG_QUOTA
63916392
int enable_quota = 0;
63926393
int i, j;
@@ -6573,7 +6574,7 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
65736574
if (err)
65746575
goto restore_opts;
65756576

6576-
sb->s_flags &= ~SB_RDONLY;
6577+
enable_rw = 1;
65776578
if (ext4_has_feature_mmp(sb)) {
65786579
err = ext4_multi_mount_protect(sb,
65796580
le64_to_cpu(es->s_mmp_block));
@@ -6632,6 +6633,9 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
66326633
if (!test_opt(sb, BLOCK_VALIDITY) && sbi->s_system_blks)
66336634
ext4_release_system_zone(sb);
66346635

6636+
if (enable_rw)
6637+
sb->s_flags &= ~SB_RDONLY;
6638+
66356639
if (!ext4_has_feature_mmp(sb) || sb_rdonly(sb))
66366640
ext4_stop_mmpd(sbi);
66376641

0 commit comments

Comments
 (0)