aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/mmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/mmp.c')
-rw-r--r--fs/ext4/mmp.c34
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,
91 submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh); 91 submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh);
92 wait_on_buffer(*bh); 92 wait_on_buffer(*bh);
93 if (!buffer_uptodate(*bh)) { 93 if (!buffer_uptodate(*bh)) {
94 brelse(*bh);
95 *bh = NULL;
96 ret = -EIO; 94 ret = -EIO;
97 goto warn_exit; 95 goto warn_exit;
98 } 96 }
99
100 mmp = (struct mmp_struct *)((*bh)->b_data); 97 mmp = (struct mmp_struct *)((*bh)->b_data);
101 if (le32_to_cpu(mmp->mmp_magic) != EXT4_MMP_MAGIC) 98 if (le32_to_cpu(mmp->mmp_magic) != EXT4_MMP_MAGIC) {
102 ret = -EFSCORRUPTED; 99 ret = -EFSCORRUPTED;
103 else if (!ext4_mmp_csum_verify(sb, mmp)) 100 goto warn_exit;
101 }
102 if (!ext4_mmp_csum_verify(sb, mmp)) {
104 ret = -EFSBADCRC; 103 ret = -EFSBADCRC;
105 else 104 goto warn_exit;
106 return 0; 105 }
107 106 return 0;
108warn_exit: 107warn_exit:
108 brelse(*bh);
109 *bh = NULL;
109 ext4_warning(sb, "Error %d while reading MMP block %llu", 110 ext4_warning(sb, "Error %d while reading MMP block %llu",
110 ret, mmp_block); 111 ret, mmp_block);
111 return ret; 112 return ret;
@@ -181,15 +182,13 @@ static int kmmpd(void *data)
181 EXT4_FEATURE_INCOMPAT_MMP)) { 182 EXT4_FEATURE_INCOMPAT_MMP)) {
182 ext4_warning(sb, "kmmpd being stopped since MMP feature" 183 ext4_warning(sb, "kmmpd being stopped since MMP feature"
183 " has been disabled."); 184 " has been disabled.");
184 EXT4_SB(sb)->s_mmp_tsk = NULL; 185 goto exit_thread;
185 goto failed;
186 } 186 }
187 187
188 if (sb->s_flags & MS_RDONLY) { 188 if (sb->s_flags & MS_RDONLY) {
189 ext4_warning(sb, "kmmpd being stopped since filesystem " 189 ext4_warning(sb, "kmmpd being stopped since filesystem "
190 "has been remounted as readonly."); 190 "has been remounted as readonly.");
191 EXT4_SB(sb)->s_mmp_tsk = NULL; 191 goto exit_thread;
192 goto failed;
193 } 192 }
194 193
195 diff = jiffies - last_update_time; 194 diff = jiffies - last_update_time;
@@ -211,9 +210,7 @@ static int kmmpd(void *data)
211 if (retval) { 210 if (retval) {
212 ext4_error(sb, "error reading MMP data: %d", 211 ext4_error(sb, "error reading MMP data: %d",
213 retval); 212 retval);
214 213 goto exit_thread;
215 EXT4_SB(sb)->s_mmp_tsk = NULL;
216 goto failed;
217 } 214 }
218 215
219 mmp_check = (struct mmp_struct *)(bh_check->b_data); 216 mmp_check = (struct mmp_struct *)(bh_check->b_data);
@@ -225,7 +222,9 @@ static int kmmpd(void *data)
225 "The filesystem seems to have been" 222 "The filesystem seems to have been"
226 " multiply mounted."); 223 " multiply mounted.");
227 ext4_error(sb, "abort"); 224 ext4_error(sb, "abort");
228 goto failed; 225 put_bh(bh_check);
226 retval = -EBUSY;
227 goto exit_thread;
229 } 228 }
230 put_bh(bh_check); 229 put_bh(bh_check);
231 } 230 }
@@ -248,7 +247,8 @@ static int kmmpd(void *data)
248 247
249 retval = write_mmp_block(sb, bh); 248 retval = write_mmp_block(sb, bh);
250 249
251failed: 250exit_thread:
251 EXT4_SB(sb)->s_mmp_tsk = NULL;
252 kfree(data); 252 kfree(data);
253 brelse(bh); 253 brelse(bh);
254 return retval; 254 return retval;