diff options
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r-- | fs/xfs/xfs_log_recover.c | 80 |
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 | ||
125 | STATIC void | 129 | STATIC 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 | |||
356 | xlog_recover_iodone( | 356 | xlog_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 | ||
2435 | write_inode_buffer: | 2439 | write_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); |
2439 | error: | 2443 | error: |
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 |