diff options
Diffstat (limited to 'fs/xfs/xfs_inode.c')
| -rw-r--r-- | fs/xfs/xfs_inode.c | 60 |
1 files changed, 22 insertions, 38 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index b76a829d7e20..68415cb4f23c 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -27,13 +27,10 @@ | |||
| 27 | #include "xfs_trans_priv.h" | 27 | #include "xfs_trans_priv.h" |
| 28 | #include "xfs_sb.h" | 28 | #include "xfs_sb.h" |
| 29 | #include "xfs_ag.h" | 29 | #include "xfs_ag.h" |
| 30 | #include "xfs_dir2.h" | ||
| 31 | #include "xfs_dmapi.h" | ||
| 32 | #include "xfs_mount.h" | 30 | #include "xfs_mount.h" |
| 33 | #include "xfs_bmap_btree.h" | 31 | #include "xfs_bmap_btree.h" |
| 34 | #include "xfs_alloc_btree.h" | 32 | #include "xfs_alloc_btree.h" |
| 35 | #include "xfs_ialloc_btree.h" | 33 | #include "xfs_ialloc_btree.h" |
| 36 | #include "xfs_dir2_sf.h" | ||
| 37 | #include "xfs_attr_sf.h" | 34 | #include "xfs_attr_sf.h" |
| 38 | #include "xfs_dinode.h" | 35 | #include "xfs_dinode.h" |
| 39 | #include "xfs_inode.h" | 36 | #include "xfs_inode.h" |
| @@ -44,7 +41,6 @@ | |||
| 44 | #include "xfs_alloc.h" | 41 | #include "xfs_alloc.h" |
| 45 | #include "xfs_ialloc.h" | 42 | #include "xfs_ialloc.h" |
| 46 | #include "xfs_bmap.h" | 43 | #include "xfs_bmap.h" |
| 47 | #include "xfs_rw.h" | ||
| 48 | #include "xfs_error.h" | 44 | #include "xfs_error.h" |
| 49 | #include "xfs_utils.h" | 45 | #include "xfs_utils.h" |
| 50 | #include "xfs_quota.h" | 46 | #include "xfs_quota.h" |
| @@ -426,7 +422,7 @@ xfs_iformat( | |||
| 426 | if (!XFS_DFORK_Q(dip)) | 422 | if (!XFS_DFORK_Q(dip)) |
| 427 | return 0; | 423 | return 0; |
| 428 | ASSERT(ip->i_afp == NULL); | 424 | ASSERT(ip->i_afp == NULL); |
| 429 | ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP); | 425 | ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS); |
| 430 | ip->i_afp->if_ext_max = | 426 | ip->i_afp->if_ext_max = |
| 431 | XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); | 427 | XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); |
| 432 | switch (dip->di_aformat) { | 428 | switch (dip->di_aformat) { |
| @@ -509,7 +505,7 @@ xfs_iformat_local( | |||
| 509 | ifp->if_u1.if_data = ifp->if_u2.if_inline_data; | 505 | ifp->if_u1.if_data = ifp->if_u2.if_inline_data; |
| 510 | else { | 506 | else { |
| 511 | real_size = roundup(size, 4); | 507 | real_size = roundup(size, 4); |
| 512 | ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); | 508 | ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS); |
| 513 | } | 509 | } |
| 514 | ifp->if_bytes = size; | 510 | ifp->if_bytes = size; |
| 515 | ifp->if_real_bytes = real_size; | 511 | ifp->if_real_bytes = real_size; |
| @@ -636,7 +632,7 @@ xfs_iformat_btree( | |||
| 636 | } | 632 | } |
| 637 | 633 | ||
| 638 | ifp->if_broot_bytes = size; | 634 | ifp->if_broot_bytes = size; |
| 639 | ifp->if_broot = kmem_alloc(size, KM_SLEEP); | 635 | ifp->if_broot = kmem_alloc(size, KM_SLEEP | KM_NOFS); |
| 640 | ASSERT(ifp->if_broot != NULL); | 636 | ASSERT(ifp->if_broot != NULL); |
| 641 | /* | 637 | /* |
| 642 | * Copy and convert from the on-disk structure | 638 | * Copy and convert from the on-disk structure |
| @@ -922,7 +918,6 @@ xfs_iread_extents( | |||
| 922 | int error; | 918 | int error; |
| 923 | xfs_ifork_t *ifp; | 919 | xfs_ifork_t *ifp; |
| 924 | xfs_extnum_t nextents; | 920 | xfs_extnum_t nextents; |
| 925 | size_t size; | ||
| 926 | 921 | ||
| 927 | if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) { | 922 | if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) { |
| 928 | XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW, | 923 | XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW, |
| @@ -930,7 +925,6 @@ xfs_iread_extents( | |||
| 930 | return XFS_ERROR(EFSCORRUPTED); | 925 | return XFS_ERROR(EFSCORRUPTED); |
| 931 | } | 926 | } |
| 932 | nextents = XFS_IFORK_NEXTENTS(ip, whichfork); | 927 | nextents = XFS_IFORK_NEXTENTS(ip, whichfork); |
| 933 | size = nextents * sizeof(xfs_bmbt_rec_t); | ||
| 934 | ifp = XFS_IFORK_PTR(ip, whichfork); | 928 | ifp = XFS_IFORK_PTR(ip, whichfork); |
| 935 | 929 | ||
| 936 | /* | 930 | /* |
| @@ -1226,7 +1220,7 @@ xfs_isize_check( | |||
| 1226 | (xfs_ufsize_t)XFS_MAXIOFFSET(mp)) - | 1220 | (xfs_ufsize_t)XFS_MAXIOFFSET(mp)) - |
| 1227 | map_first), | 1221 | map_first), |
| 1228 | XFS_BMAPI_ENTIRE, NULL, 0, imaps, &nimaps, | 1222 | XFS_BMAPI_ENTIRE, NULL, 0, imaps, &nimaps, |
| 1229 | NULL, NULL)) | 1223 | NULL)) |
| 1230 | return; | 1224 | return; |
| 1231 | ASSERT(nimaps == 1); | 1225 | ASSERT(nimaps == 1); |
| 1232 | ASSERT(imaps[0].br_startblock == HOLESTARTBLOCK); | 1226 | ASSERT(imaps[0].br_startblock == HOLESTARTBLOCK); |
| @@ -1460,7 +1454,7 @@ xfs_itruncate_finish( | |||
| 1460 | ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); | 1454 | ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); |
| 1461 | ASSERT(ip->i_transp == *tp); | 1455 | ASSERT(ip->i_transp == *tp); |
| 1462 | ASSERT(ip->i_itemp != NULL); | 1456 | ASSERT(ip->i_itemp != NULL); |
| 1463 | ASSERT(ip->i_itemp->ili_flags & XFS_ILI_HOLD); | 1457 | ASSERT(ip->i_itemp->ili_lock_flags == 0); |
| 1464 | 1458 | ||
| 1465 | 1459 | ||
| 1466 | ntp = *tp; | 1460 | ntp = *tp; |
| @@ -1589,11 +1583,10 @@ xfs_itruncate_finish( | |||
| 1589 | xfs_bmap_init(&free_list, &first_block); | 1583 | xfs_bmap_init(&free_list, &first_block); |
| 1590 | error = xfs_bunmapi(ntp, ip, | 1584 | error = xfs_bunmapi(ntp, ip, |
| 1591 | first_unmap_block, unmap_len, | 1585 | first_unmap_block, unmap_len, |
| 1592 | xfs_bmapi_aflag(fork) | | 1586 | xfs_bmapi_aflag(fork), |
| 1593 | (sync ? 0 : XFS_BMAPI_ASYNC), | ||
| 1594 | XFS_ITRUNC_MAX_EXTENTS, | 1587 | XFS_ITRUNC_MAX_EXTENTS, |
| 1595 | &first_block, &free_list, | 1588 | &first_block, &free_list, |
| 1596 | NULL, &done); | 1589 | &done); |
| 1597 | if (error) { | 1590 | if (error) { |
| 1598 | /* | 1591 | /* |
| 1599 | * If the bunmapi call encounters an error, | 1592 | * If the bunmapi call encounters an error, |
| @@ -1612,12 +1605,8 @@ xfs_itruncate_finish( | |||
| 1612 | */ | 1605 | */ |
| 1613 | error = xfs_bmap_finish(tp, &free_list, &committed); | 1606 | error = xfs_bmap_finish(tp, &free_list, &committed); |
| 1614 | ntp = *tp; | 1607 | ntp = *tp; |
| 1615 | if (committed) { | 1608 | if (committed) |
| 1616 | /* link the inode into the next xact in the chain */ | 1609 | xfs_trans_ijoin(ntp, ip); |
| 1617 | xfs_trans_ijoin(ntp, ip, | ||
| 1618 | XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); | ||
| 1619 | xfs_trans_ihold(ntp, ip); | ||
| 1620 | } | ||
| 1621 | 1610 | ||
| 1622 | if (error) { | 1611 | if (error) { |
| 1623 | /* | 1612 | /* |
| @@ -1646,9 +1635,7 @@ xfs_itruncate_finish( | |||
| 1646 | error = xfs_trans_commit(*tp, 0); | 1635 | error = xfs_trans_commit(*tp, 0); |
| 1647 | *tp = ntp; | 1636 | *tp = ntp; |
| 1648 | 1637 | ||
| 1649 | /* link the inode into the next transaction in the chain */ | 1638 | xfs_trans_ijoin(ntp, ip); |
| 1650 | xfs_trans_ijoin(ntp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); | ||
| 1651 | xfs_trans_ihold(ntp, ip); | ||
| 1652 | 1639 | ||
| 1653 | if (error) | 1640 | if (error) |
| 1654 | return error; | 1641 | return error; |
| @@ -1985,7 +1972,7 @@ xfs_ifree_cluster( | |||
| 1985 | if (lip->li_type == XFS_LI_INODE) { | 1972 | if (lip->li_type == XFS_LI_INODE) { |
| 1986 | iip = (xfs_inode_log_item_t *)lip; | 1973 | iip = (xfs_inode_log_item_t *)lip; |
| 1987 | ASSERT(iip->ili_logged == 1); | 1974 | ASSERT(iip->ili_logged == 1); |
| 1988 | lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done; | 1975 | lip->li_cb = xfs_istale_done; |
| 1989 | xfs_trans_ail_copy_lsn(mp->m_ail, | 1976 | xfs_trans_ail_copy_lsn(mp->m_ail, |
| 1990 | &iip->ili_flush_lsn, | 1977 | &iip->ili_flush_lsn, |
| 1991 | &iip->ili_item.li_lsn); | 1978 | &iip->ili_item.li_lsn); |
| @@ -2055,9 +2042,8 @@ xfs_ifree_cluster( | |||
| 2055 | xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, | 2042 | xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, |
| 2056 | &iip->ili_item.li_lsn); | 2043 | &iip->ili_item.li_lsn); |
| 2057 | 2044 | ||
| 2058 | xfs_buf_attach_iodone(bp, | 2045 | xfs_buf_attach_iodone(bp, xfs_istale_done, |
| 2059 | (void(*)(xfs_buf_t*,xfs_log_item_t*)) | 2046 | &iip->ili_item); |
| 2060 | xfs_istale_done, (xfs_log_item_t *)iip); | ||
| 2061 | 2047 | ||
| 2062 | if (ip != free_ip) | 2048 | if (ip != free_ip) |
| 2063 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 2049 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
| @@ -2203,7 +2189,7 @@ xfs_iroot_realloc( | |||
| 2203 | */ | 2189 | */ |
| 2204 | if (ifp->if_broot_bytes == 0) { | 2190 | if (ifp->if_broot_bytes == 0) { |
| 2205 | new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); | 2191 | new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); |
| 2206 | ifp->if_broot = kmem_alloc(new_size, KM_SLEEP); | 2192 | ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); |
| 2207 | ifp->if_broot_bytes = (int)new_size; | 2193 | ifp->if_broot_bytes = (int)new_size; |
| 2208 | return; | 2194 | return; |
| 2209 | } | 2195 | } |
| @@ -2219,7 +2205,7 @@ xfs_iroot_realloc( | |||
| 2219 | new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); | 2205 | new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); |
| 2220 | ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, | 2206 | ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, |
| 2221 | (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ | 2207 | (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ |
| 2222 | KM_SLEEP); | 2208 | KM_SLEEP | KM_NOFS); |
| 2223 | op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, | 2209 | op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, |
| 2224 | ifp->if_broot_bytes); | 2210 | ifp->if_broot_bytes); |
| 2225 | np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, | 2211 | np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, |
| @@ -2245,7 +2231,7 @@ xfs_iroot_realloc( | |||
| 2245 | else | 2231 | else |
| 2246 | new_size = 0; | 2232 | new_size = 0; |
| 2247 | if (new_size > 0) { | 2233 | if (new_size > 0) { |
| 2248 | new_broot = kmem_alloc(new_size, KM_SLEEP); | 2234 | new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); |
| 2249 | /* | 2235 | /* |
| 2250 | * First copy over the btree block header. | 2236 | * First copy over the btree block header. |
| 2251 | */ | 2237 | */ |
| @@ -2349,7 +2335,8 @@ xfs_idata_realloc( | |||
| 2349 | real_size = roundup(new_size, 4); | 2335 | real_size = roundup(new_size, 4); |
| 2350 | if (ifp->if_u1.if_data == NULL) { | 2336 | if (ifp->if_u1.if_data == NULL) { |
| 2351 | ASSERT(ifp->if_real_bytes == 0); | 2337 | ASSERT(ifp->if_real_bytes == 0); |
| 2352 | ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); | 2338 | ifp->if_u1.if_data = kmem_alloc(real_size, |
| 2339 | KM_SLEEP | KM_NOFS); | ||
| 2353 | } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { | 2340 | } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { |
| 2354 | /* | 2341 | /* |
| 2355 | * Only do the realloc if the underlying size | 2342 | * Only do the realloc if the underlying size |
| @@ -2360,11 +2347,12 @@ xfs_idata_realloc( | |||
| 2360 | kmem_realloc(ifp->if_u1.if_data, | 2347 | kmem_realloc(ifp->if_u1.if_data, |
| 2361 | real_size, | 2348 | real_size, |
| 2362 | ifp->if_real_bytes, | 2349 | ifp->if_real_bytes, |
| 2363 | KM_SLEEP); | 2350 | KM_SLEEP | KM_NOFS); |
| 2364 | } | 2351 | } |
| 2365 | } else { | 2352 | } else { |
| 2366 | ASSERT(ifp->if_real_bytes == 0); | 2353 | ASSERT(ifp->if_real_bytes == 0); |
| 2367 | ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); | 2354 | ifp->if_u1.if_data = kmem_alloc(real_size, |
| 2355 | KM_SLEEP | KM_NOFS); | ||
| 2368 | memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data, | 2356 | memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data, |
| 2369 | ifp->if_bytes); | 2357 | ifp->if_bytes); |
| 2370 | } | 2358 | } |
| @@ -2731,7 +2719,6 @@ cluster_corrupt_out: | |||
| 2731 | * mark it as stale and brelse. | 2719 | * mark it as stale and brelse. |
| 2732 | */ | 2720 | */ |
| 2733 | if (XFS_BUF_IODONE_FUNC(bp)) { | 2721 | if (XFS_BUF_IODONE_FUNC(bp)) { |
| 2734 | XFS_BUF_CLR_BDSTRAT_FUNC(bp); | ||
| 2735 | XFS_BUF_UNDONE(bp); | 2722 | XFS_BUF_UNDONE(bp); |
| 2736 | XFS_BUF_STALE(bp); | 2723 | XFS_BUF_STALE(bp); |
| 2737 | XFS_BUF_ERROR(bp,EIO); | 2724 | XFS_BUF_ERROR(bp,EIO); |
| @@ -3069,8 +3056,7 @@ xfs_iflush_int( | |||
| 3069 | * and unlock the inode's flush lock when the inode is | 3056 | * and unlock the inode's flush lock when the inode is |
| 3070 | * completely written to disk. | 3057 | * completely written to disk. |
| 3071 | */ | 3058 | */ |
| 3072 | xfs_buf_attach_iodone(bp, (void(*)(xfs_buf_t*,xfs_log_item_t*)) | 3059 | xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item); |
| 3073 | xfs_iflush_done, (xfs_log_item_t *)iip); | ||
| 3074 | 3060 | ||
| 3075 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); | 3061 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); |
| 3076 | ASSERT(XFS_BUF_IODONE_FUNC(bp) != NULL); | 3062 | ASSERT(XFS_BUF_IODONE_FUNC(bp) != NULL); |
| @@ -3514,13 +3500,11 @@ xfs_iext_remove_indirect( | |||
| 3514 | xfs_extnum_t ext_diff; /* extents to remove in current list */ | 3500 | xfs_extnum_t ext_diff; /* extents to remove in current list */ |
| 3515 | xfs_extnum_t nex1; /* number of extents before idx */ | 3501 | xfs_extnum_t nex1; /* number of extents before idx */ |
| 3516 | xfs_extnum_t nex2; /* extents after idx + count */ | 3502 | xfs_extnum_t nex2; /* extents after idx + count */ |
| 3517 | int nlists; /* entries in indirection array */ | ||
| 3518 | int page_idx = idx; /* index in target extent list */ | 3503 | int page_idx = idx; /* index in target extent list */ |
| 3519 | 3504 | ||
| 3520 | ASSERT(ifp->if_flags & XFS_IFEXTIREC); | 3505 | ASSERT(ifp->if_flags & XFS_IFEXTIREC); |
| 3521 | erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0); | 3506 | erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0); |
| 3522 | ASSERT(erp != NULL); | 3507 | ASSERT(erp != NULL); |
| 3523 | nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; | ||
| 3524 | nex1 = page_idx; | 3508 | nex1 = page_idx; |
| 3525 | ext_cnt = count; | 3509 | ext_cnt = count; |
| 3526 | while (ext_cnt) { | 3510 | while (ext_cnt) { |
