aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_log_recover.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r--fs/xfs/xfs_log_recover.c80
1 files changed, 42 insertions, 38 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 04142caedb2..a199dbcee7d 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -91,6 +91,8 @@ xlog_get_bp(
91 xlog_t *log, 91 xlog_t *log,
92 int nbblks) 92 int nbblks)
93{ 93{
94 struct xfs_buf *bp;
95
94 if (!xlog_buf_bbcount_valid(log, nbblks)) { 96 if (!xlog_buf_bbcount_valid(log, nbblks)) {
95 xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer", 97 xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer",
96 nbblks); 98 nbblks);
@@ -118,8 +120,10 @@ xlog_get_bp(
118 nbblks += log->l_sectBBsize; 120 nbblks += log->l_sectBBsize;
119 nbblks = round_up(nbblks, log->l_sectBBsize); 121 nbblks = round_up(nbblks, log->l_sectBBsize);
120 122
121 return xfs_buf_get_uncached(log->l_mp->m_logdev_targp, 123 bp = xfs_buf_get_uncached(log->l_mp->m_logdev_targp, BBTOB(nbblks), 0);
122 BBTOB(nbblks), 0); 124 if (bp)
125 xfs_buf_unlock(bp);
126 return bp;
123} 127}
124 128
125STATIC void 129STATIC void
@@ -143,7 +147,7 @@ xlog_align(
143 xfs_daddr_t offset = blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); 147 xfs_daddr_t offset = blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1);
144 148
145 ASSERT(BBTOB(offset + nbblks) <= XFS_BUF_SIZE(bp)); 149 ASSERT(BBTOB(offset + nbblks) <= XFS_BUF_SIZE(bp));
146 return XFS_BUF_PTR(bp) + BBTOB(offset); 150 return bp->b_addr + BBTOB(offset);
147} 151}
148 152
149 153
@@ -174,9 +178,7 @@ xlog_bread_noalign(
174 178
175 XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no); 179 XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no);
176 XFS_BUF_READ(bp); 180 XFS_BUF_READ(bp);
177 XFS_BUF_BUSY(bp);
178 XFS_BUF_SET_COUNT(bp, BBTOB(nbblks)); 181 XFS_BUF_SET_COUNT(bp, BBTOB(nbblks));
179 XFS_BUF_SET_TARGET(bp, log->l_mp->m_logdev_targp);
180 182
181 xfsbdstrat(log->l_mp, bp); 183 xfsbdstrat(log->l_mp, bp);
182 error = xfs_buf_iowait(bp); 184 error = xfs_buf_iowait(bp);
@@ -216,18 +218,18 @@ xlog_bread_offset(
216 xfs_buf_t *bp, 218 xfs_buf_t *bp,
217 xfs_caddr_t offset) 219 xfs_caddr_t offset)
218{ 220{
219 xfs_caddr_t orig_offset = XFS_BUF_PTR(bp); 221 xfs_caddr_t orig_offset = bp->b_addr;
220 int orig_len = bp->b_buffer_length; 222 int orig_len = bp->b_buffer_length;
221 int error, error2; 223 int error, error2;
222 224
223 error = XFS_BUF_SET_PTR(bp, offset, BBTOB(nbblks)); 225 error = xfs_buf_associate_memory(bp, offset, BBTOB(nbblks));
224 if (error) 226 if (error)
225 return error; 227 return error;
226 228
227 error = xlog_bread_noalign(log, blk_no, nbblks, bp); 229 error = xlog_bread_noalign(log, blk_no, nbblks, bp);
228 230
229 /* must reset buffer pointer even on error */ 231 /* must reset buffer pointer even on error */
230 error2 = XFS_BUF_SET_PTR(bp, orig_offset, orig_len); 232 error2 = xfs_buf_associate_memory(bp, orig_offset, orig_len);
231 if (error) 233 if (error)
232 return error; 234 return error;
233 return error2; 235 return error2;
@@ -262,11 +264,9 @@ xlog_bwrite(
262 264
263 XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no); 265 XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no);
264 XFS_BUF_ZEROFLAGS(bp); 266 XFS_BUF_ZEROFLAGS(bp);
265 XFS_BUF_BUSY(bp); 267 xfs_buf_hold(bp);
266 XFS_BUF_HOLD(bp); 268 xfs_buf_lock(bp);
267 XFS_BUF_PSEMA(bp, PRIBIO);
268 XFS_BUF_SET_COUNT(bp, BBTOB(nbblks)); 269 XFS_BUF_SET_COUNT(bp, BBTOB(nbblks));
269 XFS_BUF_SET_TARGET(bp, log->l_mp->m_logdev_targp);
270 270
271 if ((error = xfs_bwrite(log->l_mp, bp))) 271 if ((error = xfs_bwrite(log->l_mp, bp)))
272 xfs_ioerror_alert("xlog_bwrite", log->l_mp, 272 xfs_ioerror_alert("xlog_bwrite", log->l_mp,
@@ -300,14 +300,14 @@ xlog_header_check_recover(
300 xfs_mount_t *mp, 300 xfs_mount_t *mp,
301 xlog_rec_header_t *head) 301 xlog_rec_header_t *head)
302{ 302{
303 ASSERT(be32_to_cpu(head->h_magicno) == XLOG_HEADER_MAGIC_NUM); 303 ASSERT(head->h_magicno == cpu_to_be32(XLOG_HEADER_MAGIC_NUM));
304 304
305 /* 305 /*
306 * IRIX doesn't write the h_fmt field and leaves it zeroed 306 * IRIX doesn't write the h_fmt field and leaves it zeroed
307 * (XLOG_FMT_UNKNOWN). This stops us from trying to recover 307 * (XLOG_FMT_UNKNOWN). This stops us from trying to recover
308 * a dirty log created in IRIX. 308 * a dirty log created in IRIX.
309 */ 309 */
310 if (unlikely(be32_to_cpu(head->h_fmt) != XLOG_FMT)) { 310 if (unlikely(head->h_fmt != cpu_to_be32(XLOG_FMT))) {
311 xfs_warn(mp, 311 xfs_warn(mp,
312 "dirty log written in incompatible format - can't recover"); 312 "dirty log written in incompatible format - can't recover");
313 xlog_header_check_dump(mp, head); 313 xlog_header_check_dump(mp, head);
@@ -333,7 +333,7 @@ xlog_header_check_mount(
333 xfs_mount_t *mp, 333 xfs_mount_t *mp,
334 xlog_rec_header_t *head) 334 xlog_rec_header_t *head)
335{ 335{
336 ASSERT(be32_to_cpu(head->h_magicno) == XLOG_HEADER_MAGIC_NUM); 336 ASSERT(head->h_magicno == cpu_to_be32(XLOG_HEADER_MAGIC_NUM));
337 337
338 if (uuid_is_nil(&head->h_fs_uuid)) { 338 if (uuid_is_nil(&head->h_fs_uuid)) {
339 /* 339 /*
@@ -356,7 +356,7 @@ STATIC void
356xlog_recover_iodone( 356xlog_recover_iodone(
357 struct xfs_buf *bp) 357 struct xfs_buf *bp)
358{ 358{
359 if (XFS_BUF_GETERROR(bp)) { 359 if (bp->b_error) {
360 /* 360 /*
361 * We're not going to bother about retrying 361 * We're not going to bother about retrying
362 * this during recovery. One strike! 362 * this during recovery. One strike!
@@ -367,7 +367,7 @@ xlog_recover_iodone(
367 xfs_force_shutdown(bp->b_target->bt_mount, 367 xfs_force_shutdown(bp->b_target->bt_mount,
368 SHUTDOWN_META_IO_ERROR); 368 SHUTDOWN_META_IO_ERROR);
369 } 369 }
370 XFS_BUF_CLR_IODONE_FUNC(bp); 370 bp->b_iodone = NULL;
371 xfs_buf_ioend(bp, 0); 371 xfs_buf_ioend(bp, 0);
372} 372}
373 373
@@ -534,7 +534,7 @@ xlog_find_verify_log_record(
534 534
535 head = (xlog_rec_header_t *)offset; 535 head = (xlog_rec_header_t *)offset;
536 536
537 if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(head->h_magicno)) 537 if (head->h_magicno == cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
538 break; 538 break;
539 539
540 if (!smallmem) 540 if (!smallmem)
@@ -916,7 +916,7 @@ xlog_find_tail(
916 if (error) 916 if (error)
917 goto done; 917 goto done;
918 918
919 if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(*(__be32 *)offset)) { 919 if (*(__be32 *)offset == cpu_to_be32(XLOG_HEADER_MAGIC_NUM)) {
920 found = 1; 920 found = 1;
921 break; 921 break;
922 } 922 }
@@ -933,8 +933,8 @@ xlog_find_tail(
933 if (error) 933 if (error)
934 goto done; 934 goto done;
935 935
936 if (XLOG_HEADER_MAGIC_NUM == 936 if (*(__be32 *)offset ==
937 be32_to_cpu(*(__be32 *)offset)) { 937 cpu_to_be32(XLOG_HEADER_MAGIC_NUM)) {
938 found = 2; 938 found = 2;
939 break; 939 break;
940 } 940 }
@@ -1258,7 +1258,7 @@ xlog_write_log_records(
1258 */ 1258 */
1259 ealign = round_down(end_block, sectbb); 1259 ealign = round_down(end_block, sectbb);
1260 if (j == 0 && (start_block + endcount > ealign)) { 1260 if (j == 0 && (start_block + endcount > ealign)) {
1261 offset = XFS_BUF_PTR(bp) + BBTOB(ealign - start_block); 1261 offset = bp->b_addr + BBTOB(ealign - start_block);
1262 error = xlog_bread_offset(log, ealign, sectbb, 1262 error = xlog_bread_offset(log, ealign, sectbb,
1263 bp, offset); 1263 bp, offset);
1264 if (error) 1264 if (error)
@@ -1947,7 +1947,7 @@ xfs_qm_dqcheck(
1947 * This is all fine; things are still consistent, and we haven't lost 1947 * This is all fine; things are still consistent, and we haven't lost
1948 * any quota information. Just don't complain about bad dquot blks. 1948 * any quota information. Just don't complain about bad dquot blks.
1949 */ 1949 */
1950 if (be16_to_cpu(ddq->d_magic) != XFS_DQUOT_MAGIC) { 1950 if (ddq->d_magic != cpu_to_be16(XFS_DQUOT_MAGIC)) {
1951 if (flags & XFS_QMOPT_DOWARN) 1951 if (flags & XFS_QMOPT_DOWARN)
1952 xfs_alert(mp, 1952 xfs_alert(mp,
1953 "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x", 1953 "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x",
@@ -2131,15 +2131,16 @@ xlog_recover_buffer_pass2(
2131 2131
2132 bp = xfs_buf_read(mp->m_ddev_targp, buf_f->blf_blkno, buf_f->blf_len, 2132 bp = xfs_buf_read(mp->m_ddev_targp, buf_f->blf_blkno, buf_f->blf_len,
2133 buf_flags); 2133 buf_flags);
2134 if (XFS_BUF_ISERROR(bp)) { 2134 if (!bp)
2135 return XFS_ERROR(ENOMEM);
2136 error = bp->b_error;
2137 if (error) {
2135 xfs_ioerror_alert("xlog_recover_do..(read#1)", mp, 2138 xfs_ioerror_alert("xlog_recover_do..(read#1)", mp,
2136 bp, buf_f->blf_blkno); 2139 bp, buf_f->blf_blkno);
2137 error = XFS_BUF_GETERROR(bp);
2138 xfs_buf_relse(bp); 2140 xfs_buf_relse(bp);
2139 return error; 2141 return error;
2140 } 2142 }
2141 2143
2142 error = 0;
2143 if (buf_f->blf_flags & XFS_BLF_INODE_BUF) { 2144 if (buf_f->blf_flags & XFS_BLF_INODE_BUF) {
2144 error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f); 2145 error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f);
2145 } else if (buf_f->blf_flags & 2146 } else if (buf_f->blf_flags &
@@ -2174,7 +2175,7 @@ xlog_recover_buffer_pass2(
2174 error = xfs_bwrite(mp, bp); 2175 error = xfs_bwrite(mp, bp);
2175 } else { 2176 } else {
2176 ASSERT(bp->b_target->bt_mount == mp); 2177 ASSERT(bp->b_target->bt_mount == mp);
2177 XFS_BUF_SET_IODONE_FUNC(bp, xlog_recover_iodone); 2178 bp->b_iodone = xlog_recover_iodone;
2178 xfs_bdwrite(mp, bp); 2179 xfs_bdwrite(mp, bp);
2179 } 2180 }
2180 2181
@@ -2223,14 +2224,17 @@ xlog_recover_inode_pass2(
2223 2224
2224 bp = xfs_buf_read(mp->m_ddev_targp, in_f->ilf_blkno, in_f->ilf_len, 2225 bp = xfs_buf_read(mp->m_ddev_targp, in_f->ilf_blkno, in_f->ilf_len,
2225 XBF_LOCK); 2226 XBF_LOCK);
2226 if (XFS_BUF_ISERROR(bp)) { 2227 if (!bp) {
2228 error = ENOMEM;
2229 goto error;
2230 }
2231 error = bp->b_error;
2232 if (error) {
2227 xfs_ioerror_alert("xlog_recover_do..(read#2)", mp, 2233 xfs_ioerror_alert("xlog_recover_do..(read#2)", mp,
2228 bp, in_f->ilf_blkno); 2234 bp, in_f->ilf_blkno);
2229 error = XFS_BUF_GETERROR(bp);
2230 xfs_buf_relse(bp); 2235 xfs_buf_relse(bp);
2231 goto error; 2236 goto error;
2232 } 2237 }
2233 error = 0;
2234 ASSERT(in_f->ilf_fields & XFS_ILOG_CORE); 2238 ASSERT(in_f->ilf_fields & XFS_ILOG_CORE);
2235 dip = (xfs_dinode_t *)xfs_buf_offset(bp, in_f->ilf_boffset); 2239 dip = (xfs_dinode_t *)xfs_buf_offset(bp, in_f->ilf_boffset);
2236 2240
@@ -2238,7 +2242,7 @@ xlog_recover_inode_pass2(
2238 * Make sure the place we're flushing out to really looks 2242 * Make sure the place we're flushing out to really looks
2239 * like an inode! 2243 * like an inode!
2240 */ 2244 */
2241 if (unlikely(be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC)) { 2245 if (unlikely(dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC))) {
2242 xfs_buf_relse(bp); 2246 xfs_buf_relse(bp);
2243 xfs_alert(mp, 2247 xfs_alert(mp,
2244 "%s: Bad inode magic number, dip = 0x%p, dino bp = 0x%p, ino = %Ld", 2248 "%s: Bad inode magic number, dip = 0x%p, dino bp = 0x%p, ino = %Ld",
@@ -2279,7 +2283,7 @@ xlog_recover_inode_pass2(
2279 /* Take the opportunity to reset the flush iteration count */ 2283 /* Take the opportunity to reset the flush iteration count */
2280 dicp->di_flushiter = 0; 2284 dicp->di_flushiter = 0;
2281 2285
2282 if (unlikely((dicp->di_mode & S_IFMT) == S_IFREG)) { 2286 if (unlikely(S_ISREG(dicp->di_mode))) {
2283 if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) && 2287 if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) &&
2284 (dicp->di_format != XFS_DINODE_FMT_BTREE)) { 2288 (dicp->di_format != XFS_DINODE_FMT_BTREE)) {
2285 XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)", 2289 XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)",
@@ -2292,7 +2296,7 @@ xlog_recover_inode_pass2(
2292 error = EFSCORRUPTED; 2296 error = EFSCORRUPTED;
2293 goto error; 2297 goto error;
2294 } 2298 }
2295 } else if (unlikely((dicp->di_mode & S_IFMT) == S_IFDIR)) { 2299 } else if (unlikely(S_ISDIR(dicp->di_mode))) {
2296 if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) && 2300 if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) &&
2297 (dicp->di_format != XFS_DINODE_FMT_BTREE) && 2301 (dicp->di_format != XFS_DINODE_FMT_BTREE) &&
2298 (dicp->di_format != XFS_DINODE_FMT_LOCAL)) { 2302 (dicp->di_format != XFS_DINODE_FMT_LOCAL)) {
@@ -2434,7 +2438,7 @@ xlog_recover_inode_pass2(
2434 2438
2435write_inode_buffer: 2439write_inode_buffer:
2436 ASSERT(bp->b_target->bt_mount == mp); 2440 ASSERT(bp->b_target->bt_mount == mp);
2437 XFS_BUF_SET_IODONE_FUNC(bp, xlog_recover_iodone); 2441 bp->b_iodone = xlog_recover_iodone;
2438 xfs_bdwrite(mp, bp); 2442 xfs_bdwrite(mp, bp);
2439error: 2443error:
2440 if (need_free) 2444 if (need_free)
@@ -2556,7 +2560,7 @@ xlog_recover_dquot_pass2(
2556 2560
2557 ASSERT(dq_f->qlf_size == 2); 2561 ASSERT(dq_f->qlf_size == 2);
2558 ASSERT(bp->b_target->bt_mount == mp); 2562 ASSERT(bp->b_target->bt_mount == mp);
2559 XFS_BUF_SET_IODONE_FUNC(bp, xlog_recover_iodone); 2563 bp->b_iodone = xlog_recover_iodone;
2560 xfs_bdwrite(mp, bp); 2564 xfs_bdwrite(mp, bp);
2561 2565
2562 return (0); 2566 return (0);
@@ -3295,7 +3299,7 @@ xlog_valid_rec_header(
3295{ 3299{
3296 int hlen; 3300 int hlen;
3297 3301
3298 if (unlikely(be32_to_cpu(rhead->h_magicno) != XLOG_HEADER_MAGIC_NUM)) { 3302 if (unlikely(rhead->h_magicno != cpu_to_be32(XLOG_HEADER_MAGIC_NUM))) {
3299 XFS_ERROR_REPORT("xlog_valid_rec_header(1)", 3303 XFS_ERROR_REPORT("xlog_valid_rec_header(1)",
3300 XFS_ERRLEVEL_LOW, log->l_mp); 3304 XFS_ERRLEVEL_LOW, log->l_mp);
3301 return XFS_ERROR(EFSCORRUPTED); 3305 return XFS_ERROR(EFSCORRUPTED);
@@ -3433,7 +3437,7 @@ xlog_do_recovery_pass(
3433 /* 3437 /*
3434 * Check for header wrapping around physical end-of-log 3438 * Check for header wrapping around physical end-of-log
3435 */ 3439 */
3436 offset = XFS_BUF_PTR(hbp); 3440 offset = hbp->b_addr;
3437 split_hblks = 0; 3441 split_hblks = 0;
3438 wrapped_hblks = 0; 3442 wrapped_hblks = 0;
3439 if (blk_no + hblks <= log->l_logBBsize) { 3443 if (blk_no + hblks <= log->l_logBBsize) {
@@ -3493,7 +3497,7 @@ xlog_do_recovery_pass(
3493 } else { 3497 } else {
3494 /* This log record is split across the 3498 /* This log record is split across the
3495 * physical end of log */ 3499 * physical end of log */
3496 offset = XFS_BUF_PTR(dbp); 3500 offset = dbp->b_addr;
3497 split_bblks = 0; 3501 split_bblks = 0;
3498 if (blk_no != log->l_logBBsize) { 3502 if (blk_no != log->l_logBBsize) {
3499 /* some data is before the physical 3503 /* some data is before the physical