From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Brian Foster <bfoster@redhat.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH RFC 1/2] xfs: refactor buffer logging into buffer dirtying helper
Date: Wed, 16 Aug 2017 10:16:58 -0700 [thread overview]
Message-ID: <20170816171658.GZ4796@magnolia> (raw)
In-Reply-To: <20170814165451.43788-2-bfoster@redhat.com>
On Mon, Aug 14, 2017 at 12:54:50PM -0400, Brian Foster wrote:
> xfs_trans_log_buf() is responsible for logging the dirty segments of
> a buffer along with setting all of the necessary state on the
> transaction, buffer, bli, etc., to ensure that the associated items
> are marked as dirty and prepared for I/O. We have a couple use cases
> that need to to dirty a buffer in a transaction without actually
> logging dirty ranges of the buffer. One existing use case is
> ordered buffers, which are currently logged with arbitrary ranges to
> accomplish this even though the content of ordered buffers is never
> written to the log. Another pending use case is to relog an already
> dirty buffer across rolled transactions within the deferred
> operations infrastructure. This is required to prevent a held
> (XFS_BLI_HOLD) buffer from pinning the tail of the log.
>
> Refactor xfs_trans_log_buf() into a new function that contains all
> of the logic responsible to dirty the transaction, lidp, buffer and
> bli. This new function can be used in the future for the use cases
> outlined above. This patch does not introduce functional changes.
>
> Signed-off-by: Brian Foster <bfoster@redhat.com>
Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
--D
> ---
> fs/xfs/xfs_trans.h | 4 +++-
> fs/xfs/xfs_trans_buf.c | 46 ++++++++++++++++++++++++++++++----------------
> 2 files changed, 33 insertions(+), 17 deletions(-)
>
> diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
> index 6bdad6f..a9c4404 100644
> --- a/fs/xfs/xfs_trans.h
> +++ b/fs/xfs/xfs_trans.h
> @@ -213,7 +213,9 @@ void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint);
> void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *);
> void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int);
> void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint);
> -void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint);
> +void xfs_trans_log_buf(struct xfs_trans *, struct xfs_buf *, uint,
> + uint);
> +void xfs_trans_dirty_buf(struct xfs_trans *, struct xfs_buf *);
> void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint);
>
> void xfs_extent_free_init_defer_op(void);
> diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c
> index 86987d8..58818a0 100644
> --- a/fs/xfs/xfs_trans_buf.c
> +++ b/fs/xfs/xfs_trans_buf.c
> @@ -493,25 +493,17 @@ xfs_trans_bhold_release(xfs_trans_t *tp,
> }
>
> /*
> - * This is called to mark bytes first through last inclusive of the given
> - * buffer as needing to be logged when the transaction is committed.
> - * The buffer must already be associated with the given transaction.
> - *
> - * First and last are numbers relative to the beginning of this buffer,
> - * so the first byte in the buffer is numbered 0 regardless of the
> - * value of b_blkno.
> + * Mark a buffer dirty in the transaction.
> */
> void
> -xfs_trans_log_buf(xfs_trans_t *tp,
> - xfs_buf_t *bp,
> - uint first,
> - uint last)
> +xfs_trans_dirty_buf(
> + struct xfs_trans *tp,
> + struct xfs_buf *bp)
> {
> - xfs_buf_log_item_t *bip = bp->b_fspriv;
> + struct xfs_buf_log_item *bip = bp->b_fspriv;
>
> ASSERT(bp->b_transp == tp);
> ASSERT(bip != NULL);
> - ASSERT(first <= last && last < BBTOB(bp->b_length));
> ASSERT(bp->b_iodone == NULL ||
> bp->b_iodone == xfs_buf_iodone_callbacks);
>
> @@ -531,8 +523,6 @@ xfs_trans_log_buf(xfs_trans_t *tp,
> bp->b_iodone = xfs_buf_iodone_callbacks;
> bip->bli_item.li_cb = xfs_buf_iodone;
>
> - trace_xfs_trans_log_buf(bip);
> -
> /*
> * If we invalidated the buffer within this transaction, then
> * cancel the invalidation now that we're dirtying the buffer
> @@ -545,15 +535,39 @@ xfs_trans_log_buf(xfs_trans_t *tp,
> bp->b_flags &= ~XBF_STALE;
> bip->__bli_format.blf_flags &= ~XFS_BLF_CANCEL;
> }
> + bip->bli_flags |= XFS_BLI_DIRTY | XFS_BLI_LOGGED;
>
> tp->t_flags |= XFS_TRANS_DIRTY;
> bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY;
> +}
> +
> +/*
> + * This is called to mark bytes first through last inclusive of the given
> + * buffer as needing to be logged when the transaction is committed.
> + * The buffer must already be associated with the given transaction.
> + *
> + * First and last are numbers relative to the beginning of this buffer,
> + * so the first byte in the buffer is numbered 0 regardless of the
> + * value of b_blkno.
> + */
> +void
> +xfs_trans_log_buf(
> + struct xfs_trans *tp,
> + struct xfs_buf *bp,
> + uint first,
> + uint last)
> +{
> + struct xfs_buf_log_item *bip = bp->b_fspriv;
> +
> + ASSERT(first <= last && last < BBTOB(bp->b_length));
> +
> + xfs_trans_dirty_buf(tp, bp);
>
> /*
> * If we have an ordered buffer we are not logging any dirty range but
> * it still needs to be marked dirty and that it has been logged.
> */
> - bip->bli_flags |= XFS_BLI_DIRTY | XFS_BLI_LOGGED;
> + trace_xfs_trans_log_buf(bip);
> if (!(bip->bli_flags & XFS_BLI_ORDERED))
> xfs_buf_item_log(bip, first, last);
> }
> --
> 2.9.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2017-08-16 17:17 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-14 16:54 [PATCH RFC 0/2] xfs: refactor ordered buffer logging code Brian Foster
2017-08-14 16:54 ` [PATCH RFC 1/2] xfs: refactor buffer logging into buffer dirtying helper Brian Foster
2017-08-16 17:16 ` Darrick J. Wong [this message]
2017-08-14 16:54 ` [PATCH RFC 2/2] xfs: don't log dirty ranges for ordered buffers Brian Foster
2017-08-15 0:25 ` Dave Chinner
2017-08-16 17:15 ` Darrick J. Wong
2017-08-17 11:06 ` Brian Foster
2017-08-14 20:20 ` [PATCH RFC 0/2] xfs: refactor ordered buffer logging code Allison Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170816171658.GZ4796@magnolia \
--to=darrick.wong@oracle.com \
--cc=bfoster@redhat.com \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox