Replace the special purpose xfs_buf_incore interface with a new XBF_NOALLOC flag for the xfs_buf_get* routines. Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- fs/xfs/libxfs/xfs_attr_remote.c | 6 +++--- fs/xfs/scrub/repair.c | 6 +++--- fs/xfs/xfs_buf.c | 22 +++------------------- fs/xfs/xfs_buf.h | 5 +---- fs/xfs/xfs_qm.c | 6 +++--- 5 files changed, 13 insertions(+), 32 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c index 3fc62ff92441d5..9aff2ce203c9b6 100644 --- a/fs/xfs/libxfs/xfs_attr_remote.c +++ b/fs/xfs/libxfs/xfs_attr_remote.c @@ -550,10 +550,10 @@ xfs_attr_rmtval_stale( XFS_IS_CORRUPT(mp, map->br_startblock == HOLESTARTBLOCK)) return -EFSCORRUPTED; - bp = xfs_buf_incore(mp->m_ddev_targp, + if (!xfs_buf_get(mp->m_ddev_targp, XFS_FSB_TO_DADDR(mp, map->br_startblock), - XFS_FSB_TO_BB(mp, map->br_blockcount), incore_flags); - if (bp) { + XFS_FSB_TO_BB(mp, map->br_blockcount), + incore_flags | XBF_NOALLOC, &bp)) { xfs_buf_stale(bp); xfs_buf_relse(bp); } diff --git a/fs/xfs/scrub/repair.c b/fs/xfs/scrub/repair.c index 1e7b6b209ee89a..d4e0fcbc1487a1 100644 --- a/fs/xfs/scrub/repair.c +++ b/fs/xfs/scrub/repair.c @@ -460,10 +460,10 @@ xrep_invalidate_blocks( /* Skip AG headers and post-EOFS blocks */ if (!xfs_verify_fsbno(sc->mp, fsbno)) continue; - bp = xfs_buf_incore(sc->mp->m_ddev_targp, + if (!xfs_buf_get(sc->mp->m_ddev_targp, XFS_FSB_TO_DADDR(sc->mp, fsbno), - XFS_FSB_TO_BB(sc->mp, 1), XBF_TRYLOCK); - if (bp) { + XFS_FSB_TO_BB(sc->mp, 1), + XBF_NOALLOC | XBF_TRYLOCK, &bp)) { xfs_trans_bjoin(sc->tp, bp); xfs_trans_binval(sc->tp, bp); } diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index e1afb9e503e167..0951b7cbd79675 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -227,7 +227,8 @@ _xfs_buf_alloc( * We don't want certain flags to appear in b_flags unless they are * specifically set by later operations on the buffer. */ - flags &= ~(XBF_UNMAPPED | XBF_TRYLOCK | XBF_ASYNC | XBF_READ_AHEAD); + flags &= ~(XBF_NOALLOC | XBF_UNMAPPED | XBF_TRYLOCK | XBF_ASYNC | + XBF_READ_AHEAD); atomic_set(&bp->b_hold, 1); atomic_set(&bp->b_lru_ref, 1); @@ -616,23 +617,6 @@ xfs_buf_find( return 0; } -struct xfs_buf * -xfs_buf_incore( - struct xfs_buftarg *target, - xfs_daddr_t blkno, - size_t numblks, - xfs_buf_flags_t flags) -{ - struct xfs_buf *bp; - int error; - DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); - - error = xfs_buf_find(target, &map, 1, flags, NULL, &bp); - if (error) - return NULL; - return bp; -} - /* * Assembles a buffer covering the specified range. The code is optimised for * cache hits, as metadata intensive workloads will see 3 orders of magnitude @@ -654,7 +638,7 @@ xfs_buf_get_map( error = xfs_buf_find(target, map, nmaps, flags, NULL, &bp); if (!error) goto found; - if (error != -ENOENT) + if (error != -ENOENT || (flags & XBF_NOALLOC)) return error; error = _xfs_buf_alloc(target, map, nmaps, flags, &new_bp); diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index ed7ee674216037..a28a2c5a496ab5 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -42,6 +42,7 @@ struct xfs_buf; #define _XBF_DELWRI_Q (1 << 22)/* buffer on a delwri queue */ /* flags used only as arguments to access routines */ +#define XBF_NOALLOC (1 << 29)/* do not allocate buffer if not found */ #define XBF_TRYLOCK (1 << 30)/* lock requested, but do not wait */ #define XBF_UNMAPPED (1 << 31)/* do not map the buffer */ @@ -196,10 +197,6 @@ struct xfs_buf { }; /* Finding and Reading Buffers */ -struct xfs_buf *xfs_buf_incore(struct xfs_buftarg *target, - xfs_daddr_t blkno, size_t numblks, - xfs_buf_flags_t flags); - int xfs_buf_get_map(struct xfs_buftarg *target, struct xfs_buf_map *map, int nmaps, xfs_buf_flags_t flags, struct xfs_buf **bpp); int xfs_buf_read_map(struct xfs_buftarg *target, struct xfs_buf_map *map, diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index f165d1a3de1d1d..9325170a3e18b3 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -1238,9 +1238,9 @@ xfs_qm_flush_one( */ if (!xfs_dqflock_nowait(dqp)) { /* buf is pinned in-core by delwri list */ - bp = xfs_buf_incore(mp->m_ddev_targp, dqp->q_blkno, - mp->m_quotainfo->qi_dqchunklen, 0); - if (!bp) { + if (xfs_buf_get(mp->m_ddev_targp, dqp->q_blkno, + mp->m_quotainfo->qi_dqchunklen, + XBF_NOALLOC, &bp)) { error = -EINVAL; goto out_unlock; } -- 2.30.2