diff options
Diffstat (limited to 'fs/ext4/super.c')
| -rw-r--r-- | fs/ext4/super.c | 37 | 
1 files changed, 25 insertions, 12 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index d39f386e9baf..9680fe753e59 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1048,6 +1048,8 @@ void ext4_mark_group_bitmap_corrupted(struct super_block *sb,  	struct ext4_group_desc *gdp = ext4_get_group_desc(sb, group, NULL);  	int ret; +	if (!grp || !gdp) +		return;  	if (flags & EXT4_GROUP_INFO_BBITMAP_CORRUPT) {  		ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT,  					    &grp->bb_state); @@ -3238,11 +3240,9 @@ static __le16 ext4_group_desc_csum(struct super_block *sb, __u32 block_group,  	crc = crc16(crc, (__u8 *)gdp, offset);  	offset += sizeof(gdp->bg_checksum); /* skip checksum */  	/* for checksum of struct ext4_group_desc do the rest...*/ -	if (ext4_has_feature_64bit(sb) && -	    offset < le16_to_cpu(sbi->s_es->s_desc_size)) +	if (ext4_has_feature_64bit(sb) && offset < sbi->s_desc_size)  		crc = crc16(crc, (__u8 *)gdp + offset, -			    le16_to_cpu(sbi->s_es->s_desc_size) - -				offset); +			    sbi->s_desc_size - offset);  out:  	return cpu_to_le16(crc); @@ -5684,8 +5684,9 @@ static int ext4_fill_super(struct super_block *sb, struct fs_context *fc)  		descr = "out journal";  	if (___ratelimit(&ext4_mount_msg_ratelimit, "EXT4-fs mount")) -		ext4_msg(sb, KERN_INFO, "mounted filesystem %pU with%s. " -			 "Quota mode: %s.", &sb->s_uuid, descr, +		ext4_msg(sb, KERN_INFO, "mounted filesystem %pU %s with%s. " +			 "Quota mode: %s.", &sb->s_uuid, +			 sb_rdonly(sb) ? "ro" : "r/w", descr,  			 ext4_quota_mode(sb));  	/* Update the s_overhead_clusters if necessary */ @@ -6387,6 +6388,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 +6575,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)); @@ -6616,9 +6618,6 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)  	}  #ifdef CONFIG_QUOTA -	/* Release old quota file names */ -	for (i = 0; i < EXT4_MAXQUOTAS; i++) -		kfree(old_opts.s_qf_names[i]);  	if (enable_quota) {  		if (sb_any_quota_suspended(sb))  			dquot_resume(sb, -1); @@ -6628,16 +6627,29 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)  				goto restore_opts;  		}  	} +	/* Release old quota file names */ +	for (i = 0; i < EXT4_MAXQUOTAS; i++) +		kfree(old_opts.s_qf_names[i]);  #endif  	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);  	return 0;  restore_opts: +	/* +	 * If there was a failing r/w to ro transition, we may need to +	 * re-enable quota +	 */ +	if ((sb->s_flags & SB_RDONLY) && !(old_sb_flags & SB_RDONLY) && +	    sb_any_quota_suspended(sb)) +		dquot_resume(sb, -1);  	sb->s_flags = old_sb_flags;  	sbi->s_mount_opt = old_opts.s_mount_opt;  	sbi->s_mount_opt2 = old_opts.s_mount_opt2; @@ -6678,8 +6690,9 @@ static int ext4_reconfigure(struct fs_context *fc)  	if (ret < 0)  		return ret; -	ext4_msg(sb, KERN_INFO, "re-mounted %pU. Quota mode: %s.", -		 &sb->s_uuid, ext4_quota_mode(sb)); +	ext4_msg(sb, KERN_INFO, "re-mounted %pU %s. Quota mode: %s.", +		 &sb->s_uuid, sb_rdonly(sb) ? "ro" : "r/w", +		 ext4_quota_mode(sb));  	return 0;  }  | 
