Re: [PATCH 04/24] xfs: mark dquot buffers in cache

Darrick J. Wong
2020-05-22T21:40:45Z

On Fri, May 22, 2020 at 01:50:09PM +1000, Dave Chinner wrote:
> dquot buffers always have write IO callbacks, so by marking them
> directly we can avoid needing to attach ->b_iodone functions to
> them. This avoids an indirect call, and makes future modifications
> much simpler.
>
> This is largely a rearrangement of the code at this point - no IO
> completion functionality changes at this point, just how the
> code is run is modified.
>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/xfs_buf.c | 12 +++++++++++-
> fs/xfs/xfs_buf.h | 2 ++
> fs/xfs/xfs_buf_item.c | 10 ++++++++++
> fs/xfs/xfs_buf_item.h | 1 +
> fs/xfs/xfs_dquot.c | 1 +
> fs/xfs/xfs_trans_buf.c | 1 +
> 6 files changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index 6105b97028d6a..77d40eb4a11db 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -1204,17 +1204,27 @@ xfs_buf_ioend(
> bp->b_flags |= XBF_DONE;
> }
>
> + if (read)
> + goto out_finish;
> +
> /* inodes always have a callback on write */
> - if (!read && (bp->b_flags & _XBF_INODES)) {
> + if (bp->b_flags & _XBF_INODES) {

Heh, yes, this does seem like it belongs in the previous patch.

With that moved,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D

> xfs_buf_inode_iodone(bp);
> return;
> }
>
> + /* dquots always have a callback on write */
> + if (bp->b_flags & _XBF_DQUOTS) {
> + xfs_buf_dquot_iodone(bp);
> + return;
> + }
> +
> if (bp->b_iodone) {
> (*(bp->b_iodone))(bp);
> return;
> }
>
> +out_finish:
> xfs_buf_ioend_finish(bp);
> }
>
> diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h
> index b3e5d653d09f1..cbde44ecb3963 100644
> --- a/fs/xfs/xfs_buf.h
> +++ b/fs/xfs/xfs_buf.h
> @@ -32,6 +32,7 @@
>
> /* buffer type flags for write callbacks */
> #define _XBF_INODES (1 << 16)/* inode buffer */
> +#define _XBF_DQUOTS (1 << 17)/* dquot buffer */
>
> /* flags used only internally */
> #define _XBF_PAGES (1 << 20)/* backed by refcounted pages */
> @@ -55,6 +56,7 @@ typedef unsigned int xfs_buf_flags_t;
> { XBF_STALE, "STALE" }, \
> { XBF_WRITE_FAIL, "WRITE_FAIL" }, \
> { _XBF_INODES, "INODES" }, \
> + { _XBF_DQUOTS, "DQUOTS" }, \
> { _XBF_PAGES, "PAGES" }, \
> { _XBF_KMEM, "KMEM" }, \
> { _XBF_DELWRI_Q, "DELWRI_Q" }, \
> diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
> index 8659cf4282a64..a42cdf9ccc47d 100644
> --- a/fs/xfs/xfs_buf_item.c
> +++ b/fs/xfs/xfs_buf_item.c
> @@ -1210,6 +1210,16 @@ xfs_buf_inode_iodone(
> xfs_buf_ioend_finish(bp);
> }
>
> +/*
> + * Dquot buffer iodone callback function.
> + */
> +void
> +xfs_buf_dquot_iodone(
> + struct xfs_buf *bp)
> +{
> + xfs_buf_run_callbacks(bp);
> + xfs_buf_ioend_finish(bp);
> +}
>
> /*
> * This is the iodone() function for buffers which have been
> diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h
> index a342933ad9b8d..27d13d29b5bbb 100644
> --- a/fs/xfs/xfs_buf_item.h
> +++ b/fs/xfs/xfs_buf_item.h
> @@ -60,6 +60,7 @@ void xfs_buf_attach_iodone(struct xfs_buf *,
> void xfs_buf_iodone_callbacks(struct xfs_buf *);
> void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *);
> void xfs_buf_inode_iodone(struct xfs_buf *);
> +void xfs_buf_dquot_iodone(struct xfs_buf *);
> bool xfs_buf_log_check_iovec(struct xfs_log_iovec *iovec);
>
> extern kmem_zone_t *xfs_buf_item_zone;
> diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c
> index 55b95d45303b8..25592b701db40 100644
> --- a/fs/xfs/xfs_dquot.c
> +++ b/fs/xfs/xfs_dquot.c
> @@ -1174,6 +1174,7 @@ xfs_qm_dqflush(
> * Attach an iodone routine so that we can remove this dquot from the
> * AIL and release the flush lock once the dquot is synced to disk.
> */
> + bp->b_flags |= _XBF_DQUOTS;
> xfs_buf_attach_iodone(bp, xfs_qm_dqflush_done,
> &dqp->q_logitem.qli_item);
>
> diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c
> index 552d0869aa0fe..93d62cb864c15 100644
> --- a/fs/xfs/xfs_trans_buf.c
> +++ b/fs/xfs/xfs_trans_buf.c
> @@ -788,5 +788,6 @@ xfs_trans_dquot_buf(
> break;
> }
>
> + bp->b_flags |= _XBF_DQUOTS;
> xfs_trans_buf_set_type(tp, bp, type);
> }
> --
> 2.26.2.761.g0e0b3e54be
>