Skip to content

Commit

Permalink
xfs: refactor recovered BUI log item playback
Browse files Browse the repository at this point in the history
Move the code that processes the log items created from the recovered
log items into the per-item source code files and use dispatch functions
to call them.  No functional changes.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
  • Loading branch information
djwong committed May 8, 2020
1 parent c57ed2f commit 9329ba8
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 73 deletions.
44 changes: 35 additions & 9 deletions fs/xfs/xfs_bmap_item.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
kmem_zone_t *xfs_bui_zone;
kmem_zone_t *xfs_bud_zone;

static const struct xfs_item_ops xfs_bui_item_ops;

static inline struct xfs_bui_log_item *BUI_ITEM(struct xfs_log_item *lip)
{
return container_of(lip, struct xfs_bui_log_item, bui_item);
Expand All @@ -47,7 +49,7 @@ xfs_bui_item_free(
* committed vs unpin operations in bulk insert operations. Hence the reference
* count to ensure only the last caller frees the BUI.
*/
void
STATIC void
xfs_bui_release(
struct xfs_bui_log_item *buip)
{
Expand Down Expand Up @@ -126,13 +128,6 @@ xfs_bui_item_release(
xfs_bui_release(BUI_ITEM(lip));
}

static const struct xfs_item_ops xfs_bui_item_ops = {
.iop_size = xfs_bui_item_size,
.iop_format = xfs_bui_item_format,
.iop_unpin = xfs_bui_item_unpin,
.iop_release = xfs_bui_item_release,
};

/*
* Allocate and initialize an bui item with the given number of extents.
*/
Expand Down Expand Up @@ -425,7 +420,7 @@ const struct xfs_defer_op_type xfs_bmap_update_defer_type = {
* Process a bmap update intent item that was recovered from the log.
* We need to update some inode's bmbt.
*/
int
STATIC int
xfs_bui_recover(
struct xfs_trans *parent_tp,
struct xfs_bui_log_item *buip)
Expand Down Expand Up @@ -560,6 +555,37 @@ xfs_bui_recover(
return error;
}

/* Recover the BUI if necessary. */
STATIC int
xfs_bui_item_recover(
struct xfs_log_item *lip,
struct xfs_trans *tp)
{
struct xfs_ail *ailp = lip->li_ailp;
struct xfs_bui_log_item *buip = BUI_ITEM(lip);
int error;

/*
* Skip BUIs that we've already processed.
*/
if (test_bit(XFS_BUI_RECOVERED, &buip->bui_flags))
return 0;

spin_unlock(&ailp->ail_lock);
error = xfs_bui_recover(tp, buip);
spin_lock(&ailp->ail_lock);

return error;
}

static const struct xfs_item_ops xfs_bui_item_ops = {
.iop_size = xfs_bui_item_size,
.iop_format = xfs_bui_item_format,
.iop_unpin = xfs_bui_item_unpin,
.iop_release = xfs_bui_item_release,
.iop_recover = xfs_bui_item_recover,
};

/*
* Copy an BUI format buffer from the given buf, and into the destination
* BUI format structure. The BUI/BUD items were designed not to need any
Expand Down
3 changes: 0 additions & 3 deletions fs/xfs/xfs_bmap_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,4 @@ struct xfs_bud_log_item {
extern struct kmem_zone *xfs_bui_zone;
extern struct kmem_zone *xfs_bud_zone;

void xfs_bui_release(struct xfs_bui_log_item *);
int xfs_bui_recover(struct xfs_trans *parent_tp, struct xfs_bui_log_item *buip);

#endif /* __XFS_BMAP_ITEM_H__ */
67 changes: 6 additions & 61 deletions fs/xfs/xfs_log_recover.c
Original file line number Diff line number Diff line change
Expand Up @@ -2546,46 +2546,6 @@ xlog_recover_process_data(
return 0;
}

/* Recover the BUI if necessary. */
STATIC int
xlog_recover_process_bui(
struct xfs_trans *parent_tp,
struct xfs_ail *ailp,
struct xfs_log_item *lip)
{
struct xfs_bui_log_item *buip;
int error;

/*
* Skip BUIs that we've already processed.
*/
buip = container_of(lip, struct xfs_bui_log_item, bui_item);
if (test_bit(XFS_BUI_RECOVERED, &buip->bui_flags))
return 0;

spin_unlock(&ailp->ail_lock);
error = xfs_bui_recover(parent_tp, buip);
spin_lock(&ailp->ail_lock);

return error;
}

/* Release the BUI since we're cancelling everything. */
STATIC void
xlog_recover_cancel_bui(
struct xfs_mount *mp,
struct xfs_ail *ailp,
struct xfs_log_item *lip)
{
struct xfs_bui_log_item *buip;

buip = container_of(lip, struct xfs_bui_log_item, bui_item);

spin_unlock(&ailp->ail_lock);
xfs_bui_release(buip);
spin_lock(&ailp->ail_lock);
}

/* Is this log item a deferred action intent? */
static inline bool xlog_item_is_intent(struct xfs_log_item *lip)
{
Expand Down Expand Up @@ -2704,18 +2664,11 @@ xlog_recover_process_intents(

/*
* NOTE: If your intent processing routine can create more
* deferred ops, you /must/ attach them to the dfops in this
* routine or else those subsequent intents will get
* deferred ops, you /must/ attach them to the transaction in
* this routine or else those subsequent intents will get
* replayed in the wrong order!
*/
switch (lip->li_type) {
case XFS_LI_BUI:
error = xlog_recover_process_bui(parent_tp, ailp, lip);
break;
default:
error = lip->li_ops->iop_recover(lip, parent_tp);
break;
}
error = lip->li_ops->iop_recover(lip, parent_tp);
if (error)
goto out;
lip = xfs_trans_ail_cursor_next(ailp, &cur);
Expand Down Expand Up @@ -2758,17 +2711,9 @@ xlog_recover_cancel_intents(
break;
}

switch (lip->li_type) {
case XFS_LI_BUI:
xlog_recover_cancel_bui(log->l_mp, ailp, lip);
break;
default:
spin_unlock(&ailp->ail_lock);
lip->li_ops->iop_release(lip);
spin_lock(&ailp->ail_lock);
break;
}

spin_unlock(&ailp->ail_lock);
lip->li_ops->iop_release(lip);
spin_lock(&ailp->ail_lock);
lip = xfs_trans_ail_cursor_next(ailp, &cur);
}

Expand Down

0 comments on commit 9329ba8

Please sign in to comment.