aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/xfs_log_recover.c81
1 files changed, 27 insertions, 54 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 176c4b3609ab..29e101fc32c5 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -4132,41 +4132,13 @@ xlog_do_recovery_pass(
4132 } 4132 }
4133 4133
4134 memset(rhash, 0, sizeof(rhash)); 4134 memset(rhash, 0, sizeof(rhash));
4135 if (tail_blk <= head_blk) { 4135 blk_no = tail_blk;
4136 for (blk_no = tail_blk; blk_no < head_blk; ) { 4136 if (tail_blk > head_blk) {
4137 error = xlog_bread(log, blk_no, hblks, hbp, &offset);
4138 if (error)
4139 goto bread_err2;
4140
4141 rhead = (xlog_rec_header_t *)offset;
4142 error = xlog_valid_rec_header(log, rhead, blk_no);
4143 if (error)
4144 goto bread_err2;
4145
4146 /* blocks in data section */
4147 bblks = (int)BTOBB(be32_to_cpu(rhead->h_len));
4148 error = xlog_bread(log, blk_no + hblks, bblks, dbp,
4149 &offset);
4150 if (error)
4151 goto bread_err2;
4152
4153 error = xlog_unpack_data(rhead, offset, log);
4154 if (error)
4155 goto bread_err2;
4156
4157 error = xlog_recover_process_data(log,
4158 rhash, rhead, offset, pass);
4159 if (error)
4160 goto bread_err2;
4161 blk_no += bblks + hblks;
4162 }
4163 } else {
4164 /* 4137 /*
4165 * Perform recovery around the end of the physical log. 4138 * Perform recovery around the end of the physical log.
4166 * When the head is not on the same cycle number as the tail, 4139 * When the head is not on the same cycle number as the tail,
4167 * we can't do a sequential recovery as above. 4140 * we can't do a sequential recovery.
4168 */ 4141 */
4169 blk_no = tail_blk;
4170 while (blk_no < log->l_logBBsize) { 4142 while (blk_no < log->l_logBBsize) {
4171 /* 4143 /*
4172 * Check for header wrapping around physical end-of-log 4144 * Check for header wrapping around physical end-of-log
@@ -4280,34 +4252,35 @@ xlog_do_recovery_pass(
4280 4252
4281 ASSERT(blk_no >= log->l_logBBsize); 4253 ASSERT(blk_no >= log->l_logBBsize);
4282 blk_no -= log->l_logBBsize; 4254 blk_no -= log->l_logBBsize;
4255 }
4283 4256
4284 /* read first part of physical log */ 4257 /* read first part of physical log */
4285 while (blk_no < head_blk) { 4258 while (blk_no < head_blk) {
4286 error = xlog_bread(log, blk_no, hblks, hbp, &offset); 4259 error = xlog_bread(log, blk_no, hblks, hbp, &offset);
4287 if (error) 4260 if (error)
4288 goto bread_err2; 4261 goto bread_err2;
4289 4262
4290 rhead = (xlog_rec_header_t *)offset; 4263 rhead = (xlog_rec_header_t *)offset;
4291 error = xlog_valid_rec_header(log, rhead, blk_no); 4264 error = xlog_valid_rec_header(log, rhead, blk_no);
4292 if (error) 4265 if (error)
4293 goto bread_err2; 4266 goto bread_err2;
4294 4267
4295 bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); 4268 /* blocks in data section */
4296 error = xlog_bread(log, blk_no+hblks, bblks, dbp, 4269 bblks = (int)BTOBB(be32_to_cpu(rhead->h_len));
4297 &offset); 4270 error = xlog_bread(log, blk_no+hblks, bblks, dbp,
4298 if (error) 4271 &offset);
4299 goto bread_err2; 4272 if (error)
4273 goto bread_err2;
4300 4274
4301 error = xlog_unpack_data(rhead, offset, log); 4275 error = xlog_unpack_data(rhead, offset, log);
4302 if (error) 4276 if (error)
4303 goto bread_err2; 4277 goto bread_err2;
4304 4278
4305 error = xlog_recover_process_data(log, rhash, 4279 error = xlog_recover_process_data(log, rhash,
4306 rhead, offset, pass); 4280 rhead, offset, pass);
4307 if (error) 4281 if (error)
4308 goto bread_err2; 4282 goto bread_err2;
4309 blk_no += bblks + hblks; 4283 blk_no += bblks + hblks;
4310 }
4311 } 4284 }
4312 4285
4313 bread_err2: 4286 bread_err2: