aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorBrian Foster <bfoster@redhat.com>2018-08-01 10:20:32 -0400
committerDarrick J. Wong <darrick.wong@oracle.com>2018-08-03 02:05:14 -0400
commita8198666fb755e129c2fe92819774256ec26c79c (patch)
tree4eb28b2dcb562575ba2aa825110b259cdf6d44c3 /fs/xfs
parent82ff27bc52a88cb5cc400bfa64e210d3ec8dfebd (diff)
xfs: automatic dfops inode relogging
Inodes that are held across deferred operations are explicitly joined to the dfops structure to ensure appropriate relogging. While inodes are currently joined explicitly, we can detect the conditions that require relogging at dfops finish time by inspecting the transaction item list for inodes with ili_lock_flags == 0. Replace the xfs_defer_ijoin() infrastructure with such detection and automatic relogging of held inodes. This eliminates the need for the per-dfops inode list, replaced by an on-stack variant in xfs_defer_trans_roll(). Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/libxfs/xfs_attr.c9
-rw-r--r--fs/xfs/libxfs/xfs_attr_remote.c2
-rw-r--r--fs/xfs/libxfs/xfs_bmap.c8
-rw-r--r--fs/xfs/libxfs/xfs_defer.c59
-rw-r--r--fs/xfs/libxfs/xfs_defer.h1
-rw-r--r--fs/xfs/xfs_bmap_util.c4
-rw-r--r--fs/xfs/xfs_inode.c2
-rw-r--r--fs/xfs/xfs_iomap.c3
-rw-r--r--fs/xfs/xfs_reflink.c4
-rw-r--r--fs/xfs/xfs_symlink.c1
-rw-r--r--fs/xfs/xfs_trans.h3
11 files changed, 21 insertions, 75 deletions
diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
index 227887bee00d..3190dfc21b60 100644
--- a/fs/xfs/libxfs/xfs_attr.c
+++ b/fs/xfs/libxfs/xfs_attr.c
@@ -320,7 +320,6 @@ xfs_attr_set(
320 * buffer and run into problems with the write verifier. 320 * buffer and run into problems with the write verifier.
321 */ 321 */
322 xfs_trans_bhold(args.trans, leaf_bp); 322 xfs_trans_bhold(args.trans, leaf_bp);
323 xfs_defer_ijoin(args.trans->t_dfops, dp);
324 error = xfs_defer_finish(&args.trans); 323 error = xfs_defer_finish(&args.trans);
325 if (error) 324 if (error)
326 goto out; 325 goto out;
@@ -589,7 +588,6 @@ xfs_attr_leaf_addname(
589 error = xfs_attr3_leaf_to_node(args); 588 error = xfs_attr3_leaf_to_node(args);
590 if (error) 589 if (error)
591 goto out_defer_cancel; 590 goto out_defer_cancel;
592 xfs_defer_ijoin(args->trans->t_dfops, dp);
593 error = xfs_defer_finish(&args->trans); 591 error = xfs_defer_finish(&args->trans);
594 if (error) 592 if (error)
595 goto out_defer_cancel; 593 goto out_defer_cancel;
@@ -678,7 +676,6 @@ xfs_attr_leaf_addname(
678 /* bp is gone due to xfs_da_shrink_inode */ 676 /* bp is gone due to xfs_da_shrink_inode */
679 if (error) 677 if (error)
680 goto out_defer_cancel; 678 goto out_defer_cancel;
681 xfs_defer_ijoin(args->trans->t_dfops, dp);
682 error = xfs_defer_finish(&args->trans); 679 error = xfs_defer_finish(&args->trans);
683 if (error) 680 if (error)
684 goto out_defer_cancel; 681 goto out_defer_cancel;
@@ -742,7 +739,6 @@ xfs_attr_leaf_removename(
742 /* bp is gone due to xfs_da_shrink_inode */ 739 /* bp is gone due to xfs_da_shrink_inode */
743 if (error) 740 if (error)
744 goto out_defer_cancel; 741 goto out_defer_cancel;
745 xfs_defer_ijoin(args->trans->t_dfops, dp);
746 error = xfs_defer_finish(&args->trans); 742 error = xfs_defer_finish(&args->trans);
747 if (error) 743 if (error)
748 goto out_defer_cancel; 744 goto out_defer_cancel;
@@ -869,7 +865,6 @@ restart:
869 error = xfs_attr3_leaf_to_node(args); 865 error = xfs_attr3_leaf_to_node(args);
870 if (error) 866 if (error)
871 goto out_defer_cancel; 867 goto out_defer_cancel;
872 xfs_defer_ijoin(args->trans->t_dfops, dp);
873 error = xfs_defer_finish(&args->trans); 868 error = xfs_defer_finish(&args->trans);
874 if (error) 869 if (error)
875 goto out_defer_cancel; 870 goto out_defer_cancel;
@@ -894,7 +889,6 @@ restart:
894 error = xfs_da3_split(state); 889 error = xfs_da3_split(state);
895 if (error) 890 if (error)
896 goto out_defer_cancel; 891 goto out_defer_cancel;
897 xfs_defer_ijoin(args->trans->t_dfops, dp);
898 error = xfs_defer_finish(&args->trans); 892 error = xfs_defer_finish(&args->trans);
899 if (error) 893 if (error)
900 goto out_defer_cancel; 894 goto out_defer_cancel;
@@ -991,7 +985,6 @@ restart:
991 error = xfs_da3_join(state); 985 error = xfs_da3_join(state);
992 if (error) 986 if (error)
993 goto out_defer_cancel; 987 goto out_defer_cancel;
994 xfs_defer_ijoin(args->trans->t_dfops, dp);
995 error = xfs_defer_finish(&args->trans); 988 error = xfs_defer_finish(&args->trans);
996 if (error) 989 if (error)
997 goto out_defer_cancel; 990 goto out_defer_cancel;
@@ -1115,7 +1108,6 @@ xfs_attr_node_removename(
1115 error = xfs_da3_join(state); 1108 error = xfs_da3_join(state);
1116 if (error) 1109 if (error)
1117 goto out_defer_cancel; 1110 goto out_defer_cancel;
1118 xfs_defer_ijoin(args->trans->t_dfops, dp);
1119 error = xfs_defer_finish(&args->trans); 1111 error = xfs_defer_finish(&args->trans);
1120 if (error) 1112 if (error)
1121 goto out_defer_cancel; 1113 goto out_defer_cancel;
@@ -1147,7 +1139,6 @@ xfs_attr_node_removename(
1147 /* bp is gone due to xfs_da_shrink_inode */ 1139 /* bp is gone due to xfs_da_shrink_inode */
1148 if (error) 1140 if (error)
1149 goto out_defer_cancel; 1141 goto out_defer_cancel;
1150 xfs_defer_ijoin(args->trans->t_dfops, dp);
1151 error = xfs_defer_finish(&args->trans); 1142 error = xfs_defer_finish(&args->trans);
1152 if (error) 1143 if (error)
1153 goto out_defer_cancel; 1144 goto out_defer_cancel;
diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c
index 77ca38586913..f52552313773 100644
--- a/fs/xfs/libxfs/xfs_attr_remote.c
+++ b/fs/xfs/libxfs/xfs_attr_remote.c
@@ -486,7 +486,6 @@ xfs_attr_rmtval_set(
486 &nmap); 486 &nmap);
487 if (error) 487 if (error)
488 goto out_defer_cancel; 488 goto out_defer_cancel;
489 xfs_defer_ijoin(args->trans->t_dfops, dp);
490 error = xfs_defer_finish(&args->trans); 489 error = xfs_defer_finish(&args->trans);
491 if (error) 490 if (error)
492 goto out_defer_cancel; 491 goto out_defer_cancel;
@@ -627,7 +626,6 @@ xfs_attr_rmtval_remove(
627 XFS_BMAPI_ATTRFORK, 1, &done); 626 XFS_BMAPI_ATTRFORK, 1, &done);
628 if (error) 627 if (error)
629 goto out_defer_cancel; 628 goto out_defer_cancel;
630 xfs_defer_ijoin(args->trans->t_dfops, args->dp);
631 error = xfs_defer_finish(&args->trans); 629 error = xfs_defer_finish(&args->trans);
632 if (error) 630 if (error)
633 goto out_defer_cancel; 631 goto out_defer_cancel;
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
index 71687d805f79..5cd490dc891a 100644
--- a/fs/xfs/libxfs/xfs_bmap.c
+++ b/fs/xfs/libxfs/xfs_bmap.c
@@ -1119,7 +1119,6 @@ xfs_bmap_add_attrfork(
1119 xfs_log_sb(tp); 1119 xfs_log_sb(tp);
1120 } 1120 }
1121 1121
1122 xfs_defer_ijoin(tp->t_dfops, ip);
1123 error = xfs_trans_commit(tp); 1122 error = xfs_trans_commit(tp);
1124 xfs_iunlock(ip, XFS_ILOCK_EXCL); 1123 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1125 return error; 1124 return error;
@@ -5987,7 +5986,6 @@ __xfs_bmap_add(
5987 int whichfork, 5986 int whichfork,
5988 struct xfs_bmbt_irec *bmap) 5987 struct xfs_bmbt_irec *bmap)
5989{ 5988{
5990 int error;
5991 struct xfs_bmap_intent *bi; 5989 struct xfs_bmap_intent *bi;
5992 5990
5993 trace_xfs_bmap_defer(mp, 5991 trace_xfs_bmap_defer(mp,
@@ -6006,12 +6004,6 @@ __xfs_bmap_add(
6006 bi->bi_whichfork = whichfork; 6004 bi->bi_whichfork = whichfork;
6007 bi->bi_bmap = *bmap; 6005 bi->bi_bmap = *bmap;
6008 6006
6009 error = xfs_defer_ijoin(dfops, bi->bi_owner);
6010 if (error) {
6011 kmem_free(bi);
6012 return error;
6013 }
6014
6015 xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_BMAP, &bi->bi_list); 6007 xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_BMAP, &bi->bi_list);
6016 return 0; 6008 return 0;
6017} 6009}
diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
index e9b7671d289a..1e7073252a5e 100644
--- a/fs/xfs/libxfs/xfs_defer.c
+++ b/fs/xfs/libxfs/xfs_defer.c
@@ -15,6 +15,8 @@
15#include "xfs_defer.h" 15#include "xfs_defer.h"
16#include "xfs_trans.h" 16#include "xfs_trans.h"
17#include "xfs_buf_item.h" 17#include "xfs_buf_item.h"
18#include "xfs_inode.h"
19#include "xfs_inode_item.h"
18#include "xfs_trace.h" 20#include "xfs_trace.h"
19 21
20/* 22/*
@@ -230,16 +232,14 @@ xfs_defer_trans_roll(
230{ 232{
231 struct xfs_defer_ops *dop = (*tp)->t_dfops; 233 struct xfs_defer_ops *dop = (*tp)->t_dfops;
232 struct xfs_buf_log_item *bli; 234 struct xfs_buf_log_item *bli;
235 struct xfs_inode_log_item *ili;
233 struct xfs_log_item *lip; 236 struct xfs_log_item *lip;
234 struct xfs_buf *bplist[XFS_DEFER_OPS_NR_BUFS]; 237 struct xfs_buf *bplist[XFS_DEFER_OPS_NR_BUFS];
235 int bpcount = 0; 238 struct xfs_inode *iplist[XFS_DEFER_OPS_NR_INODES];
239 int bpcount = 0, ipcount = 0;
236 int i; 240 int i;
237 int error; 241 int error;
238 242
239 /* Log all the joined inodes. */
240 for (i = 0; i < XFS_DEFER_OPS_NR_INODES && dop->dop_inodes[i]; i++)
241 xfs_trans_log_inode(*tp, dop->dop_inodes[i], XFS_ILOG_CORE);
242
243 list_for_each_entry(lip, &(*tp)->t_items, li_trans) { 243 list_for_each_entry(lip, &(*tp)->t_items, li_trans) {
244 switch (lip->li_type) { 244 switch (lip->li_type) {
245 case XFS_LI_BUF: 245 case XFS_LI_BUF:
@@ -254,6 +254,19 @@ xfs_defer_trans_roll(
254 bplist[bpcount++] = bli->bli_buf; 254 bplist[bpcount++] = bli->bli_buf;
255 } 255 }
256 break; 256 break;
257 case XFS_LI_INODE:
258 ili = container_of(lip, struct xfs_inode_log_item,
259 ili_item);
260 if (ili->ili_lock_flags == 0) {
261 if (ipcount >= XFS_DEFER_OPS_NR_INODES) {
262 ASSERT(0);
263 return -EFSCORRUPTED;
264 }
265 xfs_trans_log_inode(*tp, ili->ili_inode,
266 XFS_ILOG_CORE);
267 iplist[ipcount++] = ili->ili_inode;
268 }
269 break;
257 default: 270 default:
258 break; 271 break;
259 } 272 }
@@ -271,8 +284,8 @@ xfs_defer_trans_roll(
271 } 284 }
272 285
273 /* Rejoin the joined inodes. */ 286 /* Rejoin the joined inodes. */
274 for (i = 0; i < XFS_DEFER_OPS_NR_INODES && dop->dop_inodes[i]; i++) 287 for (i = 0; i < ipcount; i++)
275 xfs_trans_ijoin(*tp, dop->dop_inodes[i], 0); 288 xfs_trans_ijoin(*tp, iplist[i], 0);
276 289
277 /* Rejoin the buffers and dirty them so the log moves forward. */ 290 /* Rejoin the buffers and dirty them so the log moves forward. */
278 for (i = 0; i < bpcount; i++) { 291 for (i = 0; i < bpcount; i++) {
@@ -292,41 +305,13 @@ xfs_defer_has_unfinished_work(
292} 305}
293 306
294/* 307/*
295 * Add this inode to the deferred op. Each joined inode is relogged
296 * each time we roll the transaction.
297 */
298int
299xfs_defer_ijoin(
300 struct xfs_defer_ops *dop,
301 struct xfs_inode *ip)
302{
303 int i;
304
305 for (i = 0; i < XFS_DEFER_OPS_NR_INODES; i++) {
306 if (dop->dop_inodes[i] == ip)
307 return 0;
308 else if (dop->dop_inodes[i] == NULL) {
309 dop->dop_inodes[i] = ip;
310 return 0;
311 }
312 }
313
314 ASSERT(0);
315 return -EFSCORRUPTED;
316}
317
318/*
319 * Reset an already used dfops after finish. 308 * Reset an already used dfops after finish.
320 */ 309 */
321static void 310static void
322xfs_defer_reset( 311xfs_defer_reset(
323 struct xfs_trans *tp) 312 struct xfs_trans *tp)
324{ 313{
325 struct xfs_defer_ops *dop = tp->t_dfops; 314 ASSERT(!xfs_defer_has_unfinished_work(tp->t_dfops));
326
327 ASSERT(!xfs_defer_has_unfinished_work(dop));
328
329 memset(dop->dop_inodes, 0, sizeof(dop->dop_inodes));
330 315
331 /* 316 /*
332 * Low mode state transfers across transaction rolls to mirror dfops 317 * Low mode state transfers across transaction rolls to mirror dfops
@@ -588,8 +573,6 @@ xfs_defer_move(
588 list_splice_init(&src->dop_intake, &dst->dop_intake); 573 list_splice_init(&src->dop_intake, &dst->dop_intake);
589 list_splice_init(&src->dop_pending, &dst->dop_pending); 574 list_splice_init(&src->dop_pending, &dst->dop_pending);
590 575
591 memcpy(dst->dop_inodes, src->dop_inodes, sizeof(dst->dop_inodes));
592
593 /* 576 /*
594 * Low free space mode was historically controlled by a dfops field. 577 * Low free space mode was historically controlled by a dfops field.
595 * This meant that low mode state potentially carried across multiple 578 * This meant that low mode state potentially carried across multiple
diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h
index 4a8bb838adf2..bf1e9f78561e 100644
--- a/fs/xfs/libxfs/xfs_defer.h
+++ b/fs/xfs/libxfs/xfs_defer.h
@@ -42,7 +42,6 @@ int xfs_defer_finish(struct xfs_trans **tp);
42void xfs_defer_cancel(struct xfs_trans *); 42void xfs_defer_cancel(struct xfs_trans *);
43void xfs_defer_init(struct xfs_trans *tp, struct xfs_defer_ops *dop); 43void xfs_defer_init(struct xfs_trans *tp, struct xfs_defer_ops *dop);
44bool xfs_defer_has_unfinished_work(struct xfs_defer_ops *dop); 44bool xfs_defer_has_unfinished_work(struct xfs_defer_ops *dop);
45int xfs_defer_ijoin(struct xfs_defer_ops *dop, struct xfs_inode *ip);
46void xfs_defer_move(struct xfs_trans *dtp, struct xfs_trans *stp); 45void xfs_defer_move(struct xfs_trans *dtp, struct xfs_trans *stp);
47 46
48/* Description of a deferred type. */ 47/* Description of a deferred type. */
diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
index 0c58a66b39e5..30ac1300dc49 100644
--- a/fs/xfs/xfs_bmap_util.c
+++ b/fs/xfs/xfs_bmap_util.c
@@ -979,7 +979,6 @@ xfs_alloc_file_space(
979 /* 979 /*
980 * Complete the transaction 980 * Complete the transaction
981 */ 981 */
982 xfs_defer_ijoin(tp->t_dfops, ip);
983 error = xfs_trans_commit(tp); 982 error = xfs_trans_commit(tp);
984 xfs_iunlock(ip, XFS_ILOCK_EXCL); 983 xfs_iunlock(ip, XFS_ILOCK_EXCL);
985 if (error) 984 if (error)
@@ -1037,8 +1036,6 @@ xfs_unmap_extent(
1037 if (error) 1036 if (error)
1038 goto out_trans_cancel; 1037 goto out_trans_cancel;
1039 1038
1040 xfs_defer_ijoin(tp->t_dfops, ip);
1041
1042 error = xfs_trans_commit(tp); 1039 error = xfs_trans_commit(tp);
1043out_unlock: 1040out_unlock:
1044 xfs_iunlock(ip, XFS_ILOCK_EXCL); 1041 xfs_iunlock(ip, XFS_ILOCK_EXCL);
@@ -1624,7 +1621,6 @@ xfs_swap_extent_rmap(
1624 if (error) 1621 if (error)
1625 goto out_defer; 1622 goto out_defer;
1626 1623
1627 xfs_defer_ijoin(tp->t_dfops, ip);
1628 error = xfs_defer_finish(tpp); 1624 error = xfs_defer_finish(tpp);
1629 tp = *tpp; 1625 tp = *tpp;
1630 if (error) 1626 if (error)
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 441c8593cfd7..7bb46a0eecfc 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1569,7 +1569,6 @@ xfs_itruncate_extents_flags(
1569 * Duplicate the transaction that has the permanent 1569 * Duplicate the transaction that has the permanent
1570 * reservation and commit the old transaction. 1570 * reservation and commit the old transaction.
1571 */ 1571 */
1572 xfs_defer_ijoin(tp->t_dfops, ip);
1573 error = xfs_defer_finish(&tp); 1572 error = xfs_defer_finish(&tp);
1574 if (error) 1573 if (error)
1575 goto out_bmap_cancel; 1574 goto out_bmap_cancel;
@@ -1810,7 +1809,6 @@ xfs_inactive_ifree(
1810 * Just ignore errors at this point. There is nothing we can do except 1809 * Just ignore errors at this point. There is nothing we can do except
1811 * to try to keep going. Make sure it's not a silent error. 1810 * to try to keep going. Make sure it's not a silent error.
1812 */ 1811 */
1813 xfs_defer_ijoin(tp->t_dfops, ip);
1814 error = xfs_trans_commit(tp); 1812 error = xfs_trans_commit(tp);
1815 if (error) 1813 if (error)
1816 xfs_notice(mp, "%s: xfs_trans_commit returned error %d", 1814 xfs_notice(mp, "%s: xfs_trans_commit returned error %d",
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index 8093a01fcf9e..3282575e2df4 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -261,7 +261,6 @@ xfs_iomap_write_direct(
261 /* 261 /*
262 * Complete the transaction 262 * Complete the transaction
263 */ 263 */
264 xfs_defer_ijoin(tp->t_dfops, ip);
265 error = xfs_trans_commit(tp); 264 error = xfs_trans_commit(tp);
266 if (error) 265 if (error)
267 goto out_unlock; 266 goto out_unlock;
@@ -764,7 +763,6 @@ xfs_iomap_write_allocate(
764 if (error) 763 if (error)
765 goto trans_cancel; 764 goto trans_cancel;
766 765
767 xfs_defer_ijoin(tp->t_dfops, ip);
768 error = xfs_trans_commit(tp); 766 error = xfs_trans_commit(tp);
769 if (error) 767 if (error)
770 goto error0; 768 goto error0;
@@ -884,7 +882,6 @@ xfs_iomap_write_unwritten(
884 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 882 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
885 } 883 }
886 884
887 xfs_defer_ijoin(tp->t_dfops, ip);
888 error = xfs_trans_commit(tp); 885 error = xfs_trans_commit(tp);
889 xfs_iunlock(ip, XFS_ILOCK_EXCL); 886 xfs_iunlock(ip, XFS_ILOCK_EXCL);
890 if (error) 887 if (error)
diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
index e986fcf928e5..dce8ba8ab681 100644
--- a/fs/xfs/xfs_reflink.c
+++ b/fs/xfs/xfs_reflink.c
@@ -435,7 +435,6 @@ retry:
435 xfs_inode_set_cowblocks_tag(ip); 435 xfs_inode_set_cowblocks_tag(ip);
436 436
437 /* Finish up. */ 437 /* Finish up. */
438 xfs_defer_ijoin(tp->t_dfops, ip);
439 error = xfs_trans_commit(tp); 438 error = xfs_trans_commit(tp);
440 if (error) 439 if (error)
441 return error; 440 return error;
@@ -518,7 +517,6 @@ xfs_reflink_cancel_cow_blocks(
518 NULL); 517 NULL);
519 518
520 /* Roll the transaction */ 519 /* Roll the transaction */
521 xfs_defer_ijoin((*tpp)->t_dfops, ip);
522 error = xfs_defer_finish(tpp); 520 error = xfs_defer_finish(tpp);
523 if (error) { 521 if (error) {
524 xfs_defer_cancel(*tpp); 522 xfs_defer_cancel(*tpp);
@@ -716,7 +714,6 @@ xfs_reflink_end_cow(
716 /* Remove the mapping from the CoW fork. */ 714 /* Remove the mapping from the CoW fork. */
717 xfs_bmap_del_extent_cow(ip, &icur, &got, &del); 715 xfs_bmap_del_extent_cow(ip, &icur, &got, &del);
718 716
719 xfs_defer_ijoin(tp->t_dfops, ip);
720 error = xfs_defer_finish(&tp); 717 error = xfs_defer_finish(&tp);
721 if (error) 718 if (error)
722 goto out_cancel; 719 goto out_cancel;
@@ -1077,7 +1074,6 @@ xfs_reflink_remap_extent(
1077 1074
1078next_extent: 1075next_extent:
1079 /* Process all the deferred stuff. */ 1076 /* Process all the deferred stuff. */
1080 xfs_defer_ijoin(tp->t_dfops, ip);
1081 error = xfs_defer_finish(&tp); 1077 error = xfs_defer_finish(&tp);
1082 if (error) 1078 if (error)
1083 goto out_cancel; 1079 goto out_cancel;
diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c
index 2bfe7fbbedb2..a3e98c64b6e3 100644
--- a/fs/xfs/xfs_symlink.c
+++ b/fs/xfs/xfs_symlink.c
@@ -454,7 +454,6 @@ xfs_inactive_symlink_rmt(
454 * Commit the transaction. This first logs the EFI and the inode, then 454 * Commit the transaction. This first logs the EFI and the inode, then
455 * rolls and commits the transaction that frees the extents. 455 * rolls and commits the transaction that frees the extents.
456 */ 456 */
457 xfs_defer_ijoin(tp->t_dfops, ip);
458 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 457 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
459 error = xfs_trans_commit(tp); 458 error = xfs_trans_commit(tp);
460 if (error) { 459 if (error) {
diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
index 581456c79197..8665d45b82c6 100644
--- a/fs/xfs/xfs_trans.h
+++ b/fs/xfs/xfs_trans.h
@@ -97,9 +97,6 @@ void xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item,
97struct xfs_defer_ops { 97struct xfs_defer_ops {
98 struct list_head dop_intake; /* unlogged pending work */ 98 struct list_head dop_intake; /* unlogged pending work */
99 struct list_head dop_pending; /* logged pending work */ 99 struct list_head dop_pending; /* logged pending work */
100
101 /* relog these with each roll */
102 struct xfs_inode *dop_inodes[XFS_DEFER_OPS_NR_INODES];
103}; 100};
104 101
105/* 102/*