/* * This is called when the buf log item is no longer needed. It should * free the buf log item associated with the given buffer and clear * the buffer's pointer to the buf log item. If there are no more * items in the list, clear the b_iodone field of the buffer (see * xfs_buf_attach_iodone() below). */ void xfs_buf_item_relse( xfs_buf_t *bp) { xfs_buf_log_item_t *bip; trace_xfs_buf_item_relse(bp, _RET_IP_); bip = bp->b_fspriv; bp->b_fspriv = bip->bli_item.li_bio_list; if (bp->b_fspriv == NULL) bp->b_iodone = NULL; xfs_buf_rele(bp); xfs_buf_item_free(bip); }
/* * This is called when the buf log item is no longer needed. It should * free the buf log item associated with the given buffer and clear * the buffer's pointer to the buf log item. If there are no more * items in the list, clear the b_iodone field of the buffer (see * xfs_buf_attach_iodone() below). */ void xfs_buf_item_relse( xfs_buf_t *bp) { xfs_buf_log_item_t *bip = bp->b_fspriv; trace_xfs_buf_item_relse(bp, _RET_IP_); ASSERT(!(bip->bli_item.li_flags & XFS_LI_IN_AIL)); bp->b_fspriv = bip->bli_item.li_bio_list; if (bp->b_fspriv == NULL) bp->b_iodone = NULL; xfs_buf_rele(bp); xfs_buf_item_free(bip); }
/* * This is the iodone() function for buffers which have been * logged. It is called when they are eventually flushed out. * It should remove the buf item from the AIL, and free the buf item. * It is called by xfs_buf_iodone_callbacks() above which will take * care of cleaning up the buffer itself. */ void xfs_buf_iodone( struct xfs_buf *bp, struct xfs_log_item *lip) { struct xfs_ail *ailp = lip->li_ailp; ASSERT(BUF_ITEM(lip)->bli_buf == bp); xfs_buf_rele(bp); /* * If we are forcibly shutting down, this may well be * off the AIL already. That's because we simulate the * log-committed callbacks to unpin these buffers. Or we may never * have put this item on AIL because of the transaction was * aborted forcibly. xfs_trans_ail_delete() takes care of these. * * Either way, AIL is useless if we're forcing a shutdown. */ spin_lock(&ailp->xa_lock); xfs_trans_ail_delete(ailp, lip, SHUTDOWN_CORRUPT_INCORE); xfs_buf_item_free(BUF_ITEM(lip)); }