diff options
| author | Dave Chinner <david@fromorbit.com> | 2015-02-23 18:24:07 -0500 |
|---|---|---|
| committer | Dave Chinner <david@fromorbit.com> | 2015-02-23 18:24:07 -0500 |
| commit | 3cabb836d801c3ad791c2dc6be07ec5819ab0a37 (patch) | |
| tree | dbc5bff557d23e978fd3c8920c7d99d8c09fa272 /fs | |
| parent | 83d5f01858b56db69c8e4ca5389ef7c29bfdb5dd (diff) | |
| parent | 444a702231412e82fb1c09679adc159301e9242c (diff) | |
Merge branch 'xfs-misc-fixes-for-4.1' into for-next
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/xfs/libxfs/xfs_alloc.c | 104 | ||||
| -rw-r--r-- | fs/xfs/libxfs/xfs_bmap.c | 134 | ||||
| -rw-r--r-- | fs/xfs/libxfs/xfs_btree.c | 24 | ||||
| -rw-r--r-- | fs/xfs/libxfs/xfs_dir2_data.c | 39 | ||||
| -rw-r--r-- | fs/xfs/libxfs/xfs_ialloc.c | 42 | ||||
| -rw-r--r-- | fs/xfs/libxfs/xfs_sb.c | 8 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf_item.c | 4 | ||||
| -rw-r--r-- | fs/xfs/xfs_discard.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_error.h | 8 | ||||
| -rw-r--r-- | fs/xfs/xfs_icache.c | 4 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.c | 22 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.h | 22 | ||||
| -rw-r--r-- | fs/xfs/xfs_iops.c | 24 | ||||
| -rw-r--r-- | fs/xfs/xfs_iops.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_itable.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_qm.c | 13 | ||||
| -rw-r--r-- | fs/xfs/xfs_super.c | 21 | ||||
| -rw-r--r-- | fs/xfs/xfs_symlink.c | 58 |
18 files changed, 279 insertions, 254 deletions
diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index a6fbf4472017..516162be1398 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c | |||
| @@ -260,6 +260,7 @@ xfs_alloc_fix_len( | |||
| 260 | rlen = rlen - (k - args->mod); | 260 | rlen = rlen - (k - args->mod); |
| 261 | else | 261 | else |
| 262 | rlen = rlen - args->prod + (args->mod - k); | 262 | rlen = rlen - args->prod + (args->mod - k); |
| 263 | /* casts to (int) catch length underflows */ | ||
| 263 | if ((int)rlen < (int)args->minlen) | 264 | if ((int)rlen < (int)args->minlen) |
| 264 | return; | 265 | return; |
| 265 | ASSERT(rlen >= args->minlen && rlen <= args->maxlen); | 266 | ASSERT(rlen >= args->minlen && rlen <= args->maxlen); |
| @@ -286,7 +287,8 @@ xfs_alloc_fix_minleft( | |||
| 286 | if (diff >= 0) | 287 | if (diff >= 0) |
| 287 | return 1; | 288 | return 1; |
| 288 | args->len += diff; /* shrink the allocated space */ | 289 | args->len += diff; /* shrink the allocated space */ |
| 289 | if (args->len >= args->minlen) | 290 | /* casts to (int) catch length underflows */ |
| 291 | if ((int)args->len >= (int)args->minlen) | ||
| 290 | return 1; | 292 | return 1; |
| 291 | args->agbno = NULLAGBLOCK; | 293 | args->agbno = NULLAGBLOCK; |
| 292 | return 0; | 294 | return 0; |
| @@ -315,6 +317,9 @@ xfs_alloc_fixup_trees( | |||
| 315 | xfs_agblock_t nfbno2; /* second new free startblock */ | 317 | xfs_agblock_t nfbno2; /* second new free startblock */ |
| 316 | xfs_extlen_t nflen1=0; /* first new free length */ | 318 | xfs_extlen_t nflen1=0; /* first new free length */ |
| 317 | xfs_extlen_t nflen2=0; /* second new free length */ | 319 | xfs_extlen_t nflen2=0; /* second new free length */ |
| 320 | struct xfs_mount *mp; | ||
| 321 | |||
| 322 | mp = cnt_cur->bc_mp; | ||
| 318 | 323 | ||
| 319 | /* | 324 | /* |
| 320 | * Look up the record in the by-size tree if necessary. | 325 | * Look up the record in the by-size tree if necessary. |
| @@ -323,13 +328,13 @@ xfs_alloc_fixup_trees( | |||
| 323 | #ifdef DEBUG | 328 | #ifdef DEBUG |
| 324 | if ((error = xfs_alloc_get_rec(cnt_cur, &nfbno1, &nflen1, &i))) | 329 | if ((error = xfs_alloc_get_rec(cnt_cur, &nfbno1, &nflen1, &i))) |
| 325 | return error; | 330 | return error; |
| 326 | XFS_WANT_CORRUPTED_RETURN( | 331 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 327 | i == 1 && nfbno1 == fbno && nflen1 == flen); | 332 | i == 1 && nfbno1 == fbno && nflen1 == flen); |
| 328 | #endif | 333 | #endif |
| 329 | } else { | 334 | } else { |
| 330 | if ((error = xfs_alloc_lookup_eq(cnt_cur, fbno, flen, &i))) | 335 | if ((error = xfs_alloc_lookup_eq(cnt_cur, fbno, flen, &i))) |
| 331 | return error; | 336 | return error; |
| 332 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 337 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 333 | } | 338 | } |
| 334 | /* | 339 | /* |
| 335 | * Look up the record in the by-block tree if necessary. | 340 | * Look up the record in the by-block tree if necessary. |
| @@ -338,13 +343,13 @@ xfs_alloc_fixup_trees( | |||
| 338 | #ifdef DEBUG | 343 | #ifdef DEBUG |
| 339 | if ((error = xfs_alloc_get_rec(bno_cur, &nfbno1, &nflen1, &i))) | 344 | if ((error = xfs_alloc_get_rec(bno_cur, &nfbno1, &nflen1, &i))) |
| 340 | return error; | 345 | return error; |
| 341 | XFS_WANT_CORRUPTED_RETURN( | 346 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 342 | i == 1 && nfbno1 == fbno && nflen1 == flen); | 347 | i == 1 && nfbno1 == fbno && nflen1 == flen); |
| 343 | #endif | 348 | #endif |
| 344 | } else { | 349 | } else { |
| 345 | if ((error = xfs_alloc_lookup_eq(bno_cur, fbno, flen, &i))) | 350 | if ((error = xfs_alloc_lookup_eq(bno_cur, fbno, flen, &i))) |
| 346 | return error; | 351 | return error; |
| 347 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 352 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 348 | } | 353 | } |
| 349 | 354 | ||
| 350 | #ifdef DEBUG | 355 | #ifdef DEBUG |
| @@ -355,7 +360,7 @@ xfs_alloc_fixup_trees( | |||
| 355 | bnoblock = XFS_BUF_TO_BLOCK(bno_cur->bc_bufs[0]); | 360 | bnoblock = XFS_BUF_TO_BLOCK(bno_cur->bc_bufs[0]); |
| 356 | cntblock = XFS_BUF_TO_BLOCK(cnt_cur->bc_bufs[0]); | 361 | cntblock = XFS_BUF_TO_BLOCK(cnt_cur->bc_bufs[0]); |
| 357 | 362 | ||
| 358 | XFS_WANT_CORRUPTED_RETURN( | 363 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 359 | bnoblock->bb_numrecs == cntblock->bb_numrecs); | 364 | bnoblock->bb_numrecs == cntblock->bb_numrecs); |
| 360 | } | 365 | } |
| 361 | #endif | 366 | #endif |
| @@ -386,25 +391,25 @@ xfs_alloc_fixup_trees( | |||
| 386 | */ | 391 | */ |
| 387 | if ((error = xfs_btree_delete(cnt_cur, &i))) | 392 | if ((error = xfs_btree_delete(cnt_cur, &i))) |
| 388 | return error; | 393 | return error; |
| 389 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 394 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 390 | /* | 395 | /* |
| 391 | * Add new by-size btree entry(s). | 396 | * Add new by-size btree entry(s). |
| 392 | */ | 397 | */ |
| 393 | if (nfbno1 != NULLAGBLOCK) { | 398 | if (nfbno1 != NULLAGBLOCK) { |
| 394 | if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno1, nflen1, &i))) | 399 | if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno1, nflen1, &i))) |
| 395 | return error; | 400 | return error; |
| 396 | XFS_WANT_CORRUPTED_RETURN(i == 0); | 401 | XFS_WANT_CORRUPTED_RETURN(mp, i == 0); |
| 397 | if ((error = xfs_btree_insert(cnt_cur, &i))) | 402 | if ((error = xfs_btree_insert(cnt_cur, &i))) |
| 398 | return error; | 403 | return error; |
| 399 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 404 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 400 | } | 405 | } |
| 401 | if (nfbno2 != NULLAGBLOCK) { | 406 | if (nfbno2 != NULLAGBLOCK) { |
| 402 | if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno2, nflen2, &i))) | 407 | if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno2, nflen2, &i))) |
| 403 | return error; | 408 | return error; |
| 404 | XFS_WANT_CORRUPTED_RETURN(i == 0); | 409 | XFS_WANT_CORRUPTED_RETURN(mp, i == 0); |
| 405 | if ((error = xfs_btree_insert(cnt_cur, &i))) | 410 | if ((error = xfs_btree_insert(cnt_cur, &i))) |
| 406 | return error; | 411 | return error; |
| 407 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 412 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 408 | } | 413 | } |
| 409 | /* | 414 | /* |
| 410 | * Fix up the by-block btree entry(s). | 415 | * Fix up the by-block btree entry(s). |
| @@ -415,7 +420,7 @@ xfs_alloc_fixup_trees( | |||
| 415 | */ | 420 | */ |
| 416 | if ((error = xfs_btree_delete(bno_cur, &i))) | 421 | if ((error = xfs_btree_delete(bno_cur, &i))) |
| 417 | return error; | 422 | return error; |
| 418 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 423 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 419 | } else { | 424 | } else { |
| 420 | /* | 425 | /* |
| 421 | * Update the by-block entry to start later|be shorter. | 426 | * Update the by-block entry to start later|be shorter. |
| @@ -429,10 +434,10 @@ xfs_alloc_fixup_trees( | |||
| 429 | */ | 434 | */ |
| 430 | if ((error = xfs_alloc_lookup_eq(bno_cur, nfbno2, nflen2, &i))) | 435 | if ((error = xfs_alloc_lookup_eq(bno_cur, nfbno2, nflen2, &i))) |
| 431 | return error; | 436 | return error; |
| 432 | XFS_WANT_CORRUPTED_RETURN(i == 0); | 437 | XFS_WANT_CORRUPTED_RETURN(mp, i == 0); |
| 433 | if ((error = xfs_btree_insert(bno_cur, &i))) | 438 | if ((error = xfs_btree_insert(bno_cur, &i))) |
| 434 | return error; | 439 | return error; |
| 435 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 440 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 436 | } | 441 | } |
| 437 | return 0; | 442 | return 0; |
| 438 | } | 443 | } |
| @@ -682,7 +687,7 @@ xfs_alloc_ag_vextent_exact( | |||
| 682 | error = xfs_alloc_get_rec(bno_cur, &fbno, &flen, &i); | 687 | error = xfs_alloc_get_rec(bno_cur, &fbno, &flen, &i); |
| 683 | if (error) | 688 | if (error) |
| 684 | goto error0; | 689 | goto error0; |
| 685 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 690 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 686 | ASSERT(fbno <= args->agbno); | 691 | ASSERT(fbno <= args->agbno); |
| 687 | 692 | ||
| 688 | /* | 693 | /* |
| @@ -783,7 +788,7 @@ xfs_alloc_find_best_extent( | |||
| 783 | error = xfs_alloc_get_rec(*scur, sbno, slen, &i); | 788 | error = xfs_alloc_get_rec(*scur, sbno, slen, &i); |
| 784 | if (error) | 789 | if (error) |
| 785 | goto error0; | 790 | goto error0; |
| 786 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 791 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 787 | xfs_alloc_compute_aligned(args, *sbno, *slen, sbnoa, slena); | 792 | xfs_alloc_compute_aligned(args, *sbno, *slen, sbnoa, slena); |
| 788 | 793 | ||
| 789 | /* | 794 | /* |
| @@ -946,7 +951,7 @@ restart: | |||
| 946 | if ((error = xfs_alloc_get_rec(cnt_cur, <bno, | 951 | if ((error = xfs_alloc_get_rec(cnt_cur, <bno, |
| 947 | <len, &i))) | 952 | <len, &i))) |
| 948 | goto error0; | 953 | goto error0; |
| 949 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 954 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 950 | if (ltlen >= args->minlen) | 955 | if (ltlen >= args->minlen) |
| 951 | break; | 956 | break; |
| 952 | if ((error = xfs_btree_increment(cnt_cur, 0, &i))) | 957 | if ((error = xfs_btree_increment(cnt_cur, 0, &i))) |
| @@ -966,7 +971,7 @@ restart: | |||
| 966 | */ | 971 | */ |
| 967 | if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) | 972 | if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) |
| 968 | goto error0; | 973 | goto error0; |
| 969 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 974 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 970 | xfs_alloc_compute_aligned(args, ltbno, ltlen, | 975 | xfs_alloc_compute_aligned(args, ltbno, ltlen, |
| 971 | <bnoa, <lena); | 976 | <bnoa, <lena); |
| 972 | if (ltlena < args->minlen) | 977 | if (ltlena < args->minlen) |
| @@ -999,7 +1004,7 @@ restart: | |||
| 999 | cnt_cur->bc_ptrs[0] = besti; | 1004 | cnt_cur->bc_ptrs[0] = besti; |
| 1000 | if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) | 1005 | if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) |
| 1001 | goto error0; | 1006 | goto error0; |
| 1002 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1007 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 1003 | ASSERT(ltbno + ltlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); | 1008 | ASSERT(ltbno + ltlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); |
| 1004 | args->len = blen; | 1009 | args->len = blen; |
| 1005 | if (!xfs_alloc_fix_minleft(args)) { | 1010 | if (!xfs_alloc_fix_minleft(args)) { |
| @@ -1088,7 +1093,7 @@ restart: | |||
| 1088 | if (bno_cur_lt) { | 1093 | if (bno_cur_lt) { |
| 1089 | if ((error = xfs_alloc_get_rec(bno_cur_lt, <bno, <len, &i))) | 1094 | if ((error = xfs_alloc_get_rec(bno_cur_lt, <bno, <len, &i))) |
| 1090 | goto error0; | 1095 | goto error0; |
| 1091 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1096 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 1092 | xfs_alloc_compute_aligned(args, ltbno, ltlen, | 1097 | xfs_alloc_compute_aligned(args, ltbno, ltlen, |
| 1093 | <bnoa, <lena); | 1098 | <bnoa, <lena); |
| 1094 | if (ltlena >= args->minlen) | 1099 | if (ltlena >= args->minlen) |
| @@ -1104,7 +1109,7 @@ restart: | |||
| 1104 | if (bno_cur_gt) { | 1109 | if (bno_cur_gt) { |
| 1105 | if ((error = xfs_alloc_get_rec(bno_cur_gt, >bno, >len, &i))) | 1110 | if ((error = xfs_alloc_get_rec(bno_cur_gt, >bno, >len, &i))) |
| 1106 | goto error0; | 1111 | goto error0; |
| 1107 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1112 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 1108 | xfs_alloc_compute_aligned(args, gtbno, gtlen, | 1113 | xfs_alloc_compute_aligned(args, gtbno, gtlen, |
| 1109 | >bnoa, >lena); | 1114 | >bnoa, >lena); |
| 1110 | if (gtlena >= args->minlen) | 1115 | if (gtlena >= args->minlen) |
| @@ -1303,7 +1308,7 @@ restart: | |||
| 1303 | error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i); | 1308 | error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i); |
| 1304 | if (error) | 1309 | if (error) |
| 1305 | goto error0; | 1310 | goto error0; |
| 1306 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1311 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 1307 | 1312 | ||
| 1308 | xfs_alloc_compute_aligned(args, fbno, flen, | 1313 | xfs_alloc_compute_aligned(args, fbno, flen, |
| 1309 | &rbno, &rlen); | 1314 | &rbno, &rlen); |
| @@ -1342,7 +1347,7 @@ restart: | |||
| 1342 | * This can't happen in the second case above. | 1347 | * This can't happen in the second case above. |
| 1343 | */ | 1348 | */ |
| 1344 | rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); | 1349 | rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); |
| 1345 | XFS_WANT_CORRUPTED_GOTO(rlen == 0 || | 1350 | XFS_WANT_CORRUPTED_GOTO(args->mp, rlen == 0 || |
| 1346 | (rlen <= flen && rbno + rlen <= fbno + flen), error0); | 1351 | (rlen <= flen && rbno + rlen <= fbno + flen), error0); |
| 1347 | if (rlen < args->maxlen) { | 1352 | if (rlen < args->maxlen) { |
| 1348 | xfs_agblock_t bestfbno; | 1353 | xfs_agblock_t bestfbno; |
| @@ -1362,13 +1367,13 @@ restart: | |||
| 1362 | if ((error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, | 1367 | if ((error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, |
| 1363 | &i))) | 1368 | &i))) |
| 1364 | goto error0; | 1369 | goto error0; |
| 1365 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1370 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 1366 | if (flen < bestrlen) | 1371 | if (flen < bestrlen) |
| 1367 | break; | 1372 | break; |
| 1368 | xfs_alloc_compute_aligned(args, fbno, flen, | 1373 | xfs_alloc_compute_aligned(args, fbno, flen, |
| 1369 | &rbno, &rlen); | 1374 | &rbno, &rlen); |
| 1370 | rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); | 1375 | rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); |
| 1371 | XFS_WANT_CORRUPTED_GOTO(rlen == 0 || | 1376 | XFS_WANT_CORRUPTED_GOTO(args->mp, rlen == 0 || |
| 1372 | (rlen <= flen && rbno + rlen <= fbno + flen), | 1377 | (rlen <= flen && rbno + rlen <= fbno + flen), |
| 1373 | error0); | 1378 | error0); |
| 1374 | if (rlen > bestrlen) { | 1379 | if (rlen > bestrlen) { |
| @@ -1383,7 +1388,7 @@ restart: | |||
| 1383 | if ((error = xfs_alloc_lookup_eq(cnt_cur, bestfbno, bestflen, | 1388 | if ((error = xfs_alloc_lookup_eq(cnt_cur, bestfbno, bestflen, |
| 1384 | &i))) | 1389 | &i))) |
| 1385 | goto error0; | 1390 | goto error0; |
| 1386 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1391 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 1387 | rlen = bestrlen; | 1392 | rlen = bestrlen; |
| 1388 | rbno = bestrbno; | 1393 | rbno = bestrbno; |
| 1389 | flen = bestflen; | 1394 | flen = bestflen; |
| @@ -1408,7 +1413,7 @@ restart: | |||
| 1408 | if (!xfs_alloc_fix_minleft(args)) | 1413 | if (!xfs_alloc_fix_minleft(args)) |
| 1409 | goto out_nominleft; | 1414 | goto out_nominleft; |
| 1410 | rlen = args->len; | 1415 | rlen = args->len; |
| 1411 | XFS_WANT_CORRUPTED_GOTO(rlen <= flen, error0); | 1416 | XFS_WANT_CORRUPTED_GOTO(args->mp, rlen <= flen, error0); |
| 1412 | /* | 1417 | /* |
| 1413 | * Allocate and initialize a cursor for the by-block tree. | 1418 | * Allocate and initialize a cursor for the by-block tree. |
| 1414 | */ | 1419 | */ |
| @@ -1422,7 +1427,7 @@ restart: | |||
| 1422 | cnt_cur = bno_cur = NULL; | 1427 | cnt_cur = bno_cur = NULL; |
| 1423 | args->len = rlen; | 1428 | args->len = rlen; |
| 1424 | args->agbno = rbno; | 1429 | args->agbno = rbno; |
| 1425 | XFS_WANT_CORRUPTED_GOTO( | 1430 | XFS_WANT_CORRUPTED_GOTO(args->mp, |
| 1426 | args->agbno + args->len <= | 1431 | args->agbno + args->len <= |
| 1427 | be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), | 1432 | be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), |
| 1428 | error0); | 1433 | error0); |
| @@ -1467,7 +1472,7 @@ xfs_alloc_ag_vextent_small( | |||
| 1467 | if (i) { | 1472 | if (i) { |
| 1468 | if ((error = xfs_alloc_get_rec(ccur, &fbno, &flen, &i))) | 1473 | if ((error = xfs_alloc_get_rec(ccur, &fbno, &flen, &i))) |
| 1469 | goto error0; | 1474 | goto error0; |
| 1470 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1475 | XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); |
| 1471 | } | 1476 | } |
| 1472 | /* | 1477 | /* |
| 1473 | * Nothing in the btree, try the freelist. Make sure | 1478 | * Nothing in the btree, try the freelist. Make sure |
| @@ -1493,7 +1498,7 @@ xfs_alloc_ag_vextent_small( | |||
| 1493 | } | 1498 | } |
| 1494 | args->len = 1; | 1499 | args->len = 1; |
| 1495 | args->agbno = fbno; | 1500 | args->agbno = fbno; |
| 1496 | XFS_WANT_CORRUPTED_GOTO( | 1501 | XFS_WANT_CORRUPTED_GOTO(args->mp, |
| 1497 | args->agbno + args->len <= | 1502 | args->agbno + args->len <= |
| 1498 | be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), | 1503 | be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), |
| 1499 | error0); | 1504 | error0); |
| @@ -1579,7 +1584,7 @@ xfs_free_ag_extent( | |||
| 1579 | */ | 1584 | */ |
| 1580 | if ((error = xfs_alloc_get_rec(bno_cur, <bno, <len, &i))) | 1585 | if ((error = xfs_alloc_get_rec(bno_cur, <bno, <len, &i))) |
| 1581 | goto error0; | 1586 | goto error0; |
| 1582 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1587 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1583 | /* | 1588 | /* |
| 1584 | * It's not contiguous, though. | 1589 | * It's not contiguous, though. |
| 1585 | */ | 1590 | */ |
| @@ -1591,7 +1596,8 @@ xfs_free_ag_extent( | |||
| 1591 | * space was invalid, it's (partly) already free. | 1596 | * space was invalid, it's (partly) already free. |
| 1592 | * Very bad. | 1597 | * Very bad. |
| 1593 | */ | 1598 | */ |
| 1594 | XFS_WANT_CORRUPTED_GOTO(ltbno + ltlen <= bno, error0); | 1599 | XFS_WANT_CORRUPTED_GOTO(mp, |
| 1600 | ltbno + ltlen <= bno, error0); | ||
| 1595 | } | 1601 | } |
| 1596 | } | 1602 | } |
| 1597 | /* | 1603 | /* |
| @@ -1606,7 +1612,7 @@ xfs_free_ag_extent( | |||
| 1606 | */ | 1612 | */ |
| 1607 | if ((error = xfs_alloc_get_rec(bno_cur, >bno, >len, &i))) | 1613 | if ((error = xfs_alloc_get_rec(bno_cur, >bno, >len, &i))) |
| 1608 | goto error0; | 1614 | goto error0; |
| 1609 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1615 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1610 | /* | 1616 | /* |
| 1611 | * It's not contiguous, though. | 1617 | * It's not contiguous, though. |
| 1612 | */ | 1618 | */ |
| @@ -1618,7 +1624,7 @@ xfs_free_ag_extent( | |||
| 1618 | * space was invalid, it's (partly) already free. | 1624 | * space was invalid, it's (partly) already free. |
| 1619 | * Very bad. | 1625 | * Very bad. |
| 1620 | */ | 1626 | */ |
| 1621 | XFS_WANT_CORRUPTED_GOTO(gtbno >= bno + len, error0); | 1627 | XFS_WANT_CORRUPTED_GOTO(mp, gtbno >= bno + len, error0); |
| 1622 | } | 1628 | } |
| 1623 | } | 1629 | } |
| 1624 | /* | 1630 | /* |
| @@ -1635,31 +1641,31 @@ xfs_free_ag_extent( | |||
| 1635 | */ | 1641 | */ |
| 1636 | if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i))) | 1642 | if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i))) |
| 1637 | goto error0; | 1643 | goto error0; |
| 1638 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1644 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1639 | if ((error = xfs_btree_delete(cnt_cur, &i))) | 1645 | if ((error = xfs_btree_delete(cnt_cur, &i))) |
| 1640 | goto error0; | 1646 | goto error0; |
| 1641 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1647 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1642 | /* | 1648 | /* |
| 1643 | * Delete the old by-size entry on the right. | 1649 | * Delete the old by-size entry on the right. |
| 1644 | */ | 1650 | */ |
| 1645 | if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i))) | 1651 | if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i))) |
| 1646 | goto error0; | 1652 | goto error0; |
| 1647 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1653 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1648 | if ((error = xfs_btree_delete(cnt_cur, &i))) | 1654 | if ((error = xfs_btree_delete(cnt_cur, &i))) |
| 1649 | goto error0; | 1655 | goto error0; |
| 1650 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1656 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1651 | /* | 1657 | /* |
| 1652 | * Delete the old by-block entry for the right block. | 1658 | * Delete the old by-block entry for the right block. |
| 1653 | */ | 1659 | */ |
| 1654 | if ((error = xfs_btree_delete(bno_cur, &i))) | 1660 | if ((error = xfs_btree_delete(bno_cur, &i))) |
| 1655 | goto error0; | 1661 | goto error0; |
| 1656 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1662 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1657 | /* | 1663 | /* |
| 1658 | * Move the by-block cursor back to the left neighbor. | 1664 | * Move the by-block cursor back to the left neighbor. |
| 1659 | */ | 1665 | */ |
| 1660 | if ((error = xfs_btree_decrement(bno_cur, 0, &i))) | 1666 | if ((error = xfs_btree_decrement(bno_cur, 0, &i))) |
| 1661 | goto error0; | 1667 | goto error0; |
| 1662 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1668 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1663 | #ifdef DEBUG | 1669 | #ifdef DEBUG |
| 1664 | /* | 1670 | /* |
| 1665 | * Check that this is the right record: delete didn't | 1671 | * Check that this is the right record: delete didn't |
| @@ -1672,7 +1678,7 @@ xfs_free_ag_extent( | |||
| 1672 | if ((error = xfs_alloc_get_rec(bno_cur, &xxbno, &xxlen, | 1678 | if ((error = xfs_alloc_get_rec(bno_cur, &xxbno, &xxlen, |
| 1673 | &i))) | 1679 | &i))) |
| 1674 | goto error0; | 1680 | goto error0; |
| 1675 | XFS_WANT_CORRUPTED_GOTO( | 1681 | XFS_WANT_CORRUPTED_GOTO(mp, |
| 1676 | i == 1 && xxbno == ltbno && xxlen == ltlen, | 1682 | i == 1 && xxbno == ltbno && xxlen == ltlen, |
| 1677 | error0); | 1683 | error0); |
| 1678 | } | 1684 | } |
| @@ -1695,17 +1701,17 @@ xfs_free_ag_extent( | |||
| 1695 | */ | 1701 | */ |
| 1696 | if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i))) | 1702 | if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i))) |
| 1697 | goto error0; | 1703 | goto error0; |
| 1698 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1704 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1699 | if ((error = xfs_btree_delete(cnt_cur, &i))) | 1705 | if ((error = xfs_btree_delete(cnt_cur, &i))) |
| 1700 | goto error0; | 1706 | goto error0; |
| 1701 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1707 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1702 | /* | 1708 | /* |
| 1703 | * Back up the by-block cursor to the left neighbor, and | 1709 | * Back up the by-block cursor to the left neighbor, and |
| 1704 | * update its length. | 1710 | * update its length. |
| 1705 | */ | 1711 | */ |
| 1706 | if ((error = xfs_btree_decrement(bno_cur, 0, &i))) | 1712 | if ((error = xfs_btree_decrement(bno_cur, 0, &i))) |
| 1707 | goto error0; | 1713 | goto error0; |
| 1708 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1714 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1709 | nbno = ltbno; | 1715 | nbno = ltbno; |
| 1710 | nlen = len + ltlen; | 1716 | nlen = len + ltlen; |
| 1711 | if ((error = xfs_alloc_update(bno_cur, nbno, nlen))) | 1717 | if ((error = xfs_alloc_update(bno_cur, nbno, nlen))) |
| @@ -1721,10 +1727,10 @@ xfs_free_ag_extent( | |||
| 1721 | */ | 1727 | */ |
| 1722 | if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i))) | 1728 | if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i))) |
| 1723 | goto error0; | 1729 | goto error0; |
| 1724 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1730 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1725 | if ((error = xfs_btree_delete(cnt_cur, &i))) | 1731 | if ((error = xfs_btree_delete(cnt_cur, &i))) |
| 1726 | goto error0; | 1732 | goto error0; |
| 1727 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1733 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1728 | /* | 1734 | /* |
| 1729 | * Update the starting block and length of the right | 1735 | * Update the starting block and length of the right |
| 1730 | * neighbor in the by-block tree. | 1736 | * neighbor in the by-block tree. |
| @@ -1743,7 +1749,7 @@ xfs_free_ag_extent( | |||
| 1743 | nlen = len; | 1749 | nlen = len; |
| 1744 | if ((error = xfs_btree_insert(bno_cur, &i))) | 1750 | if ((error = xfs_btree_insert(bno_cur, &i))) |
| 1745 | goto error0; | 1751 | goto error0; |
| 1746 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1752 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1747 | } | 1753 | } |
| 1748 | xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); | 1754 | xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); |
| 1749 | bno_cur = NULL; | 1755 | bno_cur = NULL; |
| @@ -1752,10 +1758,10 @@ xfs_free_ag_extent( | |||
| 1752 | */ | 1758 | */ |
| 1753 | if ((error = xfs_alloc_lookup_eq(cnt_cur, nbno, nlen, &i))) | 1759 | if ((error = xfs_alloc_lookup_eq(cnt_cur, nbno, nlen, &i))) |
| 1754 | goto error0; | 1760 | goto error0; |
| 1755 | XFS_WANT_CORRUPTED_GOTO(i == 0, error0); | 1761 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, error0); |
| 1756 | if ((error = xfs_btree_insert(cnt_cur, &i))) | 1762 | if ((error = xfs_btree_insert(cnt_cur, &i))) |
| 1757 | goto error0; | 1763 | goto error0; |
| 1758 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1764 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1759 | xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); | 1765 | xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); |
| 1760 | cnt_cur = NULL; | 1766 | cnt_cur = NULL; |
| 1761 | 1767 | ||
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 61ec015dca16..60cfa90163b8 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c | |||
| @@ -410,7 +410,7 @@ xfs_bmap_check_leaf_extents( | |||
| 410 | goto error_norelse; | 410 | goto error_norelse; |
| 411 | } | 411 | } |
| 412 | block = XFS_BUF_TO_BLOCK(bp); | 412 | block = XFS_BUF_TO_BLOCK(bp); |
| 413 | XFS_WANT_CORRUPTED_GOTO( | 413 | XFS_WANT_CORRUPTED_GOTO(mp, |
| 414 | xfs_bmap_sanity_check(mp, bp, level), | 414 | xfs_bmap_sanity_check(mp, bp, level), |
| 415 | error0); | 415 | error0); |
| 416 | if (level == 0) | 416 | if (level == 0) |
| @@ -424,7 +424,8 @@ xfs_bmap_check_leaf_extents( | |||
| 424 | xfs_check_block(block, mp, 0, 0); | 424 | xfs_check_block(block, mp, 0, 0); |
| 425 | pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); | 425 | pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); |
| 426 | bno = be64_to_cpu(*pp); | 426 | bno = be64_to_cpu(*pp); |
| 427 | XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); | 427 | XFS_WANT_CORRUPTED_GOTO(mp, |
| 428 | XFS_FSB_SANITY_CHECK(mp, bno), error0); | ||
| 428 | if (bp_release) { | 429 | if (bp_release) { |
| 429 | bp_release = 0; | 430 | bp_release = 0; |
| 430 | xfs_trans_brelse(NULL, bp); | 431 | xfs_trans_brelse(NULL, bp); |
| @@ -1029,7 +1030,7 @@ xfs_bmap_add_attrfork_btree( | |||
| 1029 | if ((error = xfs_bmbt_lookup_ge(cur, 0, 0, 0, &stat))) | 1030 | if ((error = xfs_bmbt_lookup_ge(cur, 0, 0, 0, &stat))) |
| 1030 | goto error0; | 1031 | goto error0; |
| 1031 | /* must be at least one entry */ | 1032 | /* must be at least one entry */ |
| 1032 | XFS_WANT_CORRUPTED_GOTO(stat == 1, error0); | 1033 | XFS_WANT_CORRUPTED_GOTO(mp, stat == 1, error0); |
| 1033 | if ((error = xfs_btree_new_iroot(cur, flags, &stat))) | 1034 | if ((error = xfs_btree_new_iroot(cur, flags, &stat))) |
| 1034 | goto error0; | 1035 | goto error0; |
| 1035 | if (stat == 0) { | 1036 | if (stat == 0) { |
| @@ -1311,14 +1312,14 @@ xfs_bmap_read_extents( | |||
| 1311 | if (error) | 1312 | if (error) |
| 1312 | return error; | 1313 | return error; |
| 1313 | block = XFS_BUF_TO_BLOCK(bp); | 1314 | block = XFS_BUF_TO_BLOCK(bp); |
| 1314 | XFS_WANT_CORRUPTED_GOTO( | 1315 | XFS_WANT_CORRUPTED_GOTO(mp, |
| 1315 | xfs_bmap_sanity_check(mp, bp, level), | 1316 | xfs_bmap_sanity_check(mp, bp, level), error0); |
| 1316 | error0); | ||
| 1317 | if (level == 0) | 1317 | if (level == 0) |
| 1318 | break; | 1318 | break; |
| 1319 | pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); | 1319 | pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); |
| 1320 | bno = be64_to_cpu(*pp); | 1320 | bno = be64_to_cpu(*pp); |
| 1321 | XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); | 1321 | XFS_WANT_CORRUPTED_GOTO(mp, |
| 1322 | XFS_FSB_SANITY_CHECK(mp, bno), error0); | ||
| 1322 | xfs_trans_brelse(tp, bp); | 1323 | xfs_trans_brelse(tp, bp); |
| 1323 | } | 1324 | } |
| 1324 | /* | 1325 | /* |
| @@ -1345,7 +1346,7 @@ xfs_bmap_read_extents( | |||
| 1345 | XFS_ERRLEVEL_LOW, ip->i_mount, block); | 1346 | XFS_ERRLEVEL_LOW, ip->i_mount, block); |
| 1346 | goto error0; | 1347 | goto error0; |
| 1347 | } | 1348 | } |
| 1348 | XFS_WANT_CORRUPTED_GOTO( | 1349 | XFS_WANT_CORRUPTED_GOTO(mp, |
| 1349 | xfs_bmap_sanity_check(mp, bp, 0), | 1350 | xfs_bmap_sanity_check(mp, bp, 0), |
| 1350 | error0); | 1351 | error0); |
| 1351 | /* | 1352 | /* |
| @@ -1755,7 +1756,9 @@ xfs_bmap_add_extent_delay_real( | |||
| 1755 | xfs_filblks_t temp=0; /* value for da_new calculations */ | 1756 | xfs_filblks_t temp=0; /* value for da_new calculations */ |
| 1756 | xfs_filblks_t temp2=0;/* value for da_new calculations */ | 1757 | xfs_filblks_t temp2=0;/* value for da_new calculations */ |
| 1757 | int tmp_rval; /* partial logging flags */ | 1758 | int tmp_rval; /* partial logging flags */ |
| 1759 | struct xfs_mount *mp; | ||
| 1758 | 1760 | ||
| 1761 | mp = bma->tp ? bma->tp->t_mountp : NULL; | ||
| 1759 | ifp = XFS_IFORK_PTR(bma->ip, XFS_DATA_FORK); | 1762 | ifp = XFS_IFORK_PTR(bma->ip, XFS_DATA_FORK); |
| 1760 | 1763 | ||
| 1761 | ASSERT(bma->idx >= 0); | 1764 | ASSERT(bma->idx >= 0); |
| @@ -1866,15 +1869,15 @@ xfs_bmap_add_extent_delay_real( | |||
| 1866 | RIGHT.br_blockcount, &i); | 1869 | RIGHT.br_blockcount, &i); |
| 1867 | if (error) | 1870 | if (error) |
| 1868 | goto done; | 1871 | goto done; |
| 1869 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1872 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 1870 | error = xfs_btree_delete(bma->cur, &i); | 1873 | error = xfs_btree_delete(bma->cur, &i); |
| 1871 | if (error) | 1874 | if (error) |
| 1872 | goto done; | 1875 | goto done; |
| 1873 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1876 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 1874 | error = xfs_btree_decrement(bma->cur, 0, &i); | 1877 | error = xfs_btree_decrement(bma->cur, 0, &i); |
| 1875 | if (error) | 1878 | if (error) |
| 1876 | goto done; | 1879 | goto done; |
| 1877 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1880 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 1878 | error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, | 1881 | error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, |
| 1879 | LEFT.br_startblock, | 1882 | LEFT.br_startblock, |
| 1880 | LEFT.br_blockcount + | 1883 | LEFT.br_blockcount + |
| @@ -1907,7 +1910,7 @@ xfs_bmap_add_extent_delay_real( | |||
| 1907 | &i); | 1910 | &i); |
| 1908 | if (error) | 1911 | if (error) |
| 1909 | goto done; | 1912 | goto done; |
| 1910 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1913 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 1911 | error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, | 1914 | error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, |
| 1912 | LEFT.br_startblock, | 1915 | LEFT.br_startblock, |
| 1913 | LEFT.br_blockcount + | 1916 | LEFT.br_blockcount + |
| @@ -1938,7 +1941,7 @@ xfs_bmap_add_extent_delay_real( | |||
| 1938 | RIGHT.br_blockcount, &i); | 1941 | RIGHT.br_blockcount, &i); |
| 1939 | if (error) | 1942 | if (error) |
| 1940 | goto done; | 1943 | goto done; |
| 1941 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1944 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 1942 | error = xfs_bmbt_update(bma->cur, PREV.br_startoff, | 1945 | error = xfs_bmbt_update(bma->cur, PREV.br_startoff, |
| 1943 | new->br_startblock, | 1946 | new->br_startblock, |
| 1944 | PREV.br_blockcount + | 1947 | PREV.br_blockcount + |
| @@ -1968,12 +1971,12 @@ xfs_bmap_add_extent_delay_real( | |||
| 1968 | &i); | 1971 | &i); |
| 1969 | if (error) | 1972 | if (error) |
| 1970 | goto done; | 1973 | goto done; |
| 1971 | XFS_WANT_CORRUPTED_GOTO(i == 0, done); | 1974 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); |
| 1972 | bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; | 1975 | bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; |
| 1973 | error = xfs_btree_insert(bma->cur, &i); | 1976 | error = xfs_btree_insert(bma->cur, &i); |
| 1974 | if (error) | 1977 | if (error) |
| 1975 | goto done; | 1978 | goto done; |
| 1976 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1979 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 1977 | } | 1980 | } |
| 1978 | break; | 1981 | break; |
| 1979 | 1982 | ||
| @@ -2001,7 +2004,7 @@ xfs_bmap_add_extent_delay_real( | |||
| 2001 | &i); | 2004 | &i); |
| 2002 | if (error) | 2005 | if (error) |
| 2003 | goto done; | 2006 | goto done; |
| 2004 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2007 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2005 | error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, | 2008 | error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, |
| 2006 | LEFT.br_startblock, | 2009 | LEFT.br_startblock, |
| 2007 | LEFT.br_blockcount + | 2010 | LEFT.br_blockcount + |
| @@ -2038,12 +2041,12 @@ xfs_bmap_add_extent_delay_real( | |||
| 2038 | &i); | 2041 | &i); |
| 2039 | if (error) | 2042 | if (error) |
| 2040 | goto done; | 2043 | goto done; |
| 2041 | XFS_WANT_CORRUPTED_GOTO(i == 0, done); | 2044 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); |
| 2042 | bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; | 2045 | bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; |
| 2043 | error = xfs_btree_insert(bma->cur, &i); | 2046 | error = xfs_btree_insert(bma->cur, &i); |
| 2044 | if (error) | 2047 | if (error) |
| 2045 | goto done; | 2048 | goto done; |
| 2046 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2049 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2047 | } | 2050 | } |
| 2048 | 2051 | ||
| 2049 | if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { | 2052 | if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { |
| @@ -2084,7 +2087,7 @@ xfs_bmap_add_extent_delay_real( | |||
| 2084 | RIGHT.br_blockcount, &i); | 2087 | RIGHT.br_blockcount, &i); |
| 2085 | if (error) | 2088 | if (error) |
| 2086 | goto done; | 2089 | goto done; |
| 2087 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2090 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2088 | error = xfs_bmbt_update(bma->cur, new->br_startoff, | 2091 | error = xfs_bmbt_update(bma->cur, new->br_startoff, |
| 2089 | new->br_startblock, | 2092 | new->br_startblock, |
| 2090 | new->br_blockcount + | 2093 | new->br_blockcount + |
| @@ -2122,12 +2125,12 @@ xfs_bmap_add_extent_delay_real( | |||
| 2122 | &i); | 2125 | &i); |
| 2123 | if (error) | 2126 | if (error) |
| 2124 | goto done; | 2127 | goto done; |
| 2125 | XFS_WANT_CORRUPTED_GOTO(i == 0, done); | 2128 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); |
| 2126 | bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; | 2129 | bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; |
| 2127 | error = xfs_btree_insert(bma->cur, &i); | 2130 | error = xfs_btree_insert(bma->cur, &i); |
| 2128 | if (error) | 2131 | if (error) |
| 2129 | goto done; | 2132 | goto done; |
| 2130 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2133 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2131 | } | 2134 | } |
| 2132 | 2135 | ||
| 2133 | if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { | 2136 | if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { |
| @@ -2191,12 +2194,12 @@ xfs_bmap_add_extent_delay_real( | |||
| 2191 | &i); | 2194 | &i); |
| 2192 | if (error) | 2195 | if (error) |
| 2193 | goto done; | 2196 | goto done; |
| 2194 | XFS_WANT_CORRUPTED_GOTO(i == 0, done); | 2197 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); |
| 2195 | bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; | 2198 | bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; |
| 2196 | error = xfs_btree_insert(bma->cur, &i); | 2199 | error = xfs_btree_insert(bma->cur, &i); |
| 2197 | if (error) | 2200 | if (error) |
| 2198 | goto done; | 2201 | goto done; |
| 2199 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2202 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2200 | } | 2203 | } |
| 2201 | 2204 | ||
| 2202 | if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { | 2205 | if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { |
| @@ -2309,6 +2312,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2309 | /* left is 0, right is 1, prev is 2 */ | 2312 | /* left is 0, right is 1, prev is 2 */ |
| 2310 | int rval=0; /* return value (logging flags) */ | 2313 | int rval=0; /* return value (logging flags) */ |
| 2311 | int state = 0;/* state bits, accessed thru macros */ | 2314 | int state = 0;/* state bits, accessed thru macros */ |
| 2315 | struct xfs_mount *mp = tp->t_mountp; | ||
| 2312 | 2316 | ||
| 2313 | *logflagsp = 0; | 2317 | *logflagsp = 0; |
| 2314 | 2318 | ||
| @@ -2421,19 +2425,19 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2421 | RIGHT.br_startblock, | 2425 | RIGHT.br_startblock, |
| 2422 | RIGHT.br_blockcount, &i))) | 2426 | RIGHT.br_blockcount, &i))) |
| 2423 | goto done; | 2427 | goto done; |
| 2424 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2428 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2425 | if ((error = xfs_btree_delete(cur, &i))) | 2429 | if ((error = xfs_btree_delete(cur, &i))) |
| 2426 | goto done; | 2430 | goto done; |
| 2427 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2431 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2428 | if ((error = xfs_btree_decrement(cur, 0, &i))) | 2432 | if ((error = xfs_btree_decrement(cur, 0, &i))) |
| 2429 | goto done; | 2433 | goto done; |
| 2430 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2434 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2431 | if ((error = xfs_btree_delete(cur, &i))) | 2435 | if ((error = xfs_btree_delete(cur, &i))) |
| 2432 | goto done; | 2436 | goto done; |
| 2433 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2437 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2434 | if ((error = xfs_btree_decrement(cur, 0, &i))) | 2438 | if ((error = xfs_btree_decrement(cur, 0, &i))) |
| 2435 | goto done; | 2439 | goto done; |
| 2436 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2440 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2437 | if ((error = xfs_bmbt_update(cur, LEFT.br_startoff, | 2441 | if ((error = xfs_bmbt_update(cur, LEFT.br_startoff, |
| 2438 | LEFT.br_startblock, | 2442 | LEFT.br_startblock, |
| 2439 | LEFT.br_blockcount + PREV.br_blockcount + | 2443 | LEFT.br_blockcount + PREV.br_blockcount + |
| @@ -2464,13 +2468,13 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2464 | PREV.br_startblock, PREV.br_blockcount, | 2468 | PREV.br_startblock, PREV.br_blockcount, |
| 2465 | &i))) | 2469 | &i))) |
| 2466 | goto done; | 2470 | goto done; |
| 2467 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2471 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2468 | if ((error = xfs_btree_delete(cur, &i))) | 2472 | if ((error = xfs_btree_delete(cur, &i))) |
| 2469 | goto done; | 2473 | goto done; |
| 2470 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2474 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2471 | if ((error = xfs_btree_decrement(cur, 0, &i))) | 2475 | if ((error = xfs_btree_decrement(cur, 0, &i))) |
| 2472 | goto done; | 2476 | goto done; |
| 2473 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2477 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2474 | if ((error = xfs_bmbt_update(cur, LEFT.br_startoff, | 2478 | if ((error = xfs_bmbt_update(cur, LEFT.br_startoff, |
| 2475 | LEFT.br_startblock, | 2479 | LEFT.br_startblock, |
| 2476 | LEFT.br_blockcount + PREV.br_blockcount, | 2480 | LEFT.br_blockcount + PREV.br_blockcount, |
| @@ -2499,13 +2503,13 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2499 | RIGHT.br_startblock, | 2503 | RIGHT.br_startblock, |
| 2500 | RIGHT.br_blockcount, &i))) | 2504 | RIGHT.br_blockcount, &i))) |
| 2501 | goto done; | 2505 | goto done; |
| 2502 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2506 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2503 | if ((error = xfs_btree_delete(cur, &i))) | 2507 | if ((error = xfs_btree_delete(cur, &i))) |
| 2504 | goto done; | 2508 | goto done; |
| 2505 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2509 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2506 | if ((error = xfs_btree_decrement(cur, 0, &i))) | 2510 | if ((error = xfs_btree_decrement(cur, 0, &i))) |
| 2507 | goto done; | 2511 | goto done; |
| 2508 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2512 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2509 | if ((error = xfs_bmbt_update(cur, new->br_startoff, | 2513 | if ((error = xfs_bmbt_update(cur, new->br_startoff, |
| 2510 | new->br_startblock, | 2514 | new->br_startblock, |
| 2511 | new->br_blockcount + RIGHT.br_blockcount, | 2515 | new->br_blockcount + RIGHT.br_blockcount, |
| @@ -2532,7 +2536,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2532 | new->br_startblock, new->br_blockcount, | 2536 | new->br_startblock, new->br_blockcount, |
| 2533 | &i))) | 2537 | &i))) |
| 2534 | goto done; | 2538 | goto done; |
| 2535 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2539 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2536 | if ((error = xfs_bmbt_update(cur, new->br_startoff, | 2540 | if ((error = xfs_bmbt_update(cur, new->br_startoff, |
| 2537 | new->br_startblock, new->br_blockcount, | 2541 | new->br_startblock, new->br_blockcount, |
| 2538 | newext))) | 2542 | newext))) |
| @@ -2569,7 +2573,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2569 | PREV.br_startblock, PREV.br_blockcount, | 2573 | PREV.br_startblock, PREV.br_blockcount, |
| 2570 | &i))) | 2574 | &i))) |
| 2571 | goto done; | 2575 | goto done; |
| 2572 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2576 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2573 | if ((error = xfs_bmbt_update(cur, | 2577 | if ((error = xfs_bmbt_update(cur, |
| 2574 | PREV.br_startoff + new->br_blockcount, | 2578 | PREV.br_startoff + new->br_blockcount, |
| 2575 | PREV.br_startblock + new->br_blockcount, | 2579 | PREV.br_startblock + new->br_blockcount, |
| @@ -2611,7 +2615,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2611 | PREV.br_startblock, PREV.br_blockcount, | 2615 | PREV.br_startblock, PREV.br_blockcount, |
| 2612 | &i))) | 2616 | &i))) |
| 2613 | goto done; | 2617 | goto done; |
| 2614 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2618 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2615 | if ((error = xfs_bmbt_update(cur, | 2619 | if ((error = xfs_bmbt_update(cur, |
| 2616 | PREV.br_startoff + new->br_blockcount, | 2620 | PREV.br_startoff + new->br_blockcount, |
| 2617 | PREV.br_startblock + new->br_blockcount, | 2621 | PREV.br_startblock + new->br_blockcount, |
| @@ -2621,7 +2625,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2621 | cur->bc_rec.b = *new; | 2625 | cur->bc_rec.b = *new; |
| 2622 | if ((error = xfs_btree_insert(cur, &i))) | 2626 | if ((error = xfs_btree_insert(cur, &i))) |
| 2623 | goto done; | 2627 | goto done; |
| 2624 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2628 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2625 | } | 2629 | } |
| 2626 | break; | 2630 | break; |
| 2627 | 2631 | ||
| @@ -2651,7 +2655,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2651 | PREV.br_startblock, | 2655 | PREV.br_startblock, |
| 2652 | PREV.br_blockcount, &i))) | 2656 | PREV.br_blockcount, &i))) |
| 2653 | goto done; | 2657 | goto done; |
| 2654 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2658 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2655 | if ((error = xfs_bmbt_update(cur, PREV.br_startoff, | 2659 | if ((error = xfs_bmbt_update(cur, PREV.br_startoff, |
| 2656 | PREV.br_startblock, | 2660 | PREV.br_startblock, |
| 2657 | PREV.br_blockcount - new->br_blockcount, | 2661 | PREV.br_blockcount - new->br_blockcount, |
| @@ -2689,7 +2693,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2689 | PREV.br_startblock, PREV.br_blockcount, | 2693 | PREV.br_startblock, PREV.br_blockcount, |
| 2690 | &i))) | 2694 | &i))) |
| 2691 | goto done; | 2695 | goto done; |
| 2692 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2696 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2693 | if ((error = xfs_bmbt_update(cur, PREV.br_startoff, | 2697 | if ((error = xfs_bmbt_update(cur, PREV.br_startoff, |
| 2694 | PREV.br_startblock, | 2698 | PREV.br_startblock, |
| 2695 | PREV.br_blockcount - new->br_blockcount, | 2699 | PREV.br_blockcount - new->br_blockcount, |
| @@ -2699,11 +2703,11 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2699 | new->br_startblock, new->br_blockcount, | 2703 | new->br_startblock, new->br_blockcount, |
| 2700 | &i))) | 2704 | &i))) |
| 2701 | goto done; | 2705 | goto done; |
| 2702 | XFS_WANT_CORRUPTED_GOTO(i == 0, done); | 2706 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); |
| 2703 | cur->bc_rec.b.br_state = XFS_EXT_NORM; | 2707 | cur->bc_rec.b.br_state = XFS_EXT_NORM; |
| 2704 | if ((error = xfs_btree_insert(cur, &i))) | 2708 | if ((error = xfs_btree_insert(cur, &i))) |
| 2705 | goto done; | 2709 | goto done; |
| 2706 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2710 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2707 | } | 2711 | } |
| 2708 | break; | 2712 | break; |
| 2709 | 2713 | ||
| @@ -2737,7 +2741,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2737 | PREV.br_startblock, PREV.br_blockcount, | 2741 | PREV.br_startblock, PREV.br_blockcount, |
| 2738 | &i))) | 2742 | &i))) |
| 2739 | goto done; | 2743 | goto done; |
| 2740 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2744 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2741 | /* new right extent - oldext */ | 2745 | /* new right extent - oldext */ |
| 2742 | if ((error = xfs_bmbt_update(cur, r[1].br_startoff, | 2746 | if ((error = xfs_bmbt_update(cur, r[1].br_startoff, |
| 2743 | r[1].br_startblock, r[1].br_blockcount, | 2747 | r[1].br_startblock, r[1].br_blockcount, |
| @@ -2749,7 +2753,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2749 | new->br_startoff - PREV.br_startoff; | 2753 | new->br_startoff - PREV.br_startoff; |
| 2750 | if ((error = xfs_btree_insert(cur, &i))) | 2754 | if ((error = xfs_btree_insert(cur, &i))) |
| 2751 | goto done; | 2755 | goto done; |
| 2752 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2756 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2753 | /* | 2757 | /* |
| 2754 | * Reset the cursor to the position of the new extent | 2758 | * Reset the cursor to the position of the new extent |
| 2755 | * we are about to insert as we can't trust it after | 2759 | * we are about to insert as we can't trust it after |
| @@ -2759,12 +2763,12 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 2759 | new->br_startblock, new->br_blockcount, | 2763 | new->br_startblock, new->br_blockcount, |
| 2760 | &i))) | 2764 | &i))) |
| 2761 | goto done; | 2765 | goto done; |
| 2762 | XFS_WANT_CORRUPTED_GOTO(i == 0, done); | 2766 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); |
| 2763 | /* new middle extent - newext */ | 2767 | /* new middle extent - newext */ |
| 2764 | cur->bc_rec.b.br_state = new->br_state; | 2768 | cur->bc_rec.b.br_state = new->br_state; |
| 2765 | if ((error = xfs_btree_insert(cur, &i))) | 2769 | if ((error = xfs_btree_insert(cur, &i))) |
| 2766 | goto done; | 2770 | goto done; |
| 2767 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 2771 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 2768 | } | 2772 | } |
| 2769 | break; | 2773 | break; |
| 2770 | 2774 | ||
| @@ -2968,7 +2972,9 @@ xfs_bmap_add_extent_hole_real( | |||
| 2968 | xfs_bmbt_irec_t right; /* right neighbor extent entry */ | 2972 | xfs_bmbt_irec_t right; /* right neighbor extent entry */ |
| 2969 | int rval=0; /* return value (logging flags) */ | 2973 | int rval=0; /* return value (logging flags) */ |
| 2970 | int state; /* state bits, accessed thru macros */ | 2974 | int state; /* state bits, accessed thru macros */ |
| 2975 | struct xfs_mount *mp; | ||
| 2971 | 2976 | ||
| 2977 | mp = bma->tp ? bma->tp->t_mountp : NULL; | ||
| 2972 | ifp = XFS_IFORK_PTR(bma->ip, whichfork); | 2978 | ifp = XFS_IFORK_PTR(bma->ip, whichfork); |
| 2973 | 2979 | ||
| 2974 | ASSERT(bma->idx >= 0); | 2980 | ASSERT(bma->idx >= 0); |
| @@ -3056,15 +3062,15 @@ xfs_bmap_add_extent_hole_real( | |||
| 3056 | &i); | 3062 | &i); |
| 3057 | if (error) | 3063 | if (error) |
| 3058 | goto done; | 3064 | goto done; |
| 3059 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 3065 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 3060 | error = xfs_btree_delete(bma->cur, &i); | 3066 | error = xfs_btree_delete(bma->cur, &i); |
| 3061 | if (error) | 3067 | if (error) |
| 3062 | goto done; | 3068 | goto done; |
| 3063 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 3069 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 3064 | error = xfs_btree_decrement(bma->cur, 0, &i); | 3070 | error = xfs_btree_decrement(bma->cur, 0, &i); |
| 3065 | if (error) | 3071 | if (error) |
| 3066 | goto done; | 3072 | goto done; |
| 3067 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 3073 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 3068 | error = xfs_bmbt_update(bma->cur, left.br_startoff, | 3074 | error = xfs_bmbt_update(bma->cur, left.br_startoff, |
| 3069 | left.br_startblock, | 3075 | left.br_startblock, |
| 3070 | left.br_blockcount + | 3076 | left.br_blockcount + |
| @@ -3097,7 +3103,7 @@ xfs_bmap_add_extent_hole_real( | |||
| 3097 | &i); | 3103 | &i); |
| 3098 | if (error) | 3104 | if (error) |
| 3099 | goto done; | 3105 | goto done; |
| 3100 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 3106 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 3101 | error = xfs_bmbt_update(bma->cur, left.br_startoff, | 3107 | error = xfs_bmbt_update(bma->cur, left.br_startoff, |
| 3102 | left.br_startblock, | 3108 | left.br_startblock, |
| 3103 | left.br_blockcount + | 3109 | left.br_blockcount + |
| @@ -3131,7 +3137,7 @@ xfs_bmap_add_extent_hole_real( | |||
| 3131 | right.br_blockcount, &i); | 3137 | right.br_blockcount, &i); |
| 3132 | if (error) | 3138 | if (error) |
| 3133 | goto done; | 3139 | goto done; |
| 3134 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 3140 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 3135 | error = xfs_bmbt_update(bma->cur, new->br_startoff, | 3141 | error = xfs_bmbt_update(bma->cur, new->br_startoff, |
| 3136 | new->br_startblock, | 3142 | new->br_startblock, |
| 3137 | new->br_blockcount + | 3143 | new->br_blockcount + |
| @@ -3161,12 +3167,12 @@ xfs_bmap_add_extent_hole_real( | |||
| 3161 | new->br_blockcount, &i); | 3167 | new->br_blockcount, &i); |
| 3162 | if (error) | 3168 | if (error) |
| 3163 | goto done; | 3169 | goto done; |
| 3164 | XFS_WANT_CORRUPTED_GOTO(i == 0, done); | 3170 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); |
| 3165 | bma->cur->bc_rec.b.br_state = new->br_state; | 3171 | bma->cur->bc_rec.b.br_state = new->br_state; |
| 3166 | error = xfs_btree_insert(bma->cur, &i); | 3172 | error = xfs_btree_insert(bma->cur, &i); |
| 3167 | if (error) | 3173 | if (error) |
| 3168 | goto done; | 3174 | goto done; |
| 3169 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 3175 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 3170 | } | 3176 | } |
| 3171 | break; | 3177 | break; |
| 3172 | } | 3178 | } |
| @@ -4801,7 +4807,7 @@ xfs_bmap_del_extent( | |||
| 4801 | got.br_startblock, got.br_blockcount, | 4807 | got.br_startblock, got.br_blockcount, |
| 4802 | &i))) | 4808 | &i))) |
| 4803 | goto done; | 4809 | goto done; |
| 4804 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 4810 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 4805 | } | 4811 | } |
| 4806 | da_old = da_new = 0; | 4812 | da_old = da_new = 0; |
| 4807 | } else { | 4813 | } else { |
| @@ -4835,7 +4841,7 @@ xfs_bmap_del_extent( | |||
| 4835 | } | 4841 | } |
| 4836 | if ((error = xfs_btree_delete(cur, &i))) | 4842 | if ((error = xfs_btree_delete(cur, &i))) |
| 4837 | goto done; | 4843 | goto done; |
| 4838 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 4844 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 4839 | break; | 4845 | break; |
| 4840 | 4846 | ||
| 4841 | case 2: | 4847 | case 2: |
| @@ -4935,7 +4941,8 @@ xfs_bmap_del_extent( | |||
| 4935 | got.br_startblock, | 4941 | got.br_startblock, |
| 4936 | temp, &i))) | 4942 | temp, &i))) |
| 4937 | goto done; | 4943 | goto done; |
| 4938 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 4944 | XFS_WANT_CORRUPTED_GOTO(mp, |
| 4945 | i == 1, done); | ||
| 4939 | /* | 4946 | /* |
| 4940 | * Update the btree record back | 4947 | * Update the btree record back |
| 4941 | * to the original value. | 4948 | * to the original value. |
| @@ -4956,7 +4963,7 @@ xfs_bmap_del_extent( | |||
| 4956 | error = -ENOSPC; | 4963 | error = -ENOSPC; |
| 4957 | goto done; | 4964 | goto done; |
| 4958 | } | 4965 | } |
| 4959 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 4966 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
| 4960 | } else | 4967 | } else |
| 4961 | flags |= xfs_ilog_fext(whichfork); | 4968 | flags |= xfs_ilog_fext(whichfork); |
| 4962 | XFS_IFORK_NEXT_SET(ip, whichfork, | 4969 | XFS_IFORK_NEXT_SET(ip, whichfork, |
| @@ -5453,6 +5460,7 @@ xfs_bmse_merge( | |||
| 5453 | struct xfs_bmbt_irec left; | 5460 | struct xfs_bmbt_irec left; |
| 5454 | xfs_filblks_t blockcount; | 5461 | xfs_filblks_t blockcount; |
| 5455 | int error, i; | 5462 | int error, i; |
| 5463 | struct xfs_mount *mp = ip->i_mount; | ||
| 5456 | 5464 | ||
| 5457 | xfs_bmbt_get_all(gotp, &got); | 5465 | xfs_bmbt_get_all(gotp, &got); |
| 5458 | xfs_bmbt_get_all(leftp, &left); | 5466 | xfs_bmbt_get_all(leftp, &left); |
| @@ -5487,19 +5495,19 @@ xfs_bmse_merge( | |||
| 5487 | got.br_blockcount, &i); | 5495 | got.br_blockcount, &i); |
| 5488 | if (error) | 5496 | if (error) |
| 5489 | return error; | 5497 | return error; |
| 5490 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 5498 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 5491 | 5499 | ||
| 5492 | error = xfs_btree_delete(cur, &i); | 5500 | error = xfs_btree_delete(cur, &i); |
| 5493 | if (error) | 5501 | if (error) |
| 5494 | return error; | 5502 | return error; |
| 5495 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 5503 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 5496 | 5504 | ||
| 5497 | /* lookup and update size of the previous extent */ | 5505 | /* lookup and update size of the previous extent */ |
| 5498 | error = xfs_bmbt_lookup_eq(cur, left.br_startoff, left.br_startblock, | 5506 | error = xfs_bmbt_lookup_eq(cur, left.br_startoff, left.br_startblock, |
| 5499 | left.br_blockcount, &i); | 5507 | left.br_blockcount, &i); |
| 5500 | if (error) | 5508 | if (error) |
| 5501 | return error; | 5509 | return error; |
| 5502 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 5510 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 5503 | 5511 | ||
| 5504 | left.br_blockcount = blockcount; | 5512 | left.br_blockcount = blockcount; |
| 5505 | 5513 | ||
| @@ -5521,6 +5529,7 @@ xfs_bmse_shift_one( | |||
| 5521 | int *logflags) | 5529 | int *logflags) |
| 5522 | { | 5530 | { |
| 5523 | struct xfs_ifork *ifp; | 5531 | struct xfs_ifork *ifp; |
| 5532 | struct xfs_mount *mp; | ||
| 5524 | xfs_fileoff_t startoff; | 5533 | xfs_fileoff_t startoff; |
| 5525 | struct xfs_bmbt_rec_host *leftp; | 5534 | struct xfs_bmbt_rec_host *leftp; |
| 5526 | struct xfs_bmbt_irec got; | 5535 | struct xfs_bmbt_irec got; |
| @@ -5528,13 +5537,14 @@ xfs_bmse_shift_one( | |||
| 5528 | int error; | 5537 | int error; |
| 5529 | int i; | 5538 | int i; |
| 5530 | 5539 | ||
| 5540 | mp = ip->i_mount; | ||
| 5531 | ifp = XFS_IFORK_PTR(ip, whichfork); | 5541 | ifp = XFS_IFORK_PTR(ip, whichfork); |
| 5532 | 5542 | ||
| 5533 | xfs_bmbt_get_all(gotp, &got); | 5543 | xfs_bmbt_get_all(gotp, &got); |
| 5534 | startoff = got.br_startoff - offset_shift_fsb; | 5544 | startoff = got.br_startoff - offset_shift_fsb; |
| 5535 | 5545 | ||
| 5536 | /* delalloc extents should be prevented by caller */ | 5546 | /* delalloc extents should be prevented by caller */ |
| 5537 | XFS_WANT_CORRUPTED_RETURN(!isnullstartblock(got.br_startblock)); | 5547 | XFS_WANT_CORRUPTED_RETURN(mp, !isnullstartblock(got.br_startblock)); |
| 5538 | 5548 | ||
| 5539 | /* | 5549 | /* |
| 5540 | * Check for merge if we've got an extent to the left, otherwise make | 5550 | * Check for merge if we've got an extent to the left, otherwise make |
| @@ -5573,7 +5583,7 @@ xfs_bmse_shift_one( | |||
| 5573 | got.br_blockcount, &i); | 5583 | got.br_blockcount, &i); |
| 5574 | if (error) | 5584 | if (error) |
| 5575 | return error; | 5585 | return error; |
| 5576 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 5586 | XFS_WANT_CORRUPTED_RETURN(mp, i == 1); |
| 5577 | 5587 | ||
| 5578 | got.br_startoff = startoff; | 5588 | got.br_startoff = startoff; |
| 5579 | return xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, | 5589 | return xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, |
diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 81cad433df85..c72283dd8d44 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c | |||
| @@ -168,7 +168,7 @@ xfs_btree_check_lptr( | |||
| 168 | xfs_fsblock_t bno, /* btree block disk address */ | 168 | xfs_fsblock_t bno, /* btree block disk address */ |
| 169 | int level) /* btree block level */ | 169 | int level) /* btree block level */ |
| 170 | { | 170 | { |
| 171 | XFS_WANT_CORRUPTED_RETURN( | 171 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, |
| 172 | level > 0 && | 172 | level > 0 && |
| 173 | bno != NULLFSBLOCK && | 173 | bno != NULLFSBLOCK && |
| 174 | XFS_FSB_SANITY_CHECK(cur->bc_mp, bno)); | 174 | XFS_FSB_SANITY_CHECK(cur->bc_mp, bno)); |
| @@ -187,7 +187,7 @@ xfs_btree_check_sptr( | |||
| 187 | { | 187 | { |
| 188 | xfs_agblock_t agblocks = cur->bc_mp->m_sb.sb_agblocks; | 188 | xfs_agblock_t agblocks = cur->bc_mp->m_sb.sb_agblocks; |
| 189 | 189 | ||
| 190 | XFS_WANT_CORRUPTED_RETURN( | 190 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, |
| 191 | level > 0 && | 191 | level > 0 && |
| 192 | bno != NULLAGBLOCK && | 192 | bno != NULLAGBLOCK && |
| 193 | bno != 0 && | 193 | bno != 0 && |
| @@ -1825,7 +1825,7 @@ xfs_btree_lookup( | |||
| 1825 | error = xfs_btree_increment(cur, 0, &i); | 1825 | error = xfs_btree_increment(cur, 0, &i); |
| 1826 | if (error) | 1826 | if (error) |
| 1827 | goto error0; | 1827 | goto error0; |
| 1828 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1828 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1829 | XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); | 1829 | XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); |
| 1830 | *stat = 1; | 1830 | *stat = 1; |
| 1831 | return 0; | 1831 | return 0; |
| @@ -2285,7 +2285,7 @@ xfs_btree_rshift( | |||
| 2285 | if (error) | 2285 | if (error) |
| 2286 | goto error0; | 2286 | goto error0; |
| 2287 | i = xfs_btree_lastrec(tcur, level); | 2287 | i = xfs_btree_lastrec(tcur, level); |
| 2288 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 2288 | XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); |
| 2289 | 2289 | ||
| 2290 | error = xfs_btree_increment(tcur, level, &i); | 2290 | error = xfs_btree_increment(tcur, level, &i); |
| 2291 | if (error) | 2291 | if (error) |
| @@ -3138,7 +3138,7 @@ xfs_btree_insert( | |||
| 3138 | goto error0; | 3138 | goto error0; |
| 3139 | } | 3139 | } |
| 3140 | 3140 | ||
| 3141 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 3141 | XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); |
| 3142 | level++; | 3142 | level++; |
| 3143 | 3143 | ||
| 3144 | /* | 3144 | /* |
| @@ -3582,15 +3582,15 @@ xfs_btree_delrec( | |||
| 3582 | * Actually any entry but the first would suffice. | 3582 | * Actually any entry but the first would suffice. |
| 3583 | */ | 3583 | */ |
| 3584 | i = xfs_btree_lastrec(tcur, level); | 3584 | i = xfs_btree_lastrec(tcur, level); |
| 3585 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 3585 | XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); |
| 3586 | 3586 | ||
| 3587 | error = xfs_btree_increment(tcur, level, &i); | 3587 | error = xfs_btree_increment(tcur, level, &i); |
| 3588 | if (error) | 3588 | if (error) |
| 3589 | goto error0; | 3589 | goto error0; |
| 3590 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 3590 | XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); |
| 3591 | 3591 | ||
| 3592 | i = xfs_btree_lastrec(tcur, level); | 3592 | i = xfs_btree_lastrec(tcur, level); |
| 3593 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 3593 | XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); |
| 3594 | 3594 | ||
| 3595 | /* Grab a pointer to the block. */ | 3595 | /* Grab a pointer to the block. */ |
| 3596 | right = xfs_btree_get_block(tcur, level, &rbp); | 3596 | right = xfs_btree_get_block(tcur, level, &rbp); |
| @@ -3634,12 +3634,12 @@ xfs_btree_delrec( | |||
| 3634 | rrecs = xfs_btree_get_numrecs(right); | 3634 | rrecs = xfs_btree_get_numrecs(right); |
| 3635 | if (!xfs_btree_ptr_is_null(cur, &lptr)) { | 3635 | if (!xfs_btree_ptr_is_null(cur, &lptr)) { |
| 3636 | i = xfs_btree_firstrec(tcur, level); | 3636 | i = xfs_btree_firstrec(tcur, level); |
| 3637 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 3637 | XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); |
| 3638 | 3638 | ||
| 3639 | error = xfs_btree_decrement(tcur, level, &i); | 3639 | error = xfs_btree_decrement(tcur, level, &i); |
| 3640 | if (error) | 3640 | if (error) |
| 3641 | goto error0; | 3641 | goto error0; |
| 3642 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 3642 | XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); |
| 3643 | } | 3643 | } |
| 3644 | } | 3644 | } |
| 3645 | 3645 | ||
| @@ -3653,13 +3653,13 @@ xfs_btree_delrec( | |||
| 3653 | * previous block. | 3653 | * previous block. |
| 3654 | */ | 3654 | */ |
| 3655 | i = xfs_btree_firstrec(tcur, level); | 3655 | i = xfs_btree_firstrec(tcur, level); |
| 3656 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 3656 | XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); |
| 3657 | 3657 | ||
| 3658 | error = xfs_btree_decrement(tcur, level, &i); | 3658 | error = xfs_btree_decrement(tcur, level, &i); |
| 3659 | if (error) | 3659 | if (error) |
| 3660 | goto error0; | 3660 | goto error0; |
| 3661 | i = xfs_btree_firstrec(tcur, level); | 3661 | i = xfs_btree_firstrec(tcur, level); |
| 3662 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 3662 | XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); |
| 3663 | 3663 | ||
| 3664 | /* Grab a pointer to the block. */ | 3664 | /* Grab a pointer to the block. */ |
| 3665 | left = xfs_btree_get_block(tcur, level, &lbp); | 3665 | left = xfs_btree_get_block(tcur, level, &lbp); |
diff --git a/fs/xfs/libxfs/xfs_dir2_data.c b/fs/xfs/libxfs/xfs_dir2_data.c index 5ff31be9b1cd..de1ea16f5748 100644 --- a/fs/xfs/libxfs/xfs_dir2_data.c +++ b/fs/xfs/libxfs/xfs_dir2_data.c | |||
| @@ -89,7 +89,7 @@ __xfs_dir3_data_check( | |||
| 89 | * so just ensure that the count falls somewhere inside the | 89 | * so just ensure that the count falls somewhere inside the |
| 90 | * block right now. | 90 | * block right now. |
| 91 | */ | 91 | */ |
| 92 | XFS_WANT_CORRUPTED_RETURN(be32_to_cpu(btp->count) < | 92 | XFS_WANT_CORRUPTED_RETURN(mp, be32_to_cpu(btp->count) < |
| 93 | ((char *)btp - p) / sizeof(struct xfs_dir2_leaf_entry)); | 93 | ((char *)btp - p) / sizeof(struct xfs_dir2_leaf_entry)); |
| 94 | break; | 94 | break; |
| 95 | case cpu_to_be32(XFS_DIR3_DATA_MAGIC): | 95 | case cpu_to_be32(XFS_DIR3_DATA_MAGIC): |
| @@ -107,21 +107,21 @@ __xfs_dir3_data_check( | |||
| 107 | bf = ops->data_bestfree_p(hdr); | 107 | bf = ops->data_bestfree_p(hdr); |
| 108 | count = lastfree = freeseen = 0; | 108 | count = lastfree = freeseen = 0; |
| 109 | if (!bf[0].length) { | 109 | if (!bf[0].length) { |
| 110 | XFS_WANT_CORRUPTED_RETURN(!bf[0].offset); | 110 | XFS_WANT_CORRUPTED_RETURN(mp, !bf[0].offset); |
| 111 | freeseen |= 1 << 0; | 111 | freeseen |= 1 << 0; |
| 112 | } | 112 | } |
| 113 | if (!bf[1].length) { | 113 | if (!bf[1].length) { |
| 114 | XFS_WANT_CORRUPTED_RETURN(!bf[1].offset); | 114 | XFS_WANT_CORRUPTED_RETURN(mp, !bf[1].offset); |
| 115 | freeseen |= 1 << 1; | 115 | freeseen |= 1 << 1; |
| 116 | } | 116 | } |
| 117 | if (!bf[2].length) { | 117 | if (!bf[2].length) { |
| 118 | XFS_WANT_CORRUPTED_RETURN(!bf[2].offset); | 118 | XFS_WANT_CORRUPTED_RETURN(mp, !bf[2].offset); |
| 119 | freeseen |= 1 << 2; | 119 | freeseen |= 1 << 2; |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | XFS_WANT_CORRUPTED_RETURN(be16_to_cpu(bf[0].length) >= | 122 | XFS_WANT_CORRUPTED_RETURN(mp, be16_to_cpu(bf[0].length) >= |
| 123 | be16_to_cpu(bf[1].length)); | 123 | be16_to_cpu(bf[1].length)); |
| 124 | XFS_WANT_CORRUPTED_RETURN(be16_to_cpu(bf[1].length) >= | 124 | XFS_WANT_CORRUPTED_RETURN(mp, be16_to_cpu(bf[1].length) >= |
| 125 | be16_to_cpu(bf[2].length)); | 125 | be16_to_cpu(bf[2].length)); |
| 126 | /* | 126 | /* |
| 127 | * Loop over the data/unused entries. | 127 | * Loop over the data/unused entries. |
| @@ -134,18 +134,18 @@ __xfs_dir3_data_check( | |||
| 134 | * doesn't need to be there. | 134 | * doesn't need to be there. |
| 135 | */ | 135 | */ |
| 136 | if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { | 136 | if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { |
| 137 | XFS_WANT_CORRUPTED_RETURN(lastfree == 0); | 137 | XFS_WANT_CORRUPTED_RETURN(mp, lastfree == 0); |
| 138 | XFS_WANT_CORRUPTED_RETURN( | 138 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 139 | be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) == | 139 | be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) == |
| 140 | (char *)dup - (char *)hdr); | 140 | (char *)dup - (char *)hdr); |
| 141 | dfp = xfs_dir2_data_freefind(hdr, bf, dup); | 141 | dfp = xfs_dir2_data_freefind(hdr, bf, dup); |
| 142 | if (dfp) { | 142 | if (dfp) { |
| 143 | i = (int)(dfp - bf); | 143 | i = (int)(dfp - bf); |
| 144 | XFS_WANT_CORRUPTED_RETURN( | 144 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 145 | (freeseen & (1 << i)) == 0); | 145 | (freeseen & (1 << i)) == 0); |
| 146 | freeseen |= 1 << i; | 146 | freeseen |= 1 << i; |
| 147 | } else { | 147 | } else { |
| 148 | XFS_WANT_CORRUPTED_RETURN( | 148 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 149 | be16_to_cpu(dup->length) <= | 149 | be16_to_cpu(dup->length) <= |
| 150 | be16_to_cpu(bf[2].length)); | 150 | be16_to_cpu(bf[2].length)); |
| 151 | } | 151 | } |
| @@ -160,13 +160,13 @@ __xfs_dir3_data_check( | |||
| 160 | * The linear search is crude but this is DEBUG code. | 160 | * The linear search is crude but this is DEBUG code. |
| 161 | */ | 161 | */ |
| 162 | dep = (xfs_dir2_data_entry_t *)p; | 162 | dep = (xfs_dir2_data_entry_t *)p; |
| 163 | XFS_WANT_CORRUPTED_RETURN(dep->namelen != 0); | 163 | XFS_WANT_CORRUPTED_RETURN(mp, dep->namelen != 0); |
| 164 | XFS_WANT_CORRUPTED_RETURN( | 164 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 165 | !xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber))); | 165 | !xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber))); |
| 166 | XFS_WANT_CORRUPTED_RETURN( | 166 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 167 | be16_to_cpu(*ops->data_entry_tag_p(dep)) == | 167 | be16_to_cpu(*ops->data_entry_tag_p(dep)) == |
| 168 | (char *)dep - (char *)hdr); | 168 | (char *)dep - (char *)hdr); |
| 169 | XFS_WANT_CORRUPTED_RETURN( | 169 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 170 | ops->data_get_ftype(dep) < XFS_DIR3_FT_MAX); | 170 | ops->data_get_ftype(dep) < XFS_DIR3_FT_MAX); |
| 171 | count++; | 171 | count++; |
| 172 | lastfree = 0; | 172 | lastfree = 0; |
| @@ -183,14 +183,15 @@ __xfs_dir3_data_check( | |||
| 183 | be32_to_cpu(lep[i].hashval) == hash) | 183 | be32_to_cpu(lep[i].hashval) == hash) |
| 184 | break; | 184 | break; |
| 185 | } | 185 | } |
| 186 | XFS_WANT_CORRUPTED_RETURN(i < be32_to_cpu(btp->count)); | 186 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 187 | i < be32_to_cpu(btp->count)); | ||
| 187 | } | 188 | } |
| 188 | p += ops->data_entsize(dep->namelen); | 189 | p += ops->data_entsize(dep->namelen); |
| 189 | } | 190 | } |
| 190 | /* | 191 | /* |
| 191 | * Need to have seen all the entries and all the bestfree slots. | 192 | * Need to have seen all the entries and all the bestfree slots. |
| 192 | */ | 193 | */ |
| 193 | XFS_WANT_CORRUPTED_RETURN(freeseen == 7); | 194 | XFS_WANT_CORRUPTED_RETURN(mp, freeseen == 7); |
| 194 | if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || | 195 | if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || |
| 195 | hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { | 196 | hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { |
| 196 | for (i = stale = 0; i < be32_to_cpu(btp->count); i++) { | 197 | for (i = stale = 0; i < be32_to_cpu(btp->count); i++) { |
| @@ -198,13 +199,13 @@ __xfs_dir3_data_check( | |||
| 198 | cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) | 199 | cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) |
| 199 | stale++; | 200 | stale++; |
| 200 | if (i > 0) | 201 | if (i > 0) |
| 201 | XFS_WANT_CORRUPTED_RETURN( | 202 | XFS_WANT_CORRUPTED_RETURN(mp, |
| 202 | be32_to_cpu(lep[i].hashval) >= | 203 | be32_to_cpu(lep[i].hashval) >= |
| 203 | be32_to_cpu(lep[i - 1].hashval)); | 204 | be32_to_cpu(lep[i - 1].hashval)); |
| 204 | } | 205 | } |
| 205 | XFS_WANT_CORRUPTED_RETURN(count == | 206 | XFS_WANT_CORRUPTED_RETURN(mp, count == |
| 206 | be32_to_cpu(btp->count) - be32_to_cpu(btp->stale)); | 207 | be32_to_cpu(btp->count) - be32_to_cpu(btp->stale)); |
| 207 | XFS_WANT_CORRUPTED_RETURN(stale == be32_to_cpu(btp->stale)); | 208 | XFS_WANT_CORRUPTED_RETURN(mp, stale == be32_to_cpu(btp->stale)); |
| 208 | } | 209 | } |
| 209 | return 0; | 210 | return 0; |
| 210 | } | 211 | } |
diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 116ef1ddb3e3..db0444893e96 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c | |||
| @@ -700,7 +700,7 @@ xfs_ialloc_next_rec( | |||
| 700 | error = xfs_inobt_get_rec(cur, rec, &i); | 700 | error = xfs_inobt_get_rec(cur, rec, &i); |
| 701 | if (error) | 701 | if (error) |
| 702 | return error; | 702 | return error; |
| 703 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 703 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 704 | } | 704 | } |
| 705 | 705 | ||
| 706 | return 0; | 706 | return 0; |
| @@ -724,7 +724,7 @@ xfs_ialloc_get_rec( | |||
| 724 | error = xfs_inobt_get_rec(cur, rec, &i); | 724 | error = xfs_inobt_get_rec(cur, rec, &i); |
| 725 | if (error) | 725 | if (error) |
| 726 | return error; | 726 | return error; |
| 727 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 727 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 728 | } | 728 | } |
| 729 | 729 | ||
| 730 | return 0; | 730 | return 0; |
| @@ -783,12 +783,12 @@ xfs_dialloc_ag_inobt( | |||
| 783 | error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i); | 783 | error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i); |
| 784 | if (error) | 784 | if (error) |
| 785 | goto error0; | 785 | goto error0; |
| 786 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 786 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 787 | 787 | ||
| 788 | error = xfs_inobt_get_rec(cur, &rec, &j); | 788 | error = xfs_inobt_get_rec(cur, &rec, &j); |
| 789 | if (error) | 789 | if (error) |
| 790 | goto error0; | 790 | goto error0; |
| 791 | XFS_WANT_CORRUPTED_GOTO(j == 1, error0); | 791 | XFS_WANT_CORRUPTED_GOTO(mp, j == 1, error0); |
| 792 | 792 | ||
| 793 | if (rec.ir_freecount > 0) { | 793 | if (rec.ir_freecount > 0) { |
| 794 | /* | 794 | /* |
| @@ -944,19 +944,19 @@ newino: | |||
| 944 | error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); | 944 | error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); |
| 945 | if (error) | 945 | if (error) |
| 946 | goto error0; | 946 | goto error0; |
| 947 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 947 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 948 | 948 | ||
| 949 | for (;;) { | 949 | for (;;) { |
| 950 | error = xfs_inobt_get_rec(cur, &rec, &i); | 950 | error = xfs_inobt_get_rec(cur, &rec, &i); |
| 951 | if (error) | 951 | if (error) |
| 952 | goto error0; | 952 | goto error0; |
| 953 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 953 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 954 | if (rec.ir_freecount > 0) | 954 | if (rec.ir_freecount > 0) |
| 955 | break; | 955 | break; |
| 956 | error = xfs_btree_increment(cur, 0, &i); | 956 | error = xfs_btree_increment(cur, 0, &i); |
| 957 | if (error) | 957 | if (error) |
| 958 | goto error0; | 958 | goto error0; |
| 959 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 959 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 960 | } | 960 | } |
| 961 | 961 | ||
| 962 | alloc_inode: | 962 | alloc_inode: |
| @@ -1016,7 +1016,7 @@ xfs_dialloc_ag_finobt_near( | |||
| 1016 | error = xfs_inobt_get_rec(lcur, rec, &i); | 1016 | error = xfs_inobt_get_rec(lcur, rec, &i); |
| 1017 | if (error) | 1017 | if (error) |
| 1018 | return error; | 1018 | return error; |
| 1019 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1019 | XFS_WANT_CORRUPTED_RETURN(lcur->bc_mp, i == 1); |
| 1020 | 1020 | ||
| 1021 | /* | 1021 | /* |
| 1022 | * See if we've landed in the parent inode record. The finobt | 1022 | * See if we've landed in the parent inode record. The finobt |
| @@ -1039,10 +1039,10 @@ xfs_dialloc_ag_finobt_near( | |||
| 1039 | error = xfs_inobt_get_rec(rcur, &rrec, &j); | 1039 | error = xfs_inobt_get_rec(rcur, &rrec, &j); |
| 1040 | if (error) | 1040 | if (error) |
| 1041 | goto error_rcur; | 1041 | goto error_rcur; |
| 1042 | XFS_WANT_CORRUPTED_GOTO(j == 1, error_rcur); | 1042 | XFS_WANT_CORRUPTED_GOTO(lcur->bc_mp, j == 1, error_rcur); |
| 1043 | } | 1043 | } |
| 1044 | 1044 | ||
| 1045 | XFS_WANT_CORRUPTED_GOTO(i == 1 || j == 1, error_rcur); | 1045 | XFS_WANT_CORRUPTED_GOTO(lcur->bc_mp, i == 1 || j == 1, error_rcur); |
| 1046 | if (i == 1 && j == 1) { | 1046 | if (i == 1 && j == 1) { |
| 1047 | /* | 1047 | /* |
| 1048 | * Both the left and right records are valid. Choose the closer | 1048 | * Both the left and right records are valid. Choose the closer |
| @@ -1095,7 +1095,7 @@ xfs_dialloc_ag_finobt_newino( | |||
| 1095 | error = xfs_inobt_get_rec(cur, rec, &i); | 1095 | error = xfs_inobt_get_rec(cur, rec, &i); |
| 1096 | if (error) | 1096 | if (error) |
| 1097 | return error; | 1097 | return error; |
| 1098 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1098 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1099 | return 0; | 1099 | return 0; |
| 1100 | } | 1100 | } |
| 1101 | } | 1101 | } |
| @@ -1106,12 +1106,12 @@ xfs_dialloc_ag_finobt_newino( | |||
| 1106 | error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); | 1106 | error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); |
| 1107 | if (error) | 1107 | if (error) |
| 1108 | return error; | 1108 | return error; |
| 1109 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1109 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1110 | 1110 | ||
| 1111 | error = xfs_inobt_get_rec(cur, rec, &i); | 1111 | error = xfs_inobt_get_rec(cur, rec, &i); |
| 1112 | if (error) | 1112 | if (error) |
| 1113 | return error; | 1113 | return error; |
| 1114 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1114 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1115 | 1115 | ||
| 1116 | return 0; | 1116 | return 0; |
| 1117 | } | 1117 | } |
| @@ -1133,19 +1133,19 @@ xfs_dialloc_ag_update_inobt( | |||
| 1133 | error = xfs_inobt_lookup(cur, frec->ir_startino, XFS_LOOKUP_EQ, &i); | 1133 | error = xfs_inobt_lookup(cur, frec->ir_startino, XFS_LOOKUP_EQ, &i); |
| 1134 | if (error) | 1134 | if (error) |
| 1135 | return error; | 1135 | return error; |
| 1136 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1136 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1137 | 1137 | ||
| 1138 | error = xfs_inobt_get_rec(cur, &rec, &i); | 1138 | error = xfs_inobt_get_rec(cur, &rec, &i); |
| 1139 | if (error) | 1139 | if (error) |
| 1140 | return error; | 1140 | return error; |
| 1141 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1141 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1142 | ASSERT((XFS_AGINO_TO_OFFSET(cur->bc_mp, rec.ir_startino) % | 1142 | ASSERT((XFS_AGINO_TO_OFFSET(cur->bc_mp, rec.ir_startino) % |
| 1143 | XFS_INODES_PER_CHUNK) == 0); | 1143 | XFS_INODES_PER_CHUNK) == 0); |
| 1144 | 1144 | ||
| 1145 | rec.ir_free &= ~XFS_INOBT_MASK(offset); | 1145 | rec.ir_free &= ~XFS_INOBT_MASK(offset); |
| 1146 | rec.ir_freecount--; | 1146 | rec.ir_freecount--; |
| 1147 | 1147 | ||
| 1148 | XFS_WANT_CORRUPTED_RETURN((rec.ir_free == frec->ir_free) && | 1148 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, (rec.ir_free == frec->ir_free) && |
| 1149 | (rec.ir_freecount == frec->ir_freecount)); | 1149 | (rec.ir_freecount == frec->ir_freecount)); |
| 1150 | 1150 | ||
| 1151 | return xfs_inobt_update(cur, &rec); | 1151 | return xfs_inobt_update(cur, &rec); |
| @@ -1475,14 +1475,14 @@ xfs_difree_inobt( | |||
| 1475 | __func__, error); | 1475 | __func__, error); |
| 1476 | goto error0; | 1476 | goto error0; |
| 1477 | } | 1477 | } |
| 1478 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1478 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1479 | error = xfs_inobt_get_rec(cur, &rec, &i); | 1479 | error = xfs_inobt_get_rec(cur, &rec, &i); |
| 1480 | if (error) { | 1480 | if (error) { |
| 1481 | xfs_warn(mp, "%s: xfs_inobt_get_rec() returned error %d.", | 1481 | xfs_warn(mp, "%s: xfs_inobt_get_rec() returned error %d.", |
| 1482 | __func__, error); | 1482 | __func__, error); |
| 1483 | goto error0; | 1483 | goto error0; |
| 1484 | } | 1484 | } |
| 1485 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1485 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1486 | /* | 1486 | /* |
| 1487 | * Get the offset in the inode chunk. | 1487 | * Get the offset in the inode chunk. |
| 1488 | */ | 1488 | */ |
| @@ -1592,7 +1592,7 @@ xfs_difree_finobt( | |||
| 1592 | * freed an inode in a previously fully allocated chunk. If not, | 1592 | * freed an inode in a previously fully allocated chunk. If not, |
| 1593 | * something is out of sync. | 1593 | * something is out of sync. |
| 1594 | */ | 1594 | */ |
| 1595 | XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); | 1595 | XFS_WANT_CORRUPTED_GOTO(mp, ibtrec->ir_freecount == 1, error); |
| 1596 | 1596 | ||
| 1597 | error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, | 1597 | error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, |
| 1598 | ibtrec->ir_free, &i); | 1598 | ibtrec->ir_free, &i); |
| @@ -1613,12 +1613,12 @@ xfs_difree_finobt( | |||
| 1613 | error = xfs_inobt_get_rec(cur, &rec, &i); | 1613 | error = xfs_inobt_get_rec(cur, &rec, &i); |
| 1614 | if (error) | 1614 | if (error) |
| 1615 | goto error; | 1615 | goto error; |
| 1616 | XFS_WANT_CORRUPTED_GOTO(i == 1, error); | 1616 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error); |
| 1617 | 1617 | ||
| 1618 | rec.ir_free |= XFS_INOBT_MASK(offset); | 1618 | rec.ir_free |= XFS_INOBT_MASK(offset); |
| 1619 | rec.ir_freecount++; | 1619 | rec.ir_freecount++; |
| 1620 | 1620 | ||
| 1621 | XFS_WANT_CORRUPTED_GOTO((rec.ir_free == ibtrec->ir_free) && | 1621 | XFS_WANT_CORRUPTED_GOTO(mp, (rec.ir_free == ibtrec->ir_free) && |
| 1622 | (rec.ir_freecount == ibtrec->ir_freecount), | 1622 | (rec.ir_freecount == ibtrec->ir_freecount), |
| 1623 | error); | 1623 | error); |
| 1624 | 1624 | ||
diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index b0a5fe95a3e2..f3ea02bf893e 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c | |||
| @@ -111,14 +111,6 @@ xfs_mount_validate_sb( | |||
| 111 | bool check_inprogress, | 111 | bool check_inprogress, |
| 112 | bool check_version) | 112 | bool check_version) |
| 113 | { | 113 | { |
| 114 | |||
| 115 | /* | ||
| 116 | * If the log device and data device have the | ||
| 117 | * same device number, the log is internal. | ||
| 118 | * Consequently, the sb_logstart should be non-zero. If | ||
| 119 | * we have a zero sb_logstart in this case, we may be trying to mount | ||
| 120 | * a volume filesystem in a non-volume manner. | ||
| 121 | */ | ||
| 122 | if (sbp->sb_magicnum != XFS_SB_MAGIC) { | 114 | if (sbp->sb_magicnum != XFS_SB_MAGIC) { |
| 123 | xfs_warn(mp, "bad magic number"); | 115 | xfs_warn(mp, "bad magic number"); |
| 124 | return -EWRONGFS; | 116 | return -EWRONGFS; |
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 507d96a57ac7..092d652bc03d 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c | |||
| @@ -537,9 +537,9 @@ xfs_buf_item_push( | |||
| 537 | 537 | ||
| 538 | /* has a previous flush failed due to IO errors? */ | 538 | /* has a previous flush failed due to IO errors? */ |
| 539 | if ((bp->b_flags & XBF_WRITE_FAIL) && | 539 | if ((bp->b_flags & XBF_WRITE_FAIL) && |
| 540 | ___ratelimit(&xfs_buf_write_fail_rl_state, "XFS:")) { | 540 | ___ratelimit(&xfs_buf_write_fail_rl_state, "XFS: Failing async write")) { |
| 541 | xfs_warn(bp->b_target->bt_mount, | 541 | xfs_warn(bp->b_target->bt_mount, |
| 542 | "Detected failing async write on buffer block 0x%llx. Retrying async write.", | 542 | "Failing async write on buffer block 0x%llx. Retrying async write.", |
| 543 | (long long)bp->b_bn); | 543 | (long long)bp->b_bn); |
| 544 | } | 544 | } |
| 545 | 545 | ||
diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 799e5a2d334d..e85a9519a5ae 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c | |||
| @@ -84,7 +84,7 @@ xfs_trim_extents( | |||
| 84 | error = xfs_alloc_get_rec(cur, &fbno, &flen, &i); | 84 | error = xfs_alloc_get_rec(cur, &fbno, &flen, &i); |
| 85 | if (error) | 85 | if (error) |
| 86 | goto out_del_cursor; | 86 | goto out_del_cursor; |
| 87 | XFS_WANT_CORRUPTED_GOTO(i == 1, out_del_cursor); | 87 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_del_cursor); |
| 88 | ASSERT(flen <= be32_to_cpu(XFS_BUF_TO_AGF(agbp)->agf_longest)); | 88 | ASSERT(flen <= be32_to_cpu(XFS_BUF_TO_AGF(agbp)->agf_longest)); |
| 89 | 89 | ||
| 90 | /* | 90 | /* |
diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 279a76e52791..c0394ed126fc 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h | |||
| @@ -40,25 +40,25 @@ extern void xfs_verifier_error(struct xfs_buf *bp); | |||
| 40 | /* | 40 | /* |
| 41 | * Macros to set EFSCORRUPTED & return/branch. | 41 | * Macros to set EFSCORRUPTED & return/branch. |
| 42 | */ | 42 | */ |
| 43 | #define XFS_WANT_CORRUPTED_GOTO(x,l) \ | 43 | #define XFS_WANT_CORRUPTED_GOTO(mp, x, l) \ |
| 44 | { \ | 44 | { \ |
| 45 | int fs_is_ok = (x); \ | 45 | int fs_is_ok = (x); \ |
| 46 | ASSERT(fs_is_ok); \ | 46 | ASSERT(fs_is_ok); \ |
| 47 | if (unlikely(!fs_is_ok)) { \ | 47 | if (unlikely(!fs_is_ok)) { \ |
| 48 | XFS_ERROR_REPORT("XFS_WANT_CORRUPTED_GOTO", \ | 48 | XFS_ERROR_REPORT("XFS_WANT_CORRUPTED_GOTO", \ |
| 49 | XFS_ERRLEVEL_LOW, NULL); \ | 49 | XFS_ERRLEVEL_LOW, mp); \ |
| 50 | error = -EFSCORRUPTED; \ | 50 | error = -EFSCORRUPTED; \ |
| 51 | goto l; \ | 51 | goto l; \ |
| 52 | } \ | 52 | } \ |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | #define XFS_WANT_CORRUPTED_RETURN(x) \ | 55 | #define XFS_WANT_CORRUPTED_RETURN(mp, x) \ |
| 56 | { \ | 56 | { \ |
| 57 | int fs_is_ok = (x); \ | 57 | int fs_is_ok = (x); \ |
| 58 | ASSERT(fs_is_ok); \ | 58 | ASSERT(fs_is_ok); \ |
| 59 | if (unlikely(!fs_is_ok)) { \ | 59 | if (unlikely(!fs_is_ok)) { \ |
| 60 | XFS_ERROR_REPORT("XFS_WANT_CORRUPTED_RETURN", \ | 60 | XFS_ERROR_REPORT("XFS_WANT_CORRUPTED_RETURN", \ |
| 61 | XFS_ERRLEVEL_LOW, NULL); \ | 61 | XFS_ERRLEVEL_LOW, mp); \ |
| 62 | return -EFSCORRUPTED; \ | 62 | return -EFSCORRUPTED; \ |
| 63 | } \ | 63 | } \ |
| 64 | } | 64 | } |
diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 9771b7ef62ed..76a9f2783282 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c | |||
| @@ -439,11 +439,11 @@ again: | |||
| 439 | *ipp = ip; | 439 | *ipp = ip; |
| 440 | 440 | ||
| 441 | /* | 441 | /* |
| 442 | * If we have a real type for an on-disk inode, we can set ops(&unlock) | 442 | * If we have a real type for an on-disk inode, we can setup the inode |
| 443 | * now. If it's a new inode being created, xfs_ialloc will handle it. | 443 | * now. If it's a new inode being created, xfs_ialloc will handle it. |
| 444 | */ | 444 | */ |
| 445 | if (xfs_iflags_test(ip, XFS_INEW) && ip->i_d.di_mode != 0) | 445 | if (xfs_iflags_test(ip, XFS_INEW) && ip->i_d.di_mode != 0) |
| 446 | xfs_setup_inode(ip); | 446 | xfs_setup_existing_inode(ip); |
| 447 | return 0; | 447 | return 0; |
| 448 | 448 | ||
| 449 | out_error_or_again: | 449 | out_error_or_again: |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 6163767aa856..698da0388f22 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -818,7 +818,7 @@ xfs_ialloc( | |||
| 818 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); | 818 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); |
| 819 | xfs_trans_log_inode(tp, ip, flags); | 819 | xfs_trans_log_inode(tp, ip, flags); |
| 820 | 820 | ||
| 821 | /* now that we have an i_mode we can setup inode ops and unlock */ | 821 | /* now that we have an i_mode we can setup the inode structure */ |
| 822 | xfs_setup_inode(ip); | 822 | xfs_setup_inode(ip); |
| 823 | 823 | ||
| 824 | *ipp = ip; | 824 | *ipp = ip; |
| @@ -1235,12 +1235,14 @@ xfs_create( | |||
| 1235 | xfs_trans_cancel(tp, cancel_flags); | 1235 | xfs_trans_cancel(tp, cancel_flags); |
| 1236 | out_release_inode: | 1236 | out_release_inode: |
| 1237 | /* | 1237 | /* |
| 1238 | * Wait until after the current transaction is aborted to | 1238 | * Wait until after the current transaction is aborted to finish the |
| 1239 | * release the inode. This prevents recursive transactions | 1239 | * setup of the inode and release the inode. This prevents recursive |
| 1240 | * and deadlocks from xfs_inactive. | 1240 | * transactions and deadlocks from xfs_inactive. |
| 1241 | */ | 1241 | */ |
| 1242 | if (ip) | 1242 | if (ip) { |
| 1243 | xfs_finish_inode_setup(ip); | ||
| 1243 | IRELE(ip); | 1244 | IRELE(ip); |
| 1245 | } | ||
| 1244 | 1246 | ||
| 1245 | xfs_qm_dqrele(udqp); | 1247 | xfs_qm_dqrele(udqp); |
| 1246 | xfs_qm_dqrele(gdqp); | 1248 | xfs_qm_dqrele(gdqp); |
| @@ -1345,12 +1347,14 @@ xfs_create_tmpfile( | |||
| 1345 | xfs_trans_cancel(tp, cancel_flags); | 1347 | xfs_trans_cancel(tp, cancel_flags); |
| 1346 | out_release_inode: | 1348 | out_release_inode: |
| 1347 | /* | 1349 | /* |
| 1348 | * Wait until after the current transaction is aborted to | 1350 | * Wait until after the current transaction is aborted to finish the |
| 1349 | * release the inode. This prevents recursive transactions | 1351 | * setup of the inode and release the inode. This prevents recursive |
| 1350 | * and deadlocks from xfs_inactive. | 1352 | * transactions and deadlocks from xfs_inactive. |
| 1351 | */ | 1353 | */ |
| 1352 | if (ip) | 1354 | if (ip) { |
| 1355 | xfs_finish_inode_setup(ip); | ||
| 1353 | IRELE(ip); | 1356 | IRELE(ip); |
| 1357 | } | ||
| 1354 | 1358 | ||
| 1355 | xfs_qm_dqrele(udqp); | 1359 | xfs_qm_dqrele(udqp); |
| 1356 | xfs_qm_dqrele(gdqp); | 1360 | xfs_qm_dqrele(gdqp); |
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index a1cd55f3f351..c73b63d51bc1 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
| @@ -391,6 +391,28 @@ int xfs_zero_eof(struct xfs_inode *ip, xfs_off_t offset, | |||
| 391 | int xfs_iozero(struct xfs_inode *ip, loff_t pos, size_t count); | 391 | int xfs_iozero(struct xfs_inode *ip, loff_t pos, size_t count); |
| 392 | 392 | ||
| 393 | 393 | ||
| 394 | /* from xfs_iops.c */ | ||
| 395 | /* | ||
| 396 | * When setting up a newly allocated inode, we need to call | ||
| 397 | * xfs_finish_inode_setup() once the inode is fully instantiated at | ||
| 398 | * the VFS level to prevent the rest of the world seeing the inode | ||
| 399 | * before we've completed instantiation. Otherwise we can do it | ||
| 400 | * the moment the inode lookup is complete. | ||
| 401 | */ | ||
| 402 | extern void xfs_setup_inode(struct xfs_inode *ip); | ||
| 403 | static inline void xfs_finish_inode_setup(struct xfs_inode *ip) | ||
| 404 | { | ||
| 405 | xfs_iflags_clear(ip, XFS_INEW); | ||
| 406 | barrier(); | ||
| 407 | unlock_new_inode(VFS_I(ip)); | ||
| 408 | } | ||
| 409 | |||
| 410 | static inline void xfs_setup_existing_inode(struct xfs_inode *ip) | ||
| 411 | { | ||
| 412 | xfs_setup_inode(ip); | ||
| 413 | xfs_finish_inode_setup(ip); | ||
| 414 | } | ||
| 415 | |||
| 394 | #define IHOLD(ip) \ | 416 | #define IHOLD(ip) \ |
| 395 | do { \ | 417 | do { \ |
| 396 | ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ | 418 | ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ |
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index e53a90331422..3ccc28e8d3a0 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c | |||
| @@ -187,6 +187,8 @@ xfs_generic_create( | |||
| 187 | else | 187 | else |
| 188 | d_instantiate(dentry, inode); | 188 | d_instantiate(dentry, inode); |
| 189 | 189 | ||
| 190 | xfs_finish_inode_setup(ip); | ||
| 191 | |||
| 190 | out_free_acl: | 192 | out_free_acl: |
| 191 | if (default_acl) | 193 | if (default_acl) |
| 192 | posix_acl_release(default_acl); | 194 | posix_acl_release(default_acl); |
| @@ -195,6 +197,7 @@ xfs_generic_create( | |||
| 195 | return error; | 197 | return error; |
| 196 | 198 | ||
| 197 | out_cleanup_inode: | 199 | out_cleanup_inode: |
| 200 | xfs_finish_inode_setup(ip); | ||
| 198 | if (!tmpfile) | 201 | if (!tmpfile) |
| 199 | xfs_cleanup_inode(dir, inode, dentry); | 202 | xfs_cleanup_inode(dir, inode, dentry); |
| 200 | iput(inode); | 203 | iput(inode); |
| @@ -367,9 +370,11 @@ xfs_vn_symlink( | |||
| 367 | goto out_cleanup_inode; | 370 | goto out_cleanup_inode; |
| 368 | 371 | ||
| 369 | d_instantiate(dentry, inode); | 372 | d_instantiate(dentry, inode); |
| 373 | xfs_finish_inode_setup(cip); | ||
| 370 | return 0; | 374 | return 0; |
| 371 | 375 | ||
| 372 | out_cleanup_inode: | 376 | out_cleanup_inode: |
| 377 | xfs_finish_inode_setup(cip); | ||
| 373 | xfs_cleanup_inode(dir, inode, dentry); | 378 | xfs_cleanup_inode(dir, inode, dentry); |
| 374 | iput(inode); | 379 | iput(inode); |
| 375 | out: | 380 | out: |
| @@ -1228,16 +1233,12 @@ xfs_diflags_to_iflags( | |||
| 1228 | } | 1233 | } |
| 1229 | 1234 | ||
| 1230 | /* | 1235 | /* |
| 1231 | * Initialize the Linux inode, set up the operation vectors and | 1236 | * Initialize the Linux inode and set up the operation vectors. |
| 1232 | * unlock the inode. | ||
| 1233 | * | ||
| 1234 | * When reading existing inodes from disk this is called directly | ||
| 1235 | * from xfs_iget, when creating a new inode it is called from | ||
| 1236 | * xfs_ialloc after setting up the inode. | ||
| 1237 | * | 1237 | * |
| 1238 | * We are always called with an uninitialised linux inode here. | 1238 | * When reading existing inodes from disk this is called directly from xfs_iget, |
| 1239 | * We need to initialise the necessary fields and take a reference | 1239 | * when creating a new inode it is called from xfs_ialloc after setting up the |
| 1240 | * on it. | 1240 | * inode. These callers have different criteria for clearing XFS_INEW, so leave |
| 1241 | * it up to the caller to deal with unlocking the inode appropriately. | ||
| 1241 | */ | 1242 | */ |
| 1242 | void | 1243 | void |
| 1243 | xfs_setup_inode( | 1244 | xfs_setup_inode( |
| @@ -1324,9 +1325,4 @@ xfs_setup_inode( | |||
| 1324 | inode_has_no_xattr(inode); | 1325 | inode_has_no_xattr(inode); |
| 1325 | cache_no_acl(inode); | 1326 | cache_no_acl(inode); |
| 1326 | } | 1327 | } |
| 1327 | |||
| 1328 | xfs_iflags_clear(ip, XFS_INEW); | ||
| 1329 | barrier(); | ||
| 1330 | |||
| 1331 | unlock_new_inode(inode); | ||
| 1332 | } | 1328 | } |
diff --git a/fs/xfs/xfs_iops.h b/fs/xfs/xfs_iops.h index ea7a98e9cb70..a0f84abb0d09 100644 --- a/fs/xfs/xfs_iops.h +++ b/fs/xfs/xfs_iops.h | |||
| @@ -25,8 +25,6 @@ extern const struct file_operations xfs_dir_file_operations; | |||
| 25 | 25 | ||
| 26 | extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size); | 26 | extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size); |
| 27 | 27 | ||
| 28 | extern void xfs_setup_inode(struct xfs_inode *); | ||
| 29 | |||
| 30 | /* | 28 | /* |
| 31 | * Internal setattr interfaces. | 29 | * Internal setattr interfaces. |
| 32 | */ | 30 | */ |
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 82e314258f73..80429891dc9b 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c | |||
| @@ -229,7 +229,7 @@ xfs_bulkstat_grab_ichunk( | |||
| 229 | error = xfs_inobt_get_rec(cur, irec, &stat); | 229 | error = xfs_inobt_get_rec(cur, irec, &stat); |
| 230 | if (error) | 230 | if (error) |
| 231 | return error; | 231 | return error; |
| 232 | XFS_WANT_CORRUPTED_RETURN(stat == 1); | 232 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, stat == 1); |
| 233 | 233 | ||
| 234 | /* Check if the record contains the inode in request */ | 234 | /* Check if the record contains the inode in request */ |
| 235 | if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) { | 235 | if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) { |
diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index fbbb9e62e274..5538468c7f63 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c | |||
| @@ -719,6 +719,7 @@ xfs_qm_qino_alloc( | |||
| 719 | xfs_trans_t *tp; | 719 | xfs_trans_t *tp; |
| 720 | int error; | 720 | int error; |
| 721 | int committed; | 721 | int committed; |
| 722 | bool need_alloc = true; | ||
| 722 | 723 | ||
| 723 | *ip = NULL; | 724 | *ip = NULL; |
| 724 | /* | 725 | /* |
| @@ -747,6 +748,7 @@ xfs_qm_qino_alloc( | |||
| 747 | return error; | 748 | return error; |
| 748 | mp->m_sb.sb_gquotino = NULLFSINO; | 749 | mp->m_sb.sb_gquotino = NULLFSINO; |
| 749 | mp->m_sb.sb_pquotino = NULLFSINO; | 750 | mp->m_sb.sb_pquotino = NULLFSINO; |
| 751 | need_alloc = false; | ||
| 750 | } | 752 | } |
| 751 | } | 753 | } |
| 752 | 754 | ||
| @@ -758,7 +760,7 @@ xfs_qm_qino_alloc( | |||
| 758 | return error; | 760 | return error; |
| 759 | } | 761 | } |
| 760 | 762 | ||
| 761 | if (!*ip) { | 763 | if (need_alloc) { |
| 762 | error = xfs_dir_ialloc(&tp, NULL, S_IFREG, 1, 0, 0, 1, ip, | 764 | error = xfs_dir_ialloc(&tp, NULL, S_IFREG, 1, 0, 0, 1, ip, |
| 763 | &committed); | 765 | &committed); |
| 764 | if (error) { | 766 | if (error) { |
| @@ -794,11 +796,14 @@ xfs_qm_qino_alloc( | |||
| 794 | spin_unlock(&mp->m_sb_lock); | 796 | spin_unlock(&mp->m_sb_lock); |
| 795 | xfs_log_sb(tp); | 797 | xfs_log_sb(tp); |
| 796 | 798 | ||
| 797 | if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES))) { | 799 | error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); |
| 800 | if (error) { | ||
| 801 | ASSERT(XFS_FORCED_SHUTDOWN(mp)); | ||
| 798 | xfs_alert(mp, "%s failed (error %d)!", __func__, error); | 802 | xfs_alert(mp, "%s failed (error %d)!", __func__, error); |
| 799 | return error; | ||
| 800 | } | 803 | } |
| 801 | return 0; | 804 | if (need_alloc) |
| 805 | xfs_finish_inode_setup(*ip); | ||
| 806 | return error; | ||
| 802 | } | 807 | } |
| 803 | 808 | ||
| 804 | 809 | ||
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 8fcc4ccc5c79..58453e3255f8 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c | |||
| @@ -109,8 +109,6 @@ static struct xfs_kobj xfs_dbg_kobj; /* global debug sysfs attrs */ | |||
| 109 | #define MNTOPT_GQUOTANOENF "gqnoenforce"/* group quota limit enforcement */ | 109 | #define MNTOPT_GQUOTANOENF "gqnoenforce"/* group quota limit enforcement */ |
| 110 | #define MNTOPT_PQUOTANOENF "pqnoenforce"/* project quota limit enforcement */ | 110 | #define MNTOPT_PQUOTANOENF "pqnoenforce"/* project quota limit enforcement */ |
| 111 | #define MNTOPT_QUOTANOENF "qnoenforce" /* same as uqnoenforce */ | 111 | #define MNTOPT_QUOTANOENF "qnoenforce" /* same as uqnoenforce */ |
| 112 | #define MNTOPT_DELAYLOG "delaylog" /* Delayed logging enabled */ | ||
| 113 | #define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed logging disabled */ | ||
| 114 | #define MNTOPT_DISCARD "discard" /* Discard unused blocks */ | 112 | #define MNTOPT_DISCARD "discard" /* Discard unused blocks */ |
| 115 | #define MNTOPT_NODISCARD "nodiscard" /* Do not discard unused blocks */ | 113 | #define MNTOPT_NODISCARD "nodiscard" /* Do not discard unused blocks */ |
| 116 | 114 | ||
| @@ -361,28 +359,10 @@ xfs_parseargs( | |||
| 361 | } else if (!strcmp(this_char, MNTOPT_GQUOTANOENF)) { | 359 | } else if (!strcmp(this_char, MNTOPT_GQUOTANOENF)) { |
| 362 | mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); | 360 | mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); |
| 363 | mp->m_qflags &= ~XFS_GQUOTA_ENFD; | 361 | mp->m_qflags &= ~XFS_GQUOTA_ENFD; |
| 364 | } else if (!strcmp(this_char, MNTOPT_DELAYLOG)) { | ||
| 365 | xfs_warn(mp, | ||
| 366 | "delaylog is the default now, option is deprecated."); | ||
| 367 | } else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) { | ||
| 368 | xfs_warn(mp, | ||
| 369 | "nodelaylog support has been removed, option is deprecated."); | ||
| 370 | } else if (!strcmp(this_char, MNTOPT_DISCARD)) { | 362 | } else if (!strcmp(this_char, MNTOPT_DISCARD)) { |
| 371 | mp->m_flags |= XFS_MOUNT_DISCARD; | 363 | mp->m_flags |= XFS_MOUNT_DISCARD; |
| 372 | } else if (!strcmp(this_char, MNTOPT_NODISCARD)) { | 364 | } else if (!strcmp(this_char, MNTOPT_NODISCARD)) { |
| 373 | mp->m_flags &= ~XFS_MOUNT_DISCARD; | 365 | mp->m_flags &= ~XFS_MOUNT_DISCARD; |
| 374 | } else if (!strcmp(this_char, "ihashsize")) { | ||
| 375 | xfs_warn(mp, | ||
| 376 | "ihashsize no longer used, option is deprecated."); | ||
| 377 | } else if (!strcmp(this_char, "osyncisdsync")) { | ||
| 378 | xfs_warn(mp, | ||
| 379 | "osyncisdsync has no effect, option is deprecated."); | ||
| 380 | } else if (!strcmp(this_char, "osyncisosync")) { | ||
| 381 | xfs_warn(mp, | ||
| 382 | "osyncisosync has no effect, option is deprecated."); | ||
| 383 | } else if (!strcmp(this_char, "irixsgid")) { | ||
| 384 | xfs_warn(mp, | ||
| 385 | "irixsgid is now a sysctl(2) variable, option is deprecated."); | ||
| 386 | } else { | 366 | } else { |
| 387 | xfs_warn(mp, "unknown mount option [%s].", this_char); | 367 | xfs_warn(mp, "unknown mount option [%s].", this_char); |
| 388 | return -EINVAL; | 368 | return -EINVAL; |
| @@ -1039,6 +1019,7 @@ xfs_fs_put_super( | |||
| 1039 | { | 1019 | { |
| 1040 | struct xfs_mount *mp = XFS_M(sb); | 1020 | struct xfs_mount *mp = XFS_M(sb); |
| 1041 | 1021 | ||
| 1022 | xfs_notice(mp, "Unmounting Filesystem"); | ||
| 1042 | xfs_filestream_unmount(mp); | 1023 | xfs_filestream_unmount(mp); |
| 1043 | xfs_unmountfs(mp); | 1024 | xfs_unmountfs(mp); |
| 1044 | 1025 | ||
diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 25791df6f638..3df411eadb86 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c | |||
| @@ -177,7 +177,7 @@ xfs_symlink( | |||
| 177 | int pathlen; | 177 | int pathlen; |
| 178 | struct xfs_bmap_free free_list; | 178 | struct xfs_bmap_free free_list; |
| 179 | xfs_fsblock_t first_block; | 179 | xfs_fsblock_t first_block; |
| 180 | bool unlock_dp_on_error = false; | 180 | bool unlock_dp_on_error = false; |
| 181 | uint cancel_flags; | 181 | uint cancel_flags; |
| 182 | int committed; | 182 | int committed; |
| 183 | xfs_fileoff_t first_fsb; | 183 | xfs_fileoff_t first_fsb; |
| @@ -221,7 +221,7 @@ xfs_symlink( | |||
| 221 | XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, | 221 | XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, |
| 222 | &udqp, &gdqp, &pdqp); | 222 | &udqp, &gdqp, &pdqp); |
| 223 | if (error) | 223 | if (error) |
| 224 | goto std_return; | 224 | return error; |
| 225 | 225 | ||
| 226 | tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK); | 226 | tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK); |
| 227 | cancel_flags = XFS_TRANS_RELEASE_LOG_RES; | 227 | cancel_flags = XFS_TRANS_RELEASE_LOG_RES; |
| @@ -241,7 +241,7 @@ xfs_symlink( | |||
| 241 | } | 241 | } |
| 242 | if (error) { | 242 | if (error) { |
| 243 | cancel_flags = 0; | 243 | cancel_flags = 0; |
| 244 | goto error_return; | 244 | goto out_trans_cancel; |
| 245 | } | 245 | } |
| 246 | 246 | ||
| 247 | xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); | 247 | xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); |
| @@ -252,7 +252,7 @@ xfs_symlink( | |||
| 252 | */ | 252 | */ |
| 253 | if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { | 253 | if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { |
| 254 | error = -EPERM; | 254 | error = -EPERM; |
| 255 | goto error_return; | 255 | goto out_trans_cancel; |
| 256 | } | 256 | } |
| 257 | 257 | ||
| 258 | /* | 258 | /* |
| @@ -261,7 +261,7 @@ xfs_symlink( | |||
| 261 | error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, | 261 | error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, |
| 262 | pdqp, resblks, 1, 0); | 262 | pdqp, resblks, 1, 0); |
| 263 | if (error) | 263 | if (error) |
| 264 | goto error_return; | 264 | goto out_trans_cancel; |
| 265 | 265 | ||
| 266 | /* | 266 | /* |
| 267 | * Check for ability to enter directory entry, if no space reserved. | 267 | * Check for ability to enter directory entry, if no space reserved. |
| @@ -269,7 +269,7 @@ xfs_symlink( | |||
| 269 | if (!resblks) { | 269 | if (!resblks) { |
| 270 | error = xfs_dir_canenter(tp, dp, link_name); | 270 | error = xfs_dir_canenter(tp, dp, link_name); |
| 271 | if (error) | 271 | if (error) |
| 272 | goto error_return; | 272 | goto out_trans_cancel; |
| 273 | } | 273 | } |
| 274 | /* | 274 | /* |
| 275 | * Initialize the bmap freelist prior to calling either | 275 | * Initialize the bmap freelist prior to calling either |
| @@ -282,15 +282,14 @@ xfs_symlink( | |||
| 282 | */ | 282 | */ |
| 283 | error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, | 283 | error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, |
| 284 | prid, resblks > 0, &ip, NULL); | 284 | prid, resblks > 0, &ip, NULL); |
| 285 | if (error) { | 285 | if (error) |
| 286 | if (error == -ENOSPC) | 286 | goto out_trans_cancel; |
| 287 | goto error_return; | ||
| 288 | goto error1; | ||
| 289 | } | ||
| 290 | 287 | ||
| 291 | /* | 288 | /* |
| 292 | * An error after we've joined dp to the transaction will result in the | 289 | * Now we join the directory inode to the transaction. We do not do it |
| 293 | * transaction cancel unlocking dp so don't do it explicitly in the | 290 | * earlier because xfs_dir_ialloc might commit the previous transaction |
| 291 | * (and release all the locks). An error from here on will result in | ||
| 292 | * the transaction cancel unlocking dp so don't do it explicitly in the | ||
| 294 | * error path. | 293 | * error path. |
| 295 | */ | 294 | */ |
| 296 | xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); | 295 | xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); |
| @@ -330,7 +329,7 @@ xfs_symlink( | |||
| 330 | XFS_BMAPI_METADATA, &first_block, resblks, | 329 | XFS_BMAPI_METADATA, &first_block, resblks, |
| 331 | mval, &nmaps, &free_list); | 330 | mval, &nmaps, &free_list); |
| 332 | if (error) | 331 | if (error) |
| 333 | goto error2; | 332 | goto out_bmap_cancel; |
| 334 | 333 | ||
| 335 | if (resblks) | 334 | if (resblks) |
| 336 | resblks -= fs_blocks; | 335 | resblks -= fs_blocks; |
| @@ -348,7 +347,7 @@ xfs_symlink( | |||
| 348 | BTOBB(byte_cnt), 0); | 347 | BTOBB(byte_cnt), 0); |
| 349 | if (!bp) { | 348 | if (!bp) { |
| 350 | error = -ENOMEM; | 349 | error = -ENOMEM; |
| 351 | goto error2; | 350 | goto out_bmap_cancel; |
| 352 | } | 351 | } |
| 353 | bp->b_ops = &xfs_symlink_buf_ops; | 352 | bp->b_ops = &xfs_symlink_buf_ops; |
| 354 | 353 | ||
| @@ -378,7 +377,7 @@ xfs_symlink( | |||
| 378 | error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, | 377 | error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, |
| 379 | &first_block, &free_list, resblks); | 378 | &first_block, &free_list, resblks); |
| 380 | if (error) | 379 | if (error) |
| 381 | goto error2; | 380 | goto out_bmap_cancel; |
| 382 | xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 381 | xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); |
| 383 | xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); | 382 | xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); |
| 384 | 383 | ||
| @@ -392,10 +391,13 @@ xfs_symlink( | |||
| 392 | } | 391 | } |
| 393 | 392 | ||
| 394 | error = xfs_bmap_finish(&tp, &free_list, &committed); | 393 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 395 | if (error) { | 394 | if (error) |
| 396 | goto error2; | 395 | goto out_bmap_cancel; |
| 397 | } | 396 | |
| 398 | error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); | 397 | error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); |
| 398 | if (error) | ||
| 399 | goto out_release_inode; | ||
| 400 | |||
| 399 | xfs_qm_dqrele(udqp); | 401 | xfs_qm_dqrele(udqp); |
| 400 | xfs_qm_dqrele(gdqp); | 402 | xfs_qm_dqrele(gdqp); |
| 401 | xfs_qm_dqrele(pdqp); | 403 | xfs_qm_dqrele(pdqp); |
| @@ -403,20 +405,28 @@ xfs_symlink( | |||
| 403 | *ipp = ip; | 405 | *ipp = ip; |
| 404 | return 0; | 406 | return 0; |
| 405 | 407 | ||
| 406 | error2: | 408 | out_bmap_cancel: |
| 407 | IRELE(ip); | ||
| 408 | error1: | ||
| 409 | xfs_bmap_cancel(&free_list); | 409 | xfs_bmap_cancel(&free_list); |
| 410 | cancel_flags |= XFS_TRANS_ABORT; | 410 | cancel_flags |= XFS_TRANS_ABORT; |
| 411 | error_return: | 411 | out_trans_cancel: |
| 412 | xfs_trans_cancel(tp, cancel_flags); | 412 | xfs_trans_cancel(tp, cancel_flags); |
| 413 | out_release_inode: | ||
| 414 | /* | ||
| 415 | * Wait until after the current transaction is aborted to finish the | ||
| 416 | * setup of the inode and release the inode. This prevents recursive | ||
| 417 | * transactions and deadlocks from xfs_inactive. | ||
| 418 | */ | ||
| 419 | if (ip) { | ||
| 420 | xfs_finish_inode_setup(ip); | ||
| 421 | IRELE(ip); | ||
| 422 | } | ||
| 423 | |||
| 413 | xfs_qm_dqrele(udqp); | 424 | xfs_qm_dqrele(udqp); |
| 414 | xfs_qm_dqrele(gdqp); | 425 | xfs_qm_dqrele(gdqp); |
| 415 | xfs_qm_dqrele(pdqp); | 426 | xfs_qm_dqrele(pdqp); |
| 416 | 427 | ||
| 417 | if (unlock_dp_on_error) | 428 | if (unlock_dp_on_error) |
| 418 | xfs_iunlock(dp, XFS_ILOCK_EXCL); | 429 | xfs_iunlock(dp, XFS_ILOCK_EXCL); |
| 419 | std_return: | ||
| 420 | return error; | 430 | return error; |
| 421 | } | 431 | } |
| 422 | 432 | ||
