xfs: refactor releasing finished intents during log recovery
Replace the open-coded AIL item walking with a proper helper when we're trying to release an intent item that has been finished. We add a new ->iop_match method to decide if an intent item matches a supplied ID. 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>
This commit is contained in:
@@ -591,12 +591,21 @@ xfs_cui_item_recover(
|
||||
return error;
|
||||
}
|
||||
|
||||
STATIC bool
|
||||
xfs_cui_item_match(
|
||||
struct xfs_log_item *lip,
|
||||
uint64_t intent_id)
|
||||
{
|
||||
return CUI_ITEM(lip)->cui_format.cui_id == intent_id;
|
||||
}
|
||||
|
||||
static const struct xfs_item_ops xfs_cui_item_ops = {
|
||||
.iop_size = xfs_cui_item_size,
|
||||
.iop_format = xfs_cui_item_format,
|
||||
.iop_unpin = xfs_cui_item_unpin,
|
||||
.iop_release = xfs_cui_item_release,
|
||||
.iop_recover = xfs_cui_item_recover,
|
||||
.iop_match = xfs_cui_item_match,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -684,45 +693,14 @@ xlog_recover_cud_commit_pass2(
|
||||
xfs_lsn_t lsn)
|
||||
{
|
||||
struct xfs_cud_log_format *cud_formatp;
|
||||
struct xfs_cui_log_item *cuip = NULL;
|
||||
struct xfs_log_item *lip;
|
||||
uint64_t cui_id;
|
||||
struct xfs_ail_cursor cur;
|
||||
struct xfs_ail *ailp = log->l_ailp;
|
||||
|
||||
cud_formatp = item->ri_buf[0].i_addr;
|
||||
if (item->ri_buf[0].i_len != sizeof(struct xfs_cud_log_format)) {
|
||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
cui_id = cud_formatp->cud_cui_id;
|
||||
|
||||
/*
|
||||
* Search for the CUI with the id in the CUD format structure in the
|
||||
* AIL.
|
||||
*/
|
||||
spin_lock(&ailp->ail_lock);
|
||||
lip = xfs_trans_ail_cursor_first(ailp, &cur, 0);
|
||||
while (lip != NULL) {
|
||||
if (lip->li_type == XFS_LI_CUI) {
|
||||
cuip = (struct xfs_cui_log_item *)lip;
|
||||
if (cuip->cui_format.cui_id == cui_id) {
|
||||
/*
|
||||
* Drop the CUD reference to the CUI. This
|
||||
* removes the CUI from the AIL and frees it.
|
||||
*/
|
||||
spin_unlock(&ailp->ail_lock);
|
||||
xfs_cui_release(cuip);
|
||||
spin_lock(&ailp->ail_lock);
|
||||
break;
|
||||
}
|
||||
}
|
||||
lip = xfs_trans_ail_cursor_next(ailp, &cur);
|
||||
}
|
||||
|
||||
xfs_trans_ail_cursor_done(&cur);
|
||||
spin_unlock(&ailp->ail_lock);
|
||||
|
||||
xlog_recover_release_intent(log, XFS_LI_CUI, cud_formatp->cud_cui_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user