diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_ialloc.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_ialloc.c | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 116ef1ddb3e3..07349a183a11 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c | |||
| @@ -376,7 +376,8 @@ xfs_ialloc_ag_alloc( | |||
| 376 | */ | 376 | */ |
| 377 | newlen = args.mp->m_ialloc_inos; | 377 | newlen = args.mp->m_ialloc_inos; |
| 378 | if (args.mp->m_maxicount && | 378 | if (args.mp->m_maxicount && |
| 379 | args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) | 379 | percpu_counter_read(&args.mp->m_icount) + newlen > |
| 380 | args.mp->m_maxicount) | ||
| 380 | return -ENOSPC; | 381 | return -ENOSPC; |
| 381 | args.minlen = args.maxlen = args.mp->m_ialloc_blks; | 382 | args.minlen = args.maxlen = args.mp->m_ialloc_blks; |
| 382 | /* | 383 | /* |
| @@ -700,7 +701,7 @@ xfs_ialloc_next_rec( | |||
| 700 | error = xfs_inobt_get_rec(cur, rec, &i); | 701 | error = xfs_inobt_get_rec(cur, rec, &i); |
| 701 | if (error) | 702 | if (error) |
| 702 | return error; | 703 | return error; |
| 703 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 704 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 704 | } | 705 | } |
| 705 | 706 | ||
| 706 | return 0; | 707 | return 0; |
| @@ -724,7 +725,7 @@ xfs_ialloc_get_rec( | |||
| 724 | error = xfs_inobt_get_rec(cur, rec, &i); | 725 | error = xfs_inobt_get_rec(cur, rec, &i); |
| 725 | if (error) | 726 | if (error) |
| 726 | return error; | 727 | return error; |
| 727 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 728 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 728 | } | 729 | } |
| 729 | 730 | ||
| 730 | return 0; | 731 | return 0; |
| @@ -783,12 +784,12 @@ xfs_dialloc_ag_inobt( | |||
| 783 | error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i); | 784 | error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i); |
| 784 | if (error) | 785 | if (error) |
| 785 | goto error0; | 786 | goto error0; |
| 786 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 787 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 787 | 788 | ||
| 788 | error = xfs_inobt_get_rec(cur, &rec, &j); | 789 | error = xfs_inobt_get_rec(cur, &rec, &j); |
| 789 | if (error) | 790 | if (error) |
| 790 | goto error0; | 791 | goto error0; |
| 791 | XFS_WANT_CORRUPTED_GOTO(j == 1, error0); | 792 | XFS_WANT_CORRUPTED_GOTO(mp, j == 1, error0); |
| 792 | 793 | ||
| 793 | if (rec.ir_freecount > 0) { | 794 | if (rec.ir_freecount > 0) { |
| 794 | /* | 795 | /* |
| @@ -944,19 +945,19 @@ newino: | |||
| 944 | error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); | 945 | error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); |
| 945 | if (error) | 946 | if (error) |
| 946 | goto error0; | 947 | goto error0; |
| 947 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 948 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 948 | 949 | ||
| 949 | for (;;) { | 950 | for (;;) { |
| 950 | error = xfs_inobt_get_rec(cur, &rec, &i); | 951 | error = xfs_inobt_get_rec(cur, &rec, &i); |
| 951 | if (error) | 952 | if (error) |
| 952 | goto error0; | 953 | goto error0; |
| 953 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 954 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 954 | if (rec.ir_freecount > 0) | 955 | if (rec.ir_freecount > 0) |
| 955 | break; | 956 | break; |
| 956 | error = xfs_btree_increment(cur, 0, &i); | 957 | error = xfs_btree_increment(cur, 0, &i); |
| 957 | if (error) | 958 | if (error) |
| 958 | goto error0; | 959 | goto error0; |
| 959 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 960 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 960 | } | 961 | } |
| 961 | 962 | ||
| 962 | alloc_inode: | 963 | alloc_inode: |
| @@ -1016,7 +1017,7 @@ xfs_dialloc_ag_finobt_near( | |||
| 1016 | error = xfs_inobt_get_rec(lcur, rec, &i); | 1017 | error = xfs_inobt_get_rec(lcur, rec, &i); |
| 1017 | if (error) | 1018 | if (error) |
| 1018 | return error; | 1019 | return error; |
| 1019 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1020 | XFS_WANT_CORRUPTED_RETURN(lcur->bc_mp, i == 1); |
| 1020 | 1021 | ||
| 1021 | /* | 1022 | /* |
| 1022 | * See if we've landed in the parent inode record. The finobt | 1023 | * See if we've landed in the parent inode record. The finobt |
| @@ -1039,10 +1040,10 @@ xfs_dialloc_ag_finobt_near( | |||
| 1039 | error = xfs_inobt_get_rec(rcur, &rrec, &j); | 1040 | error = xfs_inobt_get_rec(rcur, &rrec, &j); |
| 1040 | if (error) | 1041 | if (error) |
| 1041 | goto error_rcur; | 1042 | goto error_rcur; |
| 1042 | XFS_WANT_CORRUPTED_GOTO(j == 1, error_rcur); | 1043 | XFS_WANT_CORRUPTED_GOTO(lcur->bc_mp, j == 1, error_rcur); |
| 1043 | } | 1044 | } |
| 1044 | 1045 | ||
| 1045 | XFS_WANT_CORRUPTED_GOTO(i == 1 || j == 1, error_rcur); | 1046 | XFS_WANT_CORRUPTED_GOTO(lcur->bc_mp, i == 1 || j == 1, error_rcur); |
| 1046 | if (i == 1 && j == 1) { | 1047 | if (i == 1 && j == 1) { |
| 1047 | /* | 1048 | /* |
| 1048 | * Both the left and right records are valid. Choose the closer | 1049 | * Both the left and right records are valid. Choose the closer |
| @@ -1095,7 +1096,7 @@ xfs_dialloc_ag_finobt_newino( | |||
| 1095 | error = xfs_inobt_get_rec(cur, rec, &i); | 1096 | error = xfs_inobt_get_rec(cur, rec, &i); |
| 1096 | if (error) | 1097 | if (error) |
| 1097 | return error; | 1098 | return error; |
| 1098 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1099 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1099 | return 0; | 1100 | return 0; |
| 1100 | } | 1101 | } |
| 1101 | } | 1102 | } |
| @@ -1106,12 +1107,12 @@ xfs_dialloc_ag_finobt_newino( | |||
| 1106 | error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); | 1107 | error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); |
| 1107 | if (error) | 1108 | if (error) |
| 1108 | return error; | 1109 | return error; |
| 1109 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1110 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1110 | 1111 | ||
| 1111 | error = xfs_inobt_get_rec(cur, rec, &i); | 1112 | error = xfs_inobt_get_rec(cur, rec, &i); |
| 1112 | if (error) | 1113 | if (error) |
| 1113 | return error; | 1114 | return error; |
| 1114 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1115 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1115 | 1116 | ||
| 1116 | return 0; | 1117 | return 0; |
| 1117 | } | 1118 | } |
| @@ -1133,19 +1134,19 @@ xfs_dialloc_ag_update_inobt( | |||
| 1133 | error = xfs_inobt_lookup(cur, frec->ir_startino, XFS_LOOKUP_EQ, &i); | 1134 | error = xfs_inobt_lookup(cur, frec->ir_startino, XFS_LOOKUP_EQ, &i); |
| 1134 | if (error) | 1135 | if (error) |
| 1135 | return error; | 1136 | return error; |
| 1136 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1137 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1137 | 1138 | ||
| 1138 | error = xfs_inobt_get_rec(cur, &rec, &i); | 1139 | error = xfs_inobt_get_rec(cur, &rec, &i); |
| 1139 | if (error) | 1140 | if (error) |
| 1140 | return error; | 1141 | return error; |
| 1141 | XFS_WANT_CORRUPTED_RETURN(i == 1); | 1142 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); |
| 1142 | ASSERT((XFS_AGINO_TO_OFFSET(cur->bc_mp, rec.ir_startino) % | 1143 | ASSERT((XFS_AGINO_TO_OFFSET(cur->bc_mp, rec.ir_startino) % |
| 1143 | XFS_INODES_PER_CHUNK) == 0); | 1144 | XFS_INODES_PER_CHUNK) == 0); |
| 1144 | 1145 | ||
| 1145 | rec.ir_free &= ~XFS_INOBT_MASK(offset); | 1146 | rec.ir_free &= ~XFS_INOBT_MASK(offset); |
| 1146 | rec.ir_freecount--; | 1147 | rec.ir_freecount--; |
| 1147 | 1148 | ||
| 1148 | XFS_WANT_CORRUPTED_RETURN((rec.ir_free == frec->ir_free) && | 1149 | XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, (rec.ir_free == frec->ir_free) && |
| 1149 | (rec.ir_freecount == frec->ir_freecount)); | 1150 | (rec.ir_freecount == frec->ir_freecount)); |
| 1150 | 1151 | ||
| 1151 | return xfs_inobt_update(cur, &rec); | 1152 | return xfs_inobt_update(cur, &rec); |
| @@ -1340,7 +1341,8 @@ xfs_dialloc( | |||
| 1340 | * inode. | 1341 | * inode. |
| 1341 | */ | 1342 | */ |
| 1342 | if (mp->m_maxicount && | 1343 | if (mp->m_maxicount && |
| 1343 | mp->m_sb.sb_icount + mp->m_ialloc_inos > mp->m_maxicount) { | 1344 | percpu_counter_read(&mp->m_icount) + mp->m_ialloc_inos > |
| 1345 | mp->m_maxicount) { | ||
| 1344 | noroom = 1; | 1346 | noroom = 1; |
| 1345 | okalloc = 0; | 1347 | okalloc = 0; |
| 1346 | } | 1348 | } |
| @@ -1475,14 +1477,14 @@ xfs_difree_inobt( | |||
| 1475 | __func__, error); | 1477 | __func__, error); |
| 1476 | goto error0; | 1478 | goto error0; |
| 1477 | } | 1479 | } |
| 1478 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1480 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1479 | error = xfs_inobt_get_rec(cur, &rec, &i); | 1481 | error = xfs_inobt_get_rec(cur, &rec, &i); |
| 1480 | if (error) { | 1482 | if (error) { |
| 1481 | xfs_warn(mp, "%s: xfs_inobt_get_rec() returned error %d.", | 1483 | xfs_warn(mp, "%s: xfs_inobt_get_rec() returned error %d.", |
| 1482 | __func__, error); | 1484 | __func__, error); |
| 1483 | goto error0; | 1485 | goto error0; |
| 1484 | } | 1486 | } |
| 1485 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1487 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); |
| 1486 | /* | 1488 | /* |
| 1487 | * Get the offset in the inode chunk. | 1489 | * Get the offset in the inode chunk. |
| 1488 | */ | 1490 | */ |
| @@ -1592,7 +1594,7 @@ xfs_difree_finobt( | |||
| 1592 | * freed an inode in a previously fully allocated chunk. If not, | 1594 | * freed an inode in a previously fully allocated chunk. If not, |
| 1593 | * something is out of sync. | 1595 | * something is out of sync. |
| 1594 | */ | 1596 | */ |
| 1595 | XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); | 1597 | XFS_WANT_CORRUPTED_GOTO(mp, ibtrec->ir_freecount == 1, error); |
| 1596 | 1598 | ||
| 1597 | error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, | 1599 | error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, |
| 1598 | ibtrec->ir_free, &i); | 1600 | ibtrec->ir_free, &i); |
| @@ -1613,12 +1615,12 @@ xfs_difree_finobt( | |||
| 1613 | error = xfs_inobt_get_rec(cur, &rec, &i); | 1615 | error = xfs_inobt_get_rec(cur, &rec, &i); |
| 1614 | if (error) | 1616 | if (error) |
| 1615 | goto error; | 1617 | goto error; |
| 1616 | XFS_WANT_CORRUPTED_GOTO(i == 1, error); | 1618 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error); |
| 1617 | 1619 | ||
| 1618 | rec.ir_free |= XFS_INOBT_MASK(offset); | 1620 | rec.ir_free |= XFS_INOBT_MASK(offset); |
| 1619 | rec.ir_freecount++; | 1621 | rec.ir_freecount++; |
| 1620 | 1622 | ||
| 1621 | XFS_WANT_CORRUPTED_GOTO((rec.ir_free == ibtrec->ir_free) && | 1623 | XFS_WANT_CORRUPTED_GOTO(mp, (rec.ir_free == ibtrec->ir_free) && |
| 1622 | (rec.ir_freecount == ibtrec->ir_freecount), | 1624 | (rec.ir_freecount == ibtrec->ir_freecount), |
| 1623 | error); | 1625 | error); |
| 1624 | 1626 | ||
