mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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: stable@kernel.org
Link: https://lore.kernel.org/r/20230506142419.984260-1-tytso@mit.edu
Reported-by: syzbot+6385d7d3065524c5ca6d@syzkaller.appspotmail.com
Link: https://syzkaller.appspot.com/bug?id=6513f6cb5cd6b5fc9f37e3bb70d273b94be9c34c
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
			
			
This commit is contained in:
		
							parent
							
								
									fa83c34e3e
								
							
						
					
					
						commit
						a44be64bbe
					
				
					 1 changed files with 5 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -6387,6 +6387,7 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
 | 
			
		|||
	struct ext4_mount_options old_opts;
 | 
			
		||||
	ext4_group_t g;
 | 
			
		||||
	int err = 0;
 | 
			
		||||
	int enable_rw = 0;
 | 
			
		||||
#ifdef CONFIG_QUOTA
 | 
			
		||||
	int enable_quota = 0;
 | 
			
		||||
	int i, j;
 | 
			
		||||
| 
						 | 
				
			
			@ -6573,7 +6574,7 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
 | 
			
		|||
			if (err)
 | 
			
		||||
				goto restore_opts;
 | 
			
		||||
 | 
			
		||||
			sb->s_flags &= ~SB_RDONLY;
 | 
			
		||||
			enable_rw = 1;
 | 
			
		||||
			if (ext4_has_feature_mmp(sb)) {
 | 
			
		||||
				err = ext4_multi_mount_protect(sb,
 | 
			
		||||
						le64_to_cpu(es->s_mmp_block));
 | 
			
		||||
| 
						 | 
				
			
			@ -6632,6 +6633,9 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
 | 
			
		|||
	if (!test_opt(sb, BLOCK_VALIDITY) && sbi->s_system_blks)
 | 
			
		||||
		ext4_release_system_zone(sb);
 | 
			
		||||
 | 
			
		||||
	if (enable_rw)
 | 
			
		||||
		sb->s_flags &= ~SB_RDONLY;
 | 
			
		||||
 | 
			
		||||
	if (!ext4_has_feature_mmp(sb) || sb_rdonly(sb))
 | 
			
		||||
		ext4_stop_mmpd(sbi);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue