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 | |
parent | 83d5f01858b56db69c8e4ca5389ef7c29bfdb5dd (diff) | |
parent | 444a702231412e82fb1c09679adc159301e9242c (diff) |
Merge branch 'xfs-misc-fixes-for-4.1' into for-next
-rw-r--r-- | Documentation/filesystems/xfs.txt | 29 | ||||
-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 |
19 files changed, 288 insertions, 274 deletions
diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt index 0bfafe108357..5a5a05582b58 100644 --- a/Documentation/filesystems/xfs.txt +++ b/Documentation/filesystems/xfs.txt | |||
@@ -228,30 +228,19 @@ default behaviour. | |||
228 | Deprecated Mount Options | 228 | Deprecated Mount Options |
229 | ======================== | 229 | ======================== |
230 | 230 | ||
231 | delaylog/nodelaylog | 231 | None at present. |
232 | Delayed logging is the only logging method that XFS supports | ||
233 | now, so these mount options are now ignored. | ||
234 | |||
235 | Due for removal in 3.12. | ||
236 | |||
237 | ihashsize=value | ||
238 | In memory inode hashes have been removed, so this option has | ||
239 | no function as of August 2007. Option is deprecated. | ||
240 | |||
241 | Due for removal in 3.12. | ||
242 | 232 | ||
243 | irixsgid | ||
244 | This behaviour is now controlled by a sysctl, so the mount | ||
245 | option is ignored. | ||
246 | 233 | ||
247 | Due for removal in 3.12. | 234 | Removed Mount Options |
235 | ===================== | ||
248 | 236 | ||
249 | osyncisdsync | 237 | Name Removed |
250 | osyncisosync | 238 | ---- ------- |
251 | O_SYNC and O_DSYNC are fully supported, so there is no need | 239 | delaylog/nodelaylog v3.20 |
252 | for these options any more. | 240 | ihashsize v3.20 |
241 | irixsgid v3.20 | ||
242 | osyncisdsync/osyncisosync v3.20 | ||
253 | 243 | ||
254 | Due for removal in 3.12. | ||
255 | 244 | ||
256 | sysctls | 245 | sysctls |
257 | ======= | 246 | ======= |
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 | ||