]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/xfs/xfs_trans_extfree.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[mirror_ubuntu-artful-kernel.git] / fs / xfs / xfs_trans_extfree.c
index b48490290b276ba6de0f15551f260dd3ba4968d8..459ddec137a48a2aec19d57a739e0cdbef44ae70 100644 (file)
@@ -21,6 +21,7 @@
 #include "xfs_format.h"
 #include "xfs_log_format.h"
 #include "xfs_trans_resv.h"
+#include "xfs_bit.h"
 #include "xfs_mount.h"
 #include "xfs_defer.h"
 #include "xfs_trans.h"
 #include "xfs_extfree_item.h"
 #include "xfs_alloc.h"
 #include "xfs_bmap.h"
-
-/*
- * This routine is called to allocate an "extent free intention"
- * log item that will hold nextents worth of extents.  The
- * caller must use all nextents extents, because we are not
- * flexible about this at all.
- */
-STATIC struct xfs_efi_log_item *
-xfs_trans_get_efi(struct xfs_trans     *tp,
-                 uint                  nextents)
-{
-       struct xfs_efi_log_item         *efip;
-
-       ASSERT(tp != NULL);
-       ASSERT(nextents > 0);
-
-       efip = xfs_efi_init(tp->t_mountp, nextents);
-       ASSERT(efip != NULL);
-
-       /*
-        * Get a log_item_desc to point at the new item.
-        */
-       xfs_trans_add_item(tp, &efip->efi_item);
-       return efip;
-}
-
-/*
- * This routine is called to indicate that the described
- * extent is to be logged as needing to be freed.  It should
- * be called once for each extent to be freed.
- */
-STATIC void
-xfs_trans_log_efi_extent(struct xfs_trans              *tp,
-                        struct xfs_efi_log_item        *efip,
-                        xfs_fsblock_t                  start_block,
-                        xfs_extlen_t                   ext_len)
-{
-       uint                                            next_extent;
-       struct xfs_extent                               *extp;
-
-       tp->t_flags |= XFS_TRANS_DIRTY;
-       efip->efi_item.li_desc->lid_flags |= XFS_LID_DIRTY;
-
-       /*
-        * atomic_inc_return gives us the value after the increment;
-        * we want to use it as an array index so we need to subtract 1 from
-        * it.
-        */
-       next_extent = atomic_inc_return(&efip->efi_next_extent) - 1;
-       ASSERT(next_extent < efip->efi_format.efi_nextents);
-       extp = &(efip->efi_format.efi_extents[next_extent]);
-       extp->ext_start = start_block;
-       extp->ext_len = ext_len;
-}
-
+#include "xfs_trace.h"
 
 /*
  * This routine is called to allocate an "extent free done"
@@ -120,13 +67,19 @@ xfs_trans_free_extent(
        struct xfs_trans        *tp,
        struct xfs_efd_log_item *efdp,
        xfs_fsblock_t           start_block,
-       xfs_extlen_t            ext_len)
+       xfs_extlen_t            ext_len,
+       struct xfs_owner_info   *oinfo)
 {
+       struct xfs_mount        *mp = tp->t_mountp;
        uint                    next_extent;
+       xfs_agnumber_t          agno = XFS_FSB_TO_AGNO(mp, start_block);
+       xfs_agblock_t           agbno = XFS_FSB_TO_AGBNO(mp, start_block);
        struct xfs_extent       *extp;
        int                     error;
 
-       error = xfs_free_extent(tp, start_block, ext_len);
+       trace_xfs_bmap_free_deferred(tp->t_mountp, agno, 0, agbno, ext_len);
+
+       error = xfs_free_extent(tp, start_block, ext_len, oinfo);
 
        /*
         * Mark the transaction dirty, even on error. This ensures the
@@ -171,7 +124,19 @@ xfs_extent_free_create_intent(
        struct xfs_trans                *tp,
        unsigned int                    count)
 {
-       return xfs_trans_get_efi(tp, count);
+       struct xfs_efi_log_item         *efip;
+
+       ASSERT(tp != NULL);
+       ASSERT(count > 0);
+
+       efip = xfs_efi_init(tp->t_mountp, count);
+       ASSERT(efip != NULL);
+
+       /*
+        * Get a log_item_desc to point at the new item.
+        */
+       xfs_trans_add_item(tp, &efip->efi_item);
+       return efip;
 }
 
 /* Log a free extent to the intent item. */
@@ -181,11 +146,26 @@ xfs_extent_free_log_item(
        void                            *intent,
        struct list_head                *item)
 {
+       struct xfs_efi_log_item         *efip = intent;
        struct xfs_extent_free_item     *free;
+       uint                            next_extent;
+       struct xfs_extent               *extp;
 
        free = container_of(item, struct xfs_extent_free_item, xefi_list);
-       xfs_trans_log_efi_extent(tp, intent, free->xefi_startblock,
-                       free->xefi_blockcount);
+
+       tp->t_flags |= XFS_TRANS_DIRTY;
+       efip->efi_item.li_desc->lid_flags |= XFS_LID_DIRTY;
+
+       /*
+        * atomic_inc_return gives us the value after the increment;
+        * we want to use it as an array index so we need to subtract 1 from
+        * it.
+        */
+       next_extent = atomic_inc_return(&efip->efi_next_extent) - 1;
+       ASSERT(next_extent < efip->efi_format.efi_nextents);
+       extp = &efip->efi_format.efi_extents[next_extent];
+       extp->ext_start = free->xefi_startblock;
+       extp->ext_len = free->xefi_blockcount;
 }
 
 /* Get an EFD so we can process all the free extents. */
@@ -213,7 +193,8 @@ xfs_extent_free_finish_item(
        free = container_of(item, struct xfs_extent_free_item, xefi_list);
        error = xfs_trans_free_extent(tp, done_item,
                        free->xefi_startblock,
-                       free->xefi_blockcount);
+                       free->xefi_blockcount,
+                       &free->xefi_oinfo);
        kmem_free(free);
        return error;
 }