diff options
Diffstat (limited to 'fs/xfs/xfs_vnodeops.c')
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 4c7c7bfb2b2f..8e4a63c4151a 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -114,7 +114,7 @@ xfs_setattr( | |||
114 | */ | 114 | */ |
115 | ASSERT(udqp == NULL); | 115 | ASSERT(udqp == NULL); |
116 | ASSERT(gdqp == NULL); | 116 | ASSERT(gdqp == NULL); |
117 | code = xfs_qm_vop_dqalloc(ip, uid, gid, ip->i_d.di_projid, | 117 | code = xfs_qm_vop_dqalloc(ip, uid, gid, xfs_get_projid(ip), |
118 | qflags, &udqp, &gdqp); | 118 | qflags, &udqp, &gdqp); |
119 | if (code) | 119 | if (code) |
120 | return code; | 120 | return code; |
@@ -184,8 +184,11 @@ xfs_setattr( | |||
184 | ip->i_size == 0 && ip->i_d.di_nextents == 0) { | 184 | ip->i_size == 0 && ip->i_d.di_nextents == 0) { |
185 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 185 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
186 | lock_flags &= ~XFS_ILOCK_EXCL; | 186 | lock_flags &= ~XFS_ILOCK_EXCL; |
187 | if (mask & ATTR_CTIME) | 187 | if (mask & ATTR_CTIME) { |
188 | xfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 188 | inode->i_mtime = inode->i_ctime = |
189 | current_fs_time(inode->i_sb); | ||
190 | xfs_mark_inode_dirty_sync(ip); | ||
191 | } | ||
189 | code = 0; | 192 | code = 0; |
190 | goto error_return; | 193 | goto error_return; |
191 | } | 194 | } |
@@ -1253,8 +1256,7 @@ xfs_create( | |||
1253 | struct xfs_name *name, | 1256 | struct xfs_name *name, |
1254 | mode_t mode, | 1257 | mode_t mode, |
1255 | xfs_dev_t rdev, | 1258 | xfs_dev_t rdev, |
1256 | xfs_inode_t **ipp, | 1259 | xfs_inode_t **ipp) |
1257 | cred_t *credp) | ||
1258 | { | 1260 | { |
1259 | int is_dir = S_ISDIR(mode); | 1261 | int is_dir = S_ISDIR(mode); |
1260 | struct xfs_mount *mp = dp->i_mount; | 1262 | struct xfs_mount *mp = dp->i_mount; |
@@ -1266,7 +1268,7 @@ xfs_create( | |||
1266 | boolean_t unlock_dp_on_error = B_FALSE; | 1268 | boolean_t unlock_dp_on_error = B_FALSE; |
1267 | uint cancel_flags; | 1269 | uint cancel_flags; |
1268 | int committed; | 1270 | int committed; |
1269 | xfs_prid_t prid; | 1271 | prid_t prid; |
1270 | struct xfs_dquot *udqp = NULL; | 1272 | struct xfs_dquot *udqp = NULL; |
1271 | struct xfs_dquot *gdqp = NULL; | 1273 | struct xfs_dquot *gdqp = NULL; |
1272 | uint resblks; | 1274 | uint resblks; |
@@ -1279,9 +1281,9 @@ xfs_create( | |||
1279 | return XFS_ERROR(EIO); | 1281 | return XFS_ERROR(EIO); |
1280 | 1282 | ||
1281 | if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) | 1283 | if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) |
1282 | prid = dp->i_d.di_projid; | 1284 | prid = xfs_get_projid(dp); |
1283 | else | 1285 | else |
1284 | prid = dfltprid; | 1286 | prid = XFS_PROJID_DEFAULT; |
1285 | 1287 | ||
1286 | /* | 1288 | /* |
1287 | * Make sure that we have allocated dquot(s) on disk. | 1289 | * Make sure that we have allocated dquot(s) on disk. |
@@ -1360,7 +1362,7 @@ xfs_create( | |||
1360 | * entry pointing to them, but a directory also the "." entry | 1362 | * entry pointing to them, but a directory also the "." entry |
1361 | * pointing to itself. | 1363 | * pointing to itself. |
1362 | */ | 1364 | */ |
1363 | error = xfs_dir_ialloc(&tp, dp, mode, is_dir ? 2 : 1, rdev, credp, | 1365 | error = xfs_dir_ialloc(&tp, dp, mode, is_dir ? 2 : 1, rdev, |
1364 | prid, resblks > 0, &ip, &committed); | 1366 | prid, resblks > 0, &ip, &committed); |
1365 | if (error) { | 1367 | if (error) { |
1366 | if (error == ENOSPC) | 1368 | if (error == ENOSPC) |
@@ -1391,7 +1393,7 @@ xfs_create( | |||
1391 | ASSERT(error != ENOSPC); | 1393 | ASSERT(error != ENOSPC); |
1392 | goto out_trans_abort; | 1394 | goto out_trans_abort; |
1393 | } | 1395 | } |
1394 | xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 1396 | xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); |
1395 | xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); | 1397 | xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); |
1396 | 1398 | ||
1397 | if (is_dir) { | 1399 | if (is_dir) { |
@@ -1742,7 +1744,7 @@ xfs_remove( | |||
1742 | ASSERT(error != ENOENT); | 1744 | ASSERT(error != ENOENT); |
1743 | goto out_bmap_cancel; | 1745 | goto out_bmap_cancel; |
1744 | } | 1746 | } |
1745 | xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 1747 | xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); |
1746 | 1748 | ||
1747 | if (is_dir) { | 1749 | if (is_dir) { |
1748 | /* | 1750 | /* |
@@ -1880,7 +1882,7 @@ xfs_link( | |||
1880 | * the tree quota mechanism could be circumvented. | 1882 | * the tree quota mechanism could be circumvented. |
1881 | */ | 1883 | */ |
1882 | if (unlikely((tdp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && | 1884 | if (unlikely((tdp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && |
1883 | (tdp->i_d.di_projid != sip->i_d.di_projid))) { | 1885 | (xfs_get_projid(tdp) != xfs_get_projid(sip)))) { |
1884 | error = XFS_ERROR(EXDEV); | 1886 | error = XFS_ERROR(EXDEV); |
1885 | goto error_return; | 1887 | goto error_return; |
1886 | } | 1888 | } |
@@ -1895,7 +1897,7 @@ xfs_link( | |||
1895 | &first_block, &free_list, resblks); | 1897 | &first_block, &free_list, resblks); |
1896 | if (error) | 1898 | if (error) |
1897 | goto abort_return; | 1899 | goto abort_return; |
1898 | xfs_ichgtime(tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 1900 | xfs_trans_ichgtime(tp, tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); |
1899 | xfs_trans_log_inode(tp, tdp, XFS_ILOG_CORE); | 1901 | xfs_trans_log_inode(tp, tdp, XFS_ILOG_CORE); |
1900 | 1902 | ||
1901 | error = xfs_bumplink(tp, sip); | 1903 | error = xfs_bumplink(tp, sip); |
@@ -1933,8 +1935,7 @@ xfs_symlink( | |||
1933 | struct xfs_name *link_name, | 1935 | struct xfs_name *link_name, |
1934 | const char *target_path, | 1936 | const char *target_path, |
1935 | mode_t mode, | 1937 | mode_t mode, |
1936 | xfs_inode_t **ipp, | 1938 | xfs_inode_t **ipp) |
1937 | cred_t *credp) | ||
1938 | { | 1939 | { |
1939 | xfs_mount_t *mp = dp->i_mount; | 1940 | xfs_mount_t *mp = dp->i_mount; |
1940 | xfs_trans_t *tp; | 1941 | xfs_trans_t *tp; |
@@ -1955,7 +1956,7 @@ xfs_symlink( | |||
1955 | int byte_cnt; | 1956 | int byte_cnt; |
1956 | int n; | 1957 | int n; |
1957 | xfs_buf_t *bp; | 1958 | xfs_buf_t *bp; |
1958 | xfs_prid_t prid; | 1959 | prid_t prid; |
1959 | struct xfs_dquot *udqp, *gdqp; | 1960 | struct xfs_dquot *udqp, *gdqp; |
1960 | uint resblks; | 1961 | uint resblks; |
1961 | 1962 | ||
@@ -1978,9 +1979,9 @@ xfs_symlink( | |||
1978 | 1979 | ||
1979 | udqp = gdqp = NULL; | 1980 | udqp = gdqp = NULL; |
1980 | if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) | 1981 | if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) |
1981 | prid = dp->i_d.di_projid; | 1982 | prid = xfs_get_projid(dp); |
1982 | else | 1983 | else |
1983 | prid = (xfs_prid_t)dfltprid; | 1984 | prid = XFS_PROJID_DEFAULT; |
1984 | 1985 | ||
1985 | /* | 1986 | /* |
1986 | * Make sure that we have allocated dquot(s) on disk. | 1987 | * Make sure that we have allocated dquot(s) on disk. |
@@ -2046,8 +2047,8 @@ xfs_symlink( | |||
2046 | /* | 2047 | /* |
2047 | * Allocate an inode for the symlink. | 2048 | * Allocate an inode for the symlink. |
2048 | */ | 2049 | */ |
2049 | error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), | 2050 | error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, |
2050 | 1, 0, credp, prid, resblks > 0, &ip, NULL); | 2051 | prid, resblks > 0, &ip, NULL); |
2051 | if (error) { | 2052 | if (error) { |
2052 | if (error == ENOSPC) | 2053 | if (error == ENOSPC) |
2053 | goto error_return; | 2054 | goto error_return; |
@@ -2129,7 +2130,7 @@ xfs_symlink( | |||
2129 | &first_block, &free_list, resblks); | 2130 | &first_block, &free_list, resblks); |
2130 | if (error) | 2131 | if (error) |
2131 | goto error1; | 2132 | goto error1; |
2132 | xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 2133 | xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); |
2133 | xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); | 2134 | xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); |
2134 | 2135 | ||
2135 | /* | 2136 | /* |
@@ -2272,7 +2273,7 @@ xfs_alloc_file_space( | |||
2272 | count = len; | 2273 | count = len; |
2273 | imapp = &imaps[0]; | 2274 | imapp = &imaps[0]; |
2274 | nimaps = 1; | 2275 | nimaps = 1; |
2275 | bmapi_flag = XFS_BMAPI_WRITE | (alloc_type ? XFS_BMAPI_PREALLOC : 0); | 2276 | bmapi_flag = XFS_BMAPI_WRITE | alloc_type; |
2276 | startoffset_fsb = XFS_B_TO_FSBT(mp, offset); | 2277 | startoffset_fsb = XFS_B_TO_FSBT(mp, offset); |
2277 | allocatesize_fsb = XFS_B_TO_FSB(mp, count); | 2278 | allocatesize_fsb = XFS_B_TO_FSB(mp, count); |
2278 | 2279 | ||
@@ -2431,9 +2432,9 @@ xfs_zero_remaining_bytes( | |||
2431 | if (endoff > ip->i_size) | 2432 | if (endoff > ip->i_size) |
2432 | endoff = ip->i_size; | 2433 | endoff = ip->i_size; |
2433 | 2434 | ||
2434 | bp = xfs_buf_get_noaddr(mp->m_sb.sb_blocksize, | 2435 | bp = xfs_buf_get_uncached(XFS_IS_REALTIME_INODE(ip) ? |
2435 | XFS_IS_REALTIME_INODE(ip) ? | 2436 | mp->m_rtdev_targp : mp->m_ddev_targp, |
2436 | mp->m_rtdev_targp : mp->m_ddev_targp); | 2437 | mp->m_sb.sb_blocksize, XBF_DONT_BLOCK); |
2437 | if (!bp) | 2438 | if (!bp) |
2438 | return XFS_ERROR(ENOMEM); | 2439 | return XFS_ERROR(ENOMEM); |
2439 | 2440 | ||
@@ -2459,7 +2460,7 @@ xfs_zero_remaining_bytes( | |||
2459 | XFS_BUF_READ(bp); | 2460 | XFS_BUF_READ(bp); |
2460 | XFS_BUF_SET_ADDR(bp, xfs_fsb_to_db(ip, imap.br_startblock)); | 2461 | XFS_BUF_SET_ADDR(bp, xfs_fsb_to_db(ip, imap.br_startblock)); |
2461 | xfsbdstrat(mp, bp); | 2462 | xfsbdstrat(mp, bp); |
2462 | error = xfs_iowait(bp); | 2463 | error = xfs_buf_iowait(bp); |
2463 | if (error) { | 2464 | if (error) { |
2464 | xfs_ioerror_alert("xfs_zero_remaining_bytes(read)", | 2465 | xfs_ioerror_alert("xfs_zero_remaining_bytes(read)", |
2465 | mp, bp, XFS_BUF_ADDR(bp)); | 2466 | mp, bp, XFS_BUF_ADDR(bp)); |
@@ -2472,7 +2473,7 @@ xfs_zero_remaining_bytes( | |||
2472 | XFS_BUF_UNREAD(bp); | 2473 | XFS_BUF_UNREAD(bp); |
2473 | XFS_BUF_WRITE(bp); | 2474 | XFS_BUF_WRITE(bp); |
2474 | xfsbdstrat(mp, bp); | 2475 | xfsbdstrat(mp, bp); |
2475 | error = xfs_iowait(bp); | 2476 | error = xfs_buf_iowait(bp); |
2476 | if (error) { | 2477 | if (error) { |
2477 | xfs_ioerror_alert("xfs_zero_remaining_bytes(write)", | 2478 | xfs_ioerror_alert("xfs_zero_remaining_bytes(write)", |
2478 | mp, bp, XFS_BUF_ADDR(bp)); | 2479 | mp, bp, XFS_BUF_ADDR(bp)); |
@@ -2711,6 +2712,7 @@ xfs_change_file_space( | |||
2711 | xfs_off_t llen; | 2712 | xfs_off_t llen; |
2712 | xfs_trans_t *tp; | 2713 | xfs_trans_t *tp; |
2713 | struct iattr iattr; | 2714 | struct iattr iattr; |
2715 | int prealloc_type; | ||
2714 | 2716 | ||
2715 | if (!S_ISREG(ip->i_d.di_mode)) | 2717 | if (!S_ISREG(ip->i_d.di_mode)) |
2716 | return XFS_ERROR(EINVAL); | 2718 | return XFS_ERROR(EINVAL); |
@@ -2753,12 +2755,17 @@ xfs_change_file_space( | |||
2753 | * size to be changed. | 2755 | * size to be changed. |
2754 | */ | 2756 | */ |
2755 | setprealloc = clrprealloc = 0; | 2757 | setprealloc = clrprealloc = 0; |
2758 | prealloc_type = XFS_BMAPI_PREALLOC; | ||
2756 | 2759 | ||
2757 | switch (cmd) { | 2760 | switch (cmd) { |
2761 | case XFS_IOC_ZERO_RANGE: | ||
2762 | prealloc_type |= XFS_BMAPI_CONVERT; | ||
2763 | xfs_tosspages(ip, startoffset, startoffset + bf->l_len, 0); | ||
2764 | /* FALLTHRU */ | ||
2758 | case XFS_IOC_RESVSP: | 2765 | case XFS_IOC_RESVSP: |
2759 | case XFS_IOC_RESVSP64: | 2766 | case XFS_IOC_RESVSP64: |
2760 | error = xfs_alloc_file_space(ip, startoffset, bf->l_len, | 2767 | error = xfs_alloc_file_space(ip, startoffset, bf->l_len, |
2761 | 1, attr_flags); | 2768 | prealloc_type, attr_flags); |
2762 | if (error) | 2769 | if (error) |
2763 | return error; | 2770 | return error; |
2764 | setprealloc = 1; | 2771 | setprealloc = 1; |
@@ -2827,7 +2834,7 @@ xfs_change_file_space( | |||
2827 | if (ip->i_d.di_mode & S_IXGRP) | 2834 | if (ip->i_d.di_mode & S_IXGRP) |
2828 | ip->i_d.di_mode &= ~S_ISGID; | 2835 | ip->i_d.di_mode &= ~S_ISGID; |
2829 | 2836 | ||
2830 | xfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 2837 | xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); |
2831 | } | 2838 | } |
2832 | if (setprealloc) | 2839 | if (setprealloc) |
2833 | ip->i_d.di_flags |= XFS_DIFLAG_PREALLOC; | 2840 | ip->i_d.di_flags |= XFS_DIFLAG_PREALLOC; |