aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_vnodeops.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_vnodeops.c')
-rw-r--r--fs/xfs/xfs_vnodeops.c331
1 files changed, 75 insertions, 256 deletions
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
index c1646838898f..66d585c6917c 100644
--- a/fs/xfs/xfs_vnodeops.c
+++ b/fs/xfs/xfs_vnodeops.c
@@ -26,19 +26,14 @@
26#include "xfs_sb.h" 26#include "xfs_sb.h"
27#include "xfs_ag.h" 27#include "xfs_ag.h"
28#include "xfs_dir2.h" 28#include "xfs_dir2.h"
29#include "xfs_dmapi.h"
30#include "xfs_mount.h" 29#include "xfs_mount.h"
31#include "xfs_da_btree.h" 30#include "xfs_da_btree.h"
32#include "xfs_bmap_btree.h" 31#include "xfs_bmap_btree.h"
33#include "xfs_alloc_btree.h"
34#include "xfs_ialloc_btree.h" 32#include "xfs_ialloc_btree.h"
35#include "xfs_dir2_sf.h"
36#include "xfs_attr_sf.h"
37#include "xfs_dinode.h" 33#include "xfs_dinode.h"
38#include "xfs_inode.h" 34#include "xfs_inode.h"
39#include "xfs_inode_item.h" 35#include "xfs_inode_item.h"
40#include "xfs_itable.h" 36#include "xfs_itable.h"
41#include "xfs_btree.h"
42#include "xfs_ialloc.h" 37#include "xfs_ialloc.h"
43#include "xfs_alloc.h" 38#include "xfs_alloc.h"
44#include "xfs_bmap.h" 39#include "xfs_bmap.h"
@@ -73,7 +68,7 @@ xfs_setattr(
73 struct xfs_dquot *udqp, *gdqp, *olddquot1, *olddquot2; 68 struct xfs_dquot *udqp, *gdqp, *olddquot1, *olddquot2;
74 int need_iolock = 1; 69 int need_iolock = 1;
75 70
76 xfs_itrace_entry(ip); 71 trace_xfs_setattr(ip);
77 72
78 if (mp->m_flags & XFS_MOUNT_RDONLY) 73 if (mp->m_flags & XFS_MOUNT_RDONLY)
79 return XFS_ERROR(EROFS); 74 return XFS_ERROR(EROFS);
@@ -143,16 +138,6 @@ xfs_setattr(
143 goto error_return; 138 goto error_return;
144 } 139 }
145 } else { 140 } else {
146 if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) &&
147 !(flags & XFS_ATTR_DMI)) {
148 int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR;
149 code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, ip,
150 iattr->ia_size, 0, dmflags, NULL);
151 if (code) {
152 lock_flags = 0;
153 goto error_return;
154 }
155 }
156 if (need_iolock) 141 if (need_iolock)
157 lock_flags |= XFS_IOLOCK_EXCL; 142 lock_flags |= XFS_IOLOCK_EXCL;
158 } 143 }
@@ -236,8 +221,11 @@ xfs_setattr(
236 * transaction to modify the i_size. 221 * transaction to modify the i_size.
237 */ 222 */
238 code = xfs_zero_eof(ip, iattr->ia_size, ip->i_size); 223 code = xfs_zero_eof(ip, iattr->ia_size, ip->i_size);
224 if (code)
225 goto error_return;
239 } 226 }
240 xfs_iunlock(ip, XFS_ILOCK_EXCL); 227 xfs_iunlock(ip, XFS_ILOCK_EXCL);
228 lock_flags &= ~XFS_ILOCK_EXCL;
241 229
242 /* 230 /*
243 * We are going to log the inode size change in this 231 * We are going to log the inode size change in this
@@ -251,40 +239,38 @@ xfs_setattr(
251 * really care about here and prevents waiting for other data 239 * really care about here and prevents waiting for other data
252 * not within the range we care about here. 240 * not within the range we care about here.
253 */ 241 */
254 if (!code && 242 if (ip->i_size != ip->i_d.di_size &&
255 ip->i_size != ip->i_d.di_size &&
256 iattr->ia_size > ip->i_d.di_size) { 243 iattr->ia_size > ip->i_d.di_size) {
257 code = xfs_flush_pages(ip, 244 code = xfs_flush_pages(ip,
258 ip->i_d.di_size, iattr->ia_size, 245 ip->i_d.di_size, iattr->ia_size,
259 XBF_ASYNC, FI_NONE); 246 XBF_ASYNC, FI_NONE);
247 if (code)
248 goto error_return;
260 } 249 }
261 250
262 /* wait for all I/O to complete */ 251 /* wait for all I/O to complete */
263 xfs_ioend_wait(ip); 252 xfs_ioend_wait(ip);
264 253
265 if (!code) 254 code = -block_truncate_page(inode->i_mapping, iattr->ia_size,
266 code = xfs_itruncate_data(ip, iattr->ia_size); 255 xfs_get_blocks);
267 if (code) { 256 if (code)
268 ASSERT(tp == NULL);
269 lock_flags &= ~XFS_ILOCK_EXCL;
270 ASSERT(lock_flags == XFS_IOLOCK_EXCL || !need_iolock);
271 goto error_return; 257 goto error_return;
272 } 258
273 tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); 259 tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE);
274 if ((code = xfs_trans_reserve(tp, 0, 260 code = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
275 XFS_ITRUNCATE_LOG_RES(mp), 0, 261 XFS_TRANS_PERM_LOG_RES,
276 XFS_TRANS_PERM_LOG_RES, 262 XFS_ITRUNCATE_LOG_COUNT);
277 XFS_ITRUNCATE_LOG_COUNT))) { 263 if (code)
278 xfs_trans_cancel(tp, 0); 264 goto error_return;
279 if (need_iolock) 265
280 xfs_iunlock(ip, XFS_IOLOCK_EXCL); 266 truncate_setsize(inode, iattr->ia_size);
281 return code; 267
282 }
283 commit_flags = XFS_TRANS_RELEASE_LOG_RES; 268 commit_flags = XFS_TRANS_RELEASE_LOG_RES;
269 lock_flags |= XFS_ILOCK_EXCL;
270
284 xfs_ilock(ip, XFS_ILOCK_EXCL); 271 xfs_ilock(ip, XFS_ILOCK_EXCL);
285 272
286 xfs_trans_ijoin(tp, ip, lock_flags); 273 xfs_trans_ijoin(tp, ip);
287 xfs_trans_ihold(tp, ip);
288 274
289 /* 275 /*
290 * Only change the c/mtime if we are changing the size 276 * Only change the c/mtime if we are changing the size
@@ -334,8 +320,7 @@ xfs_setattr(
334 xfs_iflags_set(ip, XFS_ITRUNCATED); 320 xfs_iflags_set(ip, XFS_ITRUNCATED);
335 } 321 }
336 } else if (tp) { 322 } else if (tp) {
337 xfs_trans_ijoin(tp, ip, lock_flags); 323 xfs_trans_ijoin(tp, ip);
338 xfs_trans_ihold(tp, ip);
339 } 324 }
340 325
341 /* 326 /*
@@ -470,17 +455,10 @@ xfs_setattr(
470 return XFS_ERROR(code); 455 return XFS_ERROR(code);
471 } 456 }
472 457
473 if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE) &&
474 !(flags & XFS_ATTR_DMI)) {
475 (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL,
476 NULL, DM_RIGHT_NULL, NULL, NULL,
477 0, 0, AT_DELAY_FLAG(flags));
478 }
479 return 0; 458 return 0;
480 459
481 abort_return: 460 abort_return:
482 commit_flags |= XFS_TRANS_ABORT; 461 commit_flags |= XFS_TRANS_ABORT;
483 /* FALLTHROUGH */
484 error_return: 462 error_return:
485 xfs_qm_dqrele(udqp); 463 xfs_qm_dqrele(udqp);
486 xfs_qm_dqrele(gdqp); 464 xfs_qm_dqrele(gdqp);
@@ -516,7 +494,7 @@ xfs_readlink_bmap(
516 int error = 0; 494 int error = 0;
517 495
518 error = xfs_bmapi(NULL, ip, 0, XFS_B_TO_FSB(mp, pathlen), 0, NULL, 0, 496 error = xfs_bmapi(NULL, ip, 0, XFS_B_TO_FSB(mp, pathlen), 0, NULL, 0,
519 mval, &nmaps, NULL, NULL); 497 mval, &nmaps, NULL);
520 if (error) 498 if (error)
521 goto out; 499 goto out;
522 500
@@ -557,7 +535,7 @@ xfs_readlink(
557 int pathlen; 535 int pathlen;
558 int error = 0; 536 int error = 0;
559 537
560 xfs_itrace_entry(ip); 538 trace_xfs_readlink(ip);
561 539
562 if (XFS_FORCED_SHUTDOWN(mp)) 540 if (XFS_FORCED_SHUTDOWN(mp))
563 return XFS_ERROR(EIO); 541 return XFS_ERROR(EIO);
@@ -613,14 +591,14 @@ xfs_free_eofblocks(
613 */ 591 */
614 end_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)ip->i_size)); 592 end_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)ip->i_size));
615 last_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp)); 593 last_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp));
616 map_len = last_fsb - end_fsb; 594 if (last_fsb <= end_fsb)
617 if (map_len <= 0)
618 return 0; 595 return 0;
596 map_len = last_fsb - end_fsb;
619 597
620 nimaps = 1; 598 nimaps = 1;
621 xfs_ilock(ip, XFS_ILOCK_SHARED); 599 xfs_ilock(ip, XFS_ILOCK_SHARED);
622 error = xfs_bmapi(NULL, ip, end_fsb, map_len, 0, 600 error = xfs_bmapi(NULL, ip, end_fsb, map_len, 0,
623 NULL, 0, &imap, &nimaps, NULL, NULL); 601 NULL, 0, &imap, &nimaps, NULL);
624 xfs_iunlock(ip, XFS_ILOCK_SHARED); 602 xfs_iunlock(ip, XFS_ILOCK_SHARED);
625 603
626 if (!error && (nimaps != 0) && 604 if (!error && (nimaps != 0) &&
@@ -675,10 +653,7 @@ xfs_free_eofblocks(
675 } 653 }
676 654
677 xfs_ilock(ip, XFS_ILOCK_EXCL); 655 xfs_ilock(ip, XFS_ILOCK_EXCL);
678 xfs_trans_ijoin(tp, ip, 656 xfs_trans_ijoin(tp, ip);
679 XFS_IOLOCK_EXCL |
680 XFS_ILOCK_EXCL);
681 xfs_trans_ihold(tp, ip);
682 657
683 error = xfs_itruncate_finish(&tp, ip, 658 error = xfs_itruncate_finish(&tp, ip,
684 ip->i_size, 659 ip->i_size,
@@ -750,8 +725,7 @@ xfs_inactive_symlink_rmt(
750 xfs_ilock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); 725 xfs_ilock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
751 size = (int)ip->i_d.di_size; 726 size = (int)ip->i_d.di_size;
752 ip->i_d.di_size = 0; 727 ip->i_d.di_size = 0;
753 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); 728 xfs_trans_ijoin(tp, ip);
754 xfs_trans_ihold(tp, ip);
755 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 729 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
756 /* 730 /*
757 * Find the block(s) so we can inval and unmap them. 731 * Find the block(s) so we can inval and unmap them.
@@ -761,7 +735,7 @@ xfs_inactive_symlink_rmt(
761 nmaps = ARRAY_SIZE(mval); 735 nmaps = ARRAY_SIZE(mval);
762 if ((error = xfs_bmapi(tp, ip, 0, XFS_B_TO_FSB(mp, size), 736 if ((error = xfs_bmapi(tp, ip, 0, XFS_B_TO_FSB(mp, size),
763 XFS_BMAPI_METADATA, &first_block, 0, mval, &nmaps, 737 XFS_BMAPI_METADATA, &first_block, 0, mval, &nmaps,
764 &free_list, NULL))) 738 &free_list)))
765 goto error0; 739 goto error0;
766 /* 740 /*
767 * Invalidate the block(s). 741 * Invalidate the block(s).
@@ -776,7 +750,7 @@ xfs_inactive_symlink_rmt(
776 * Unmap the dead block(s) to the free_list. 750 * Unmap the dead block(s) to the free_list.
777 */ 751 */
778 if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, 752 if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps,
779 &first_block, &free_list, NULL, &done))) 753 &first_block, &free_list, &done)))
780 goto error1; 754 goto error1;
781 ASSERT(done); 755 ASSERT(done);
782 /* 756 /*
@@ -795,8 +769,7 @@ xfs_inactive_symlink_rmt(
795 * Mark it dirty so it will be logged and moved forward in the log as 769 * Mark it dirty so it will be logged and moved forward in the log as
796 * part of every commit. 770 * part of every commit.
797 */ 771 */
798 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); 772 xfs_trans_ijoin(tp, ip);
799 xfs_trans_ihold(tp, ip);
800 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 773 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
801 /* 774 /*
802 * Get a new, empty transaction to return to our caller. 775 * Get a new, empty transaction to return to our caller.
@@ -929,8 +902,7 @@ xfs_inactive_attrs(
929 goto error_cancel; 902 goto error_cancel;
930 903
931 xfs_ilock(ip, XFS_ILOCK_EXCL); 904 xfs_ilock(ip, XFS_ILOCK_EXCL);
932 xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); 905 xfs_trans_ijoin(tp, ip);
933 xfs_trans_ihold(tp, ip);
934 xfs_idestroy_fork(ip, XFS_ATTR_FORK); 906 xfs_idestroy_fork(ip, XFS_ATTR_FORK);
935 907
936 ASSERT(ip->i_d.di_anextents == 0); 908 ASSERT(ip->i_d.di_anextents == 0);
@@ -1035,8 +1007,6 @@ xfs_inactive(
1035 int error; 1007 int error;
1036 int truncate; 1008 int truncate;
1037 1009
1038 xfs_itrace_entry(ip);
1039
1040 /* 1010 /*
1041 * If the inode is already free, then there can be nothing 1011 * If the inode is already free, then there can be nothing
1042 * to clean up here. 1012 * to clean up here.
@@ -1060,9 +1030,6 @@ xfs_inactive(
1060 1030
1061 mp = ip->i_mount; 1031 mp = ip->i_mount;
1062 1032
1063 if (ip->i_d.di_nlink == 0 && DM_EVENT_ENABLED(ip, DM_EVENT_DESTROY))
1064 XFS_SEND_DESTROY(mp, ip, DM_RIGHT_NULL);
1065
1066 error = 0; 1033 error = 0;
1067 1034
1068 /* If this is a read-only mount, don't do this (would generate I/O) */ 1035 /* If this is a read-only mount, don't do this (would generate I/O) */
@@ -1120,8 +1087,7 @@ xfs_inactive(
1120 } 1087 }
1121 1088
1122 xfs_ilock(ip, XFS_ILOCK_EXCL); 1089 xfs_ilock(ip, XFS_ILOCK_EXCL);
1123 xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); 1090 xfs_trans_ijoin(tp, ip);
1124 xfs_trans_ihold(tp, ip);
1125 1091
1126 /* 1092 /*
1127 * normally, we have to run xfs_itruncate_finish sync. 1093 * normally, we have to run xfs_itruncate_finish sync.
@@ -1154,8 +1120,7 @@ xfs_inactive(
1154 return VN_INACTIVE_CACHE; 1120 return VN_INACTIVE_CACHE;
1155 } 1121 }
1156 1122
1157 xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); 1123 xfs_trans_ijoin(tp, ip);
1158 xfs_trans_ihold(tp, ip);
1159 } else { 1124 } else {
1160 error = xfs_trans_reserve(tp, 0, 1125 error = xfs_trans_reserve(tp, 0,
1161 XFS_IFREE_LOG_RES(mp), 1126 XFS_IFREE_LOG_RES(mp),
@@ -1168,8 +1133,7 @@ xfs_inactive(
1168 } 1133 }
1169 1134
1170 xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); 1135 xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1171 xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); 1136 xfs_trans_ijoin(tp, ip);
1172 xfs_trans_ihold(tp, ip);
1173 } 1137 }
1174 1138
1175 /* 1139 /*
@@ -1257,7 +1221,7 @@ xfs_lookup(
1257 int error; 1221 int error;
1258 uint lock_mode; 1222 uint lock_mode;
1259 1223
1260 xfs_itrace_entry(dp); 1224 trace_xfs_lookup(dp, name);
1261 1225
1262 if (XFS_FORCED_SHUTDOWN(dp->i_mount)) 1226 if (XFS_FORCED_SHUTDOWN(dp->i_mount))
1263 return XFS_ERROR(EIO); 1227 return XFS_ERROR(EIO);
@@ -1309,21 +1273,11 @@ xfs_create(
1309 uint log_res; 1273 uint log_res;
1310 uint log_count; 1274 uint log_count;
1311 1275
1312 xfs_itrace_entry(dp); 1276 trace_xfs_create(dp, name);
1313 1277
1314 if (XFS_FORCED_SHUTDOWN(mp)) 1278 if (XFS_FORCED_SHUTDOWN(mp))
1315 return XFS_ERROR(EIO); 1279 return XFS_ERROR(EIO);
1316 1280
1317 if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) {
1318 error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
1319 dp, DM_RIGHT_NULL, NULL,
1320 DM_RIGHT_NULL, name->name, NULL,
1321 mode, 0, 0);
1322
1323 if (error)
1324 return error;
1325 }
1326
1327 if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) 1281 if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
1328 prid = dp->i_d.di_projid; 1282 prid = dp->i_d.di_projid;
1329 else 1283 else
@@ -1427,8 +1381,7 @@ xfs_create(
1427 * the transaction cancel unlocking dp so don't do it explicitly in the 1381 * the transaction cancel unlocking dp so don't do it explicitly in the
1428 * error path. 1382 * error path.
1429 */ 1383 */
1430 IHOLD(dp); 1384 xfs_trans_ijoin_ref(tp, dp, XFS_ILOCK_EXCL);
1431 xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
1432 unlock_dp_on_error = B_FALSE; 1385 unlock_dp_on_error = B_FALSE;
1433 1386
1434 error = xfs_dir_createname(tp, dp, name, ip->i_ino, 1387 error = xfs_dir_createname(tp, dp, name, ip->i_ino,
@@ -1487,16 +1440,7 @@ xfs_create(
1487 xfs_qm_dqrele(gdqp); 1440 xfs_qm_dqrele(gdqp);
1488 1441
1489 *ipp = ip; 1442 *ipp = ip;
1490 1443 return 0;
1491 /* Fallthrough to std_return with error = 0 */
1492 std_return:
1493 if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTCREATE)) {
1494 XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, dp, DM_RIGHT_NULL,
1495 ip, DM_RIGHT_NULL, name->name, NULL, mode,
1496 error, 0);
1497 }
1498
1499 return error;
1500 1444
1501 out_bmap_cancel: 1445 out_bmap_cancel:
1502 xfs_bmap_cancel(&free_list); 1446 xfs_bmap_cancel(&free_list);
@@ -1510,8 +1454,8 @@ xfs_create(
1510 1454
1511 if (unlock_dp_on_error) 1455 if (unlock_dp_on_error)
1512 xfs_iunlock(dp, XFS_ILOCK_EXCL); 1456 xfs_iunlock(dp, XFS_ILOCK_EXCL);
1513 1457 std_return:
1514 goto std_return; 1458 return error;
1515 1459
1516 out_abort_rele: 1460 out_abort_rele:
1517 /* 1461 /*
@@ -1726,20 +1670,11 @@ xfs_remove(
1726 uint resblks; 1670 uint resblks;
1727 uint log_count; 1671 uint log_count;
1728 1672
1729 xfs_itrace_entry(dp); 1673 trace_xfs_remove(dp, name);
1730 xfs_itrace_entry(ip);
1731 1674
1732 if (XFS_FORCED_SHUTDOWN(mp)) 1675 if (XFS_FORCED_SHUTDOWN(mp))
1733 return XFS_ERROR(EIO); 1676 return XFS_ERROR(EIO);
1734 1677
1735 if (DM_EVENT_ENABLED(dp, DM_EVENT_REMOVE)) {
1736 error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dp, DM_RIGHT_NULL,
1737 NULL, DM_RIGHT_NULL, name->name, NULL,
1738 ip->i_d.di_mode, 0, 0);
1739 if (error)
1740 return error;
1741 }
1742
1743 error = xfs_qm_dqattach(dp, 0); 1678 error = xfs_qm_dqattach(dp, 0);
1744 if (error) 1679 if (error)
1745 goto std_return; 1680 goto std_return;
@@ -1782,15 +1717,8 @@ xfs_remove(
1782 1717
1783 xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); 1718 xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL);
1784 1719
1785 /* 1720 xfs_trans_ijoin_ref(tp, dp, XFS_ILOCK_EXCL);
1786 * At this point, we've gotten both the directory and the entry 1721 xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL);
1787 * inodes locked.
1788 */
1789 IHOLD(ip);
1790 xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
1791
1792 IHOLD(dp);
1793 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
1794 1722
1795 /* 1723 /*
1796 * If we're removing a directory perform some additional validation. 1724 * If we're removing a directory perform some additional validation.
@@ -1877,21 +1805,15 @@ xfs_remove(
1877 if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) 1805 if (!is_dir && link_zero && xfs_inode_is_filestream(ip))
1878 xfs_filestream_deassociate(ip); 1806 xfs_filestream_deassociate(ip);
1879 1807
1880 std_return: 1808 return 0;
1881 if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) {
1882 XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, dp, DM_RIGHT_NULL,
1883 NULL, DM_RIGHT_NULL, name->name, NULL,
1884 ip->i_d.di_mode, error, 0);
1885 }
1886
1887 return error;
1888 1809
1889 out_bmap_cancel: 1810 out_bmap_cancel:
1890 xfs_bmap_cancel(&free_list); 1811 xfs_bmap_cancel(&free_list);
1891 cancel_flags |= XFS_TRANS_ABORT; 1812 cancel_flags |= XFS_TRANS_ABORT;
1892 out_trans_cancel: 1813 out_trans_cancel:
1893 xfs_trans_cancel(tp, cancel_flags); 1814 xfs_trans_cancel(tp, cancel_flags);
1894 goto std_return; 1815 std_return:
1816 return error;
1895} 1817}
1896 1818
1897int 1819int
@@ -1909,25 +1831,13 @@ xfs_link(
1909 int committed; 1831 int committed;
1910 int resblks; 1832 int resblks;
1911 1833
1912 xfs_itrace_entry(tdp); 1834 trace_xfs_link(tdp, target_name);
1913 xfs_itrace_entry(sip);
1914 1835
1915 ASSERT(!S_ISDIR(sip->i_d.di_mode)); 1836 ASSERT(!S_ISDIR(sip->i_d.di_mode));
1916 1837
1917 if (XFS_FORCED_SHUTDOWN(mp)) 1838 if (XFS_FORCED_SHUTDOWN(mp))
1918 return XFS_ERROR(EIO); 1839 return XFS_ERROR(EIO);
1919 1840
1920 if (DM_EVENT_ENABLED(tdp, DM_EVENT_LINK)) {
1921 error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK,
1922 tdp, DM_RIGHT_NULL,
1923 sip, DM_RIGHT_NULL,
1924 target_name->name, NULL, 0, 0, 0);
1925 if (error)
1926 return error;
1927 }
1928
1929 /* Return through std_return after this point. */
1930
1931 error = xfs_qm_dqattach(sip, 0); 1841 error = xfs_qm_dqattach(sip, 0);
1932 if (error) 1842 if (error)
1933 goto std_return; 1843 goto std_return;
@@ -1953,15 +1863,8 @@ xfs_link(
1953 1863
1954 xfs_lock_two_inodes(sip, tdp, XFS_ILOCK_EXCL); 1864 xfs_lock_two_inodes(sip, tdp, XFS_ILOCK_EXCL);
1955 1865
1956 /* 1866 xfs_trans_ijoin_ref(tp, sip, XFS_ILOCK_EXCL);
1957 * Increment vnode ref counts since xfs_trans_commit & 1867 xfs_trans_ijoin_ref(tp, tdp, XFS_ILOCK_EXCL);
1958 * xfs_trans_cancel will both unlock the inodes and
1959 * decrement the associated ref counts.
1960 */
1961 IHOLD(sip);
1962 IHOLD(tdp);
1963 xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL);
1964 xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL);
1965 1868
1966 /* 1869 /*
1967 * If the source has too many links, we can't make any more to it. 1870 * If the source has too many links, we can't make any more to it.
@@ -2014,27 +1917,14 @@ xfs_link(
2014 goto abort_return; 1917 goto abort_return;
2015 } 1918 }
2016 1919
2017 error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); 1920 return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
2018 if (error)
2019 goto std_return;
2020
2021 /* Fall through to std_return with error = 0. */
2022std_return:
2023 if (DM_EVENT_ENABLED(sip, DM_EVENT_POSTLINK)) {
2024 (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK,
2025 tdp, DM_RIGHT_NULL,
2026 sip, DM_RIGHT_NULL,
2027 target_name->name, NULL, 0, error, 0);
2028 }
2029 return error;
2030 1921
2031 abort_return: 1922 abort_return:
2032 cancel_flags |= XFS_TRANS_ABORT; 1923 cancel_flags |= XFS_TRANS_ABORT;
2033 /* FALLTHROUGH */
2034
2035 error_return: 1924 error_return:
2036 xfs_trans_cancel(tp, cancel_flags); 1925 xfs_trans_cancel(tp, cancel_flags);
2037 goto std_return; 1926 std_return:
1927 return error;
2038} 1928}
2039 1929
2040int 1930int
@@ -2074,7 +1964,7 @@ xfs_symlink(
2074 ip = NULL; 1964 ip = NULL;
2075 tp = NULL; 1965 tp = NULL;
2076 1966
2077 xfs_itrace_entry(dp); 1967 trace_xfs_symlink(dp, link_name);
2078 1968
2079 if (XFS_FORCED_SHUTDOWN(mp)) 1969 if (XFS_FORCED_SHUTDOWN(mp))
2080 return XFS_ERROR(EIO); 1970 return XFS_ERROR(EIO);
@@ -2086,17 +1976,6 @@ xfs_symlink(
2086 if (pathlen >= MAXPATHLEN) /* total string too long */ 1976 if (pathlen >= MAXPATHLEN) /* total string too long */
2087 return XFS_ERROR(ENAMETOOLONG); 1977 return XFS_ERROR(ENAMETOOLONG);
2088 1978
2089 if (DM_EVENT_ENABLED(dp, DM_EVENT_SYMLINK)) {
2090 error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dp,
2091 DM_RIGHT_NULL, NULL, DM_RIGHT_NULL,
2092 link_name->name,
2093 (unsigned char *)target_path, 0, 0, 0);
2094 if (error)
2095 return error;
2096 }
2097
2098 /* Return through std_return after this point. */
2099
2100 udqp = gdqp = NULL; 1979 udqp = gdqp = NULL;
2101 if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) 1980 if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
2102 prid = dp->i_d.di_projid; 1981 prid = dp->i_d.di_projid;
@@ -2180,8 +2059,7 @@ xfs_symlink(
2180 * transaction cancel unlocking dp so don't do it explicitly in the 2059 * transaction cancel unlocking dp so don't do it explicitly in the
2181 * error path. 2060 * error path.
2182 */ 2061 */
2183 IHOLD(dp); 2062 xfs_trans_ijoin_ref(tp, dp, XFS_ILOCK_EXCL);
2184 xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
2185 unlock_dp_on_error = B_FALSE; 2063 unlock_dp_on_error = B_FALSE;
2186 2064
2187 /* 2065 /*
@@ -2215,7 +2093,7 @@ xfs_symlink(
2215 error = xfs_bmapi(tp, ip, first_fsb, fs_blocks, 2093 error = xfs_bmapi(tp, ip, first_fsb, fs_blocks,
2216 XFS_BMAPI_WRITE | XFS_BMAPI_METADATA, 2094 XFS_BMAPI_WRITE | XFS_BMAPI_METADATA,
2217 &first_block, resblks, mval, &nmaps, 2095 &first_block, resblks, mval, &nmaps,
2218 &free_list, NULL); 2096 &free_list);
2219 if (error) { 2097 if (error) {
2220 goto error1; 2098 goto error1;
2221 } 2099 }
@@ -2278,21 +2156,8 @@ xfs_symlink(
2278 xfs_qm_dqrele(udqp); 2156 xfs_qm_dqrele(udqp);
2279 xfs_qm_dqrele(gdqp); 2157 xfs_qm_dqrele(gdqp);
2280 2158
2281 /* Fall through to std_return with error = 0 or errno from 2159 *ipp = ip;
2282 * xfs_trans_commit */ 2160 return 0;
2283std_return:
2284 if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTSYMLINK)) {
2285 (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK,
2286 dp, DM_RIGHT_NULL,
2287 error ? NULL : ip,
2288 DM_RIGHT_NULL, link_name->name,
2289 (unsigned char *)target_path,
2290 0, error, 0);
2291 }
2292
2293 if (!error)
2294 *ipp = ip;
2295 return error;
2296 2161
2297 error2: 2162 error2:
2298 IRELE(ip); 2163 IRELE(ip);
@@ -2306,8 +2171,8 @@ std_return:
2306 2171
2307 if (unlock_dp_on_error) 2172 if (unlock_dp_on_error)
2308 xfs_iunlock(dp, XFS_ILOCK_EXCL); 2173 xfs_iunlock(dp, XFS_ILOCK_EXCL);
2309 2174 std_return:
2310 goto std_return; 2175 return error;
2311} 2176}
2312 2177
2313int 2178int
@@ -2333,13 +2198,12 @@ xfs_set_dmattrs(
2333 return error; 2198 return error;
2334 } 2199 }
2335 xfs_ilock(ip, XFS_ILOCK_EXCL); 2200 xfs_ilock(ip, XFS_ILOCK_EXCL);
2336 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 2201 xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL);
2337 2202
2338 ip->i_d.di_dmevmask = evmask; 2203 ip->i_d.di_dmevmask = evmask;
2339 ip->i_d.di_dmstate = state; 2204 ip->i_d.di_dmstate = state;
2340 2205
2341 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 2206 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
2342 IHOLD(ip);
2343 error = xfs_trans_commit(tp, 0); 2207 error = xfs_trans_commit(tp, 0);
2344 2208
2345 return error; 2209 return error;
@@ -2390,7 +2254,7 @@ xfs_alloc_file_space(
2390 int committed; 2254 int committed;
2391 int error; 2255 int error;
2392 2256
2393 xfs_itrace_entry(ip); 2257 trace_xfs_alloc_file_space(ip);
2394 2258
2395 if (XFS_FORCED_SHUTDOWN(mp)) 2259 if (XFS_FORCED_SHUTDOWN(mp))
2396 return XFS_ERROR(EIO); 2260 return XFS_ERROR(EIO);
@@ -2412,25 +2276,9 @@ xfs_alloc_file_space(
2412 startoffset_fsb = XFS_B_TO_FSBT(mp, offset); 2276 startoffset_fsb = XFS_B_TO_FSBT(mp, offset);
2413 allocatesize_fsb = XFS_B_TO_FSB(mp, count); 2277 allocatesize_fsb = XFS_B_TO_FSB(mp, count);
2414 2278
2415 /* Generate a DMAPI event if needed. */
2416 if (alloc_type != 0 && offset < ip->i_size &&
2417 (attr_flags & XFS_ATTR_DMI) == 0 &&
2418 DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) {
2419 xfs_off_t end_dmi_offset;
2420
2421 end_dmi_offset = offset+len;
2422 if (end_dmi_offset > ip->i_size)
2423 end_dmi_offset = ip->i_size;
2424 error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, offset,
2425 end_dmi_offset - offset, 0, NULL);
2426 if (error)
2427 return error;
2428 }
2429
2430 /* 2279 /*
2431 * Allocate file space until done or until there is an error 2280 * Allocate file space until done or until there is an error
2432 */ 2281 */
2433retry:
2434 while (allocatesize_fsb && !error) { 2282 while (allocatesize_fsb && !error) {
2435 xfs_fileoff_t s, e; 2283 xfs_fileoff_t s, e;
2436 2284
@@ -2488,8 +2336,7 @@ retry:
2488 if (error) 2336 if (error)
2489 goto error1; 2337 goto error1;
2490 2338
2491 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 2339 xfs_trans_ijoin(tp, ip);
2492 xfs_trans_ihold(tp, ip);
2493 2340
2494 /* 2341 /*
2495 * Issue the xfs_bmapi() call to allocate the blocks 2342 * Issue the xfs_bmapi() call to allocate the blocks
@@ -2498,7 +2345,7 @@ retry:
2498 error = xfs_bmapi(tp, ip, startoffset_fsb, 2345 error = xfs_bmapi(tp, ip, startoffset_fsb,
2499 allocatesize_fsb, bmapi_flag, 2346 allocatesize_fsb, bmapi_flag,
2500 &firstfsb, 0, imapp, &nimaps, 2347 &firstfsb, 0, imapp, &nimaps,
2501 &free_list, NULL); 2348 &free_list);
2502 if (error) { 2349 if (error) {
2503 goto error0; 2350 goto error0;
2504 } 2351 }
@@ -2527,17 +2374,6 @@ retry:
2527 startoffset_fsb += allocated_fsb; 2374 startoffset_fsb += allocated_fsb;
2528 allocatesize_fsb -= allocated_fsb; 2375 allocatesize_fsb -= allocated_fsb;
2529 } 2376 }
2530dmapi_enospc_check:
2531 if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0 &&
2532 DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE)) {
2533 error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE,
2534 ip, DM_RIGHT_NULL,
2535 ip, DM_RIGHT_NULL,
2536 NULL, NULL, 0, 0, 0); /* Delay flag intentionally unused */
2537 if (error == 0)
2538 goto retry; /* Maybe DMAPI app. has made space */
2539 /* else fall through with error from XFS_SEND_DATA */
2540 }
2541 2377
2542 return error; 2378 return error;
2543 2379
@@ -2548,7 +2384,7 @@ error0: /* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
2548error1: /* Just cancel transaction */ 2384error1: /* Just cancel transaction */
2549 xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); 2385 xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
2550 xfs_iunlock(ip, XFS_ILOCK_EXCL); 2386 xfs_iunlock(ip, XFS_ILOCK_EXCL);
2551 goto dmapi_enospc_check; 2387 return error;
2552} 2388}
2553 2389
2554/* 2390/*
@@ -2598,7 +2434,7 @@ xfs_zero_remaining_bytes(
2598 offset_fsb = XFS_B_TO_FSBT(mp, offset); 2434 offset_fsb = XFS_B_TO_FSBT(mp, offset);
2599 nimap = 1; 2435 nimap = 1;
2600 error = xfs_bmapi(NULL, ip, offset_fsb, 1, 0, 2436 error = xfs_bmapi(NULL, ip, offset_fsb, 1, 0,
2601 NULL, 0, &imap, &nimap, NULL, NULL); 2437 NULL, 0, &imap, &nimap, NULL);
2602 if (error || nimap < 1) 2438 if (error || nimap < 1)
2603 break; 2439 break;
2604 ASSERT(imap.br_blockcount >= 1); 2440 ASSERT(imap.br_blockcount >= 1);
@@ -2661,7 +2497,6 @@ xfs_free_file_space(
2661{ 2497{
2662 int committed; 2498 int committed;
2663 int done; 2499 int done;
2664 xfs_off_t end_dmi_offset;
2665 xfs_fileoff_t endoffset_fsb; 2500 xfs_fileoff_t endoffset_fsb;
2666 int error; 2501 int error;
2667 xfs_fsblock_t firstfsb; 2502 xfs_fsblock_t firstfsb;
@@ -2680,7 +2515,7 @@ xfs_free_file_space(
2680 2515
2681 mp = ip->i_mount; 2516 mp = ip->i_mount;
2682 2517
2683 xfs_itrace_entry(ip); 2518 trace_xfs_free_file_space(ip);
2684 2519
2685 error = xfs_qm_dqattach(ip, 0); 2520 error = xfs_qm_dqattach(ip, 0);
2686 if (error) 2521 if (error)
@@ -2691,19 +2526,7 @@ xfs_free_file_space(
2691 return error; 2526 return error;
2692 rt = XFS_IS_REALTIME_INODE(ip); 2527 rt = XFS_IS_REALTIME_INODE(ip);
2693 startoffset_fsb = XFS_B_TO_FSB(mp, offset); 2528 startoffset_fsb = XFS_B_TO_FSB(mp, offset);
2694 end_dmi_offset = offset + len; 2529 endoffset_fsb = XFS_B_TO_FSBT(mp, offset + len);
2695 endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset);
2696
2697 if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0 &&
2698 DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) {
2699 if (end_dmi_offset > ip->i_size)
2700 end_dmi_offset = ip->i_size;
2701 error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip,
2702 offset, end_dmi_offset - offset,
2703 AT_DELAY_FLAG(attr_flags), NULL);
2704 if (error)
2705 return error;
2706 }
2707 2530
2708 if (attr_flags & XFS_ATTR_NOLOCK) 2531 if (attr_flags & XFS_ATTR_NOLOCK)
2709 need_iolock = 0; 2532 need_iolock = 0;
@@ -2731,7 +2554,7 @@ xfs_free_file_space(
2731 if (rt && !xfs_sb_version_hasextflgbit(&mp->m_sb)) { 2554 if (rt && !xfs_sb_version_hasextflgbit(&mp->m_sb)) {
2732 nimap = 1; 2555 nimap = 1;
2733 error = xfs_bmapi(NULL, ip, startoffset_fsb, 2556 error = xfs_bmapi(NULL, ip, startoffset_fsb,
2734 1, 0, NULL, 0, &imap, &nimap, NULL, NULL); 2557 1, 0, NULL, 0, &imap, &nimap, NULL);
2735 if (error) 2558 if (error)
2736 goto out_unlock_iolock; 2559 goto out_unlock_iolock;
2737 ASSERT(nimap == 0 || nimap == 1); 2560 ASSERT(nimap == 0 || nimap == 1);
@@ -2746,7 +2569,7 @@ xfs_free_file_space(
2746 } 2569 }
2747 nimap = 1; 2570 nimap = 1;
2748 error = xfs_bmapi(NULL, ip, endoffset_fsb - 1, 2571 error = xfs_bmapi(NULL, ip, endoffset_fsb - 1,
2749 1, 0, NULL, 0, &imap, &nimap, NULL, NULL); 2572 1, 0, NULL, 0, &imap, &nimap, NULL);
2750 if (error) 2573 if (error)
2751 goto out_unlock_iolock; 2574 goto out_unlock_iolock;
2752 ASSERT(nimap == 0 || nimap == 1); 2575 ASSERT(nimap == 0 || nimap == 1);
@@ -2814,8 +2637,7 @@ xfs_free_file_space(
2814 if (error) 2637 if (error)
2815 goto error1; 2638 goto error1;
2816 2639
2817 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 2640 xfs_trans_ijoin(tp, ip);
2818 xfs_trans_ihold(tp, ip);
2819 2641
2820 /* 2642 /*
2821 * issue the bunmapi() call to free the blocks 2643 * issue the bunmapi() call to free the blocks
@@ -2823,7 +2645,7 @@ xfs_free_file_space(
2823 xfs_bmap_init(&free_list, &firstfsb); 2645 xfs_bmap_init(&free_list, &firstfsb);
2824 error = xfs_bunmapi(tp, ip, startoffset_fsb, 2646 error = xfs_bunmapi(tp, ip, startoffset_fsb,
2825 endoffset_fsb - startoffset_fsb, 2647 endoffset_fsb - startoffset_fsb,
2826 0, 2, &firstfsb, &free_list, NULL, &done); 2648 0, 2, &firstfsb, &free_list, &done);
2827 if (error) { 2649 if (error) {
2828 goto error0; 2650 goto error0;
2829 } 2651 }
@@ -2883,8 +2705,6 @@ xfs_change_file_space(
2883 xfs_trans_t *tp; 2705 xfs_trans_t *tp;
2884 struct iattr iattr; 2706 struct iattr iattr;
2885 2707
2886 xfs_itrace_entry(ip);
2887
2888 if (!S_ISREG(ip->i_d.di_mode)) 2708 if (!S_ISREG(ip->i_d.di_mode))
2889 return XFS_ERROR(EINVAL); 2709 return XFS_ERROR(EINVAL);
2890 2710
@@ -2985,8 +2805,7 @@ xfs_change_file_space(
2985 2805
2986 xfs_ilock(ip, XFS_ILOCK_EXCL); 2806 xfs_ilock(ip, XFS_ILOCK_EXCL);
2987 2807
2988 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 2808 xfs_trans_ijoin(tp, ip);
2989 xfs_trans_ihold(tp, ip);
2990 2809
2991 if ((attr_flags & XFS_ATTR_DMI) == 0) { 2810 if ((attr_flags & XFS_ATTR_DMI) == 0) {
2992 ip->i_d.di_mode &= ~S_ISUID; 2811 ip->i_d.di_mode &= ~S_ISUID;