diff options
Diffstat (limited to 'fs/ext4/mmp.c')
| -rw-r--r-- | fs/ext4/mmp.c | 34 | 
1 files changed, 17 insertions, 17 deletions
| diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c index 0a512aa81bf7..24445275d330 100644 --- a/fs/ext4/mmp.c +++ b/fs/ext4/mmp.c @@ -91,21 +91,22 @@ static int read_mmp_block(struct super_block *sb, struct buffer_head **bh,  	submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh);  	wait_on_buffer(*bh);  	if (!buffer_uptodate(*bh)) { -		brelse(*bh); -		*bh = NULL;  		ret = -EIO;  		goto warn_exit;  	} -  	mmp = (struct mmp_struct *)((*bh)->b_data); -	if (le32_to_cpu(mmp->mmp_magic) != EXT4_MMP_MAGIC) +	if (le32_to_cpu(mmp->mmp_magic) != EXT4_MMP_MAGIC) {  		ret = -EFSCORRUPTED; -	else if (!ext4_mmp_csum_verify(sb, mmp)) +		goto warn_exit; +	} +	if (!ext4_mmp_csum_verify(sb, mmp)) {  		ret = -EFSBADCRC; -	else -		return 0; - +		goto warn_exit; +	} +	return 0;  warn_exit: +	brelse(*bh); +	*bh = NULL;  	ext4_warning(sb, "Error %d while reading MMP block %llu",  		     ret, mmp_block);  	return ret; @@ -181,15 +182,13 @@ static int kmmpd(void *data)  		    EXT4_FEATURE_INCOMPAT_MMP)) {  			ext4_warning(sb, "kmmpd being stopped since MMP feature"  				     " has been disabled."); -			EXT4_SB(sb)->s_mmp_tsk = NULL; -			goto failed; +			goto exit_thread;  		}  		if (sb->s_flags & MS_RDONLY) {  			ext4_warning(sb, "kmmpd being stopped since filesystem "  				     "has been remounted as readonly."); -			EXT4_SB(sb)->s_mmp_tsk = NULL; -			goto failed; +			goto exit_thread;  		}  		diff = jiffies - last_update_time; @@ -211,9 +210,7 @@ static int kmmpd(void *data)  			if (retval) {  				ext4_error(sb, "error reading MMP data: %d",  					   retval); - -				EXT4_SB(sb)->s_mmp_tsk = NULL; -				goto failed; +				goto exit_thread;  			}  			mmp_check = (struct mmp_struct *)(bh_check->b_data); @@ -225,7 +222,9 @@ static int kmmpd(void *data)  					     "The filesystem seems to have been"  					     " multiply mounted.");  				ext4_error(sb, "abort"); -				goto failed; +				put_bh(bh_check); +				retval = -EBUSY; +				goto exit_thread;  			}  			put_bh(bh_check);  		} @@ -248,7 +247,8 @@ static int kmmpd(void *data)  	retval = write_mmp_block(sb, bh); -failed: +exit_thread: +	EXT4_SB(sb)->s_mmp_tsk = NULL;  	kfree(data);  	brelse(bh);  	return retval; | 
