#include "xfs_refcount.h"
 #include "xfs_bmap.h"
 #include "xfs_alloc.h"
+#include "xfs_buf.h"
 
 static struct kmem_cache       *xfs_defer_pending_cache;
 
        struct xfs_trans                *tp,
        struct xfs_defer_resources      *dres)
 {
+       unsigned int                    i;
+
        ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
        ASSERT(!(tp->t_flags & XFS_TRANS_DIRTY));
 
-       /* Lock and join the captured inode to the new transaction. */
+       /* Lock the captured resources to the new transaction. */
        if (dfc->dfc_held.dr_inos == 2)
                xfs_lock_two_inodes(dfc->dfc_held.dr_ip[0], XFS_ILOCK_EXCL,
                                    dfc->dfc_held.dr_ip[1], XFS_ILOCK_EXCL);
        else if (dfc->dfc_held.dr_inos == 1)
                xfs_ilock(dfc->dfc_held.dr_ip[0], XFS_ILOCK_EXCL);
+
+       for (i = 0; i < dfc->dfc_held.dr_bufs; i++)
+               xfs_buf_lock(dfc->dfc_held.dr_bp[i]);
+
+       /* Join the captured resources to the new transaction. */
        xfs_defer_restore_resources(tp, &dfc->dfc_held);
        memcpy(dres, &dfc->dfc_held, sizeof(struct xfs_defer_resources));
+       dres->dr_bufs = 0;
 
        /* Move captured dfops chain and state to the transaction. */
        list_splice_init(&dfc->dfc_dfops, &tp->t_dfops);