diff options
author | Dave Chinner <david@fromorbit.com> | 2015-08-19 10:10:47 +1000 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2015-08-19 10:10:47 +1000 |
commit | 5be203ad115c1d8294e8685253e05fcea0202e04 (patch) | |
tree | fb30d691376436a934ab117fa8d5ff4a8f5bc508 /fs/xfs/xfs_trans_extfree.c | |
parent | 5461ad99cab98d19f2570c468cdd6c42b6d66795 (diff) | |
parent | d4a97a04227d5ba91b91888a016e2300861cfbc7 (diff) | |
download | blackbird-op-linux-5be203ad115c1d8294e8685253e05fcea0202e04.tar.gz blackbird-op-linux-5be203ad115c1d8294e8685253e05fcea0202e04.zip |
Merge branch 'xfs-efi-rework' into for-next
Diffstat (limited to 'fs/xfs/xfs_trans_extfree.c')
-rw-r--r-- | fs/xfs/xfs_trans_extfree.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index 284397dd7990..a96ae540eb62 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -25,6 +25,7 @@ #include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" +#include "xfs_alloc.h" /* * This routine is called to allocate an "extent free intention" @@ -108,19 +109,30 @@ xfs_trans_get_efd(xfs_trans_t *tp, } /* - * This routine is called to indicate that the described - * extent is to be logged as having been freed. It should - * be called once for each extent freed. + * Free an extent and log it to the EFD. Note that the transaction is marked + * dirty regardless of whether the extent free succeeds or fails to support the + * EFI/EFD lifecycle rules. */ -void -xfs_trans_log_efd_extent(xfs_trans_t *tp, - xfs_efd_log_item_t *efdp, - xfs_fsblock_t start_block, - xfs_extlen_t ext_len) +int +xfs_trans_free_extent( + struct xfs_trans *tp, + struct xfs_efd_log_item *efdp, + xfs_fsblock_t start_block, + xfs_extlen_t ext_len) { uint next_extent; - xfs_extent_t *extp; + struct xfs_extent *extp; + int error; + error = xfs_free_extent(tp, start_block, ext_len); + + /* + * Mark the transaction dirty, even on error. This ensures the + * transaction is aborted, which: + * + * 1.) releases the EFI and frees the EFD + * 2.) shuts down the filesystem + */ tp->t_flags |= XFS_TRANS_DIRTY; efdp->efd_item.li_desc->lid_flags |= XFS_LID_DIRTY; @@ -130,4 +142,6 @@ xfs_trans_log_efd_extent(xfs_trans_t *tp, extp->ext_start = start_block; extp->ext_len = ext_len; efdp->efd_next_extent++; + + return error; } |