forked from Minki/linux
xfs: rework xfs_buf_incore() API
Make it consistent with the other buffer APIs to return a error and the buffer is placed in a parameter. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
parent
7561cea5db
commit
85c73bf726
@ -543,6 +543,7 @@ xfs_attr_rmtval_stale(
|
||||
{
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
struct xfs_buf *bp;
|
||||
int error;
|
||||
|
||||
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
||||
|
||||
@ -550,14 +551,18 @@ xfs_attr_rmtval_stale(
|
||||
XFS_IS_CORRUPT(mp, map->br_startblock == HOLESTARTBLOCK))
|
||||
return -EFSCORRUPTED;
|
||||
|
||||
bp = xfs_buf_incore(mp->m_ddev_targp,
|
||||
error = xfs_buf_incore(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_buf_stale(bp);
|
||||
xfs_buf_relse(bp);
|
||||
XFS_FSB_TO_BB(mp, map->br_blockcount),
|
||||
incore_flags, &bp);
|
||||
if (error) {
|
||||
if (error == -ENOENT)
|
||||
return 0;
|
||||
return error;
|
||||
}
|
||||
|
||||
xfs_buf_stale(bp);
|
||||
xfs_buf_relse(bp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -457,16 +457,19 @@ xrep_invalidate_blocks(
|
||||
* assume it's owned by someone else.
|
||||
*/
|
||||
for_each_xbitmap_block(fsbno, bmr, n, bitmap) {
|
||||
int error;
|
||||
|
||||
/* Skip AG headers and post-EOFS blocks */
|
||||
if (!xfs_verify_fsbno(sc->mp, fsbno))
|
||||
continue;
|
||||
bp = xfs_buf_incore(sc->mp->m_ddev_targp,
|
||||
error = xfs_buf_incore(sc->mp->m_ddev_targp,
|
||||
XFS_FSB_TO_DADDR(sc->mp, fsbno),
|
||||
XFS_FSB_TO_BB(sc->mp, 1), XBF_TRYLOCK);
|
||||
if (bp) {
|
||||
xfs_trans_bjoin(sc->tp, bp);
|
||||
xfs_trans_binval(sc->tp, bp);
|
||||
}
|
||||
XFS_FSB_TO_BB(sc->mp, 1), XBF_TRYLOCK, &bp);
|
||||
if (error)
|
||||
continue;
|
||||
|
||||
xfs_trans_bjoin(sc->tp, bp);
|
||||
xfs_trans_binval(sc->tp, bp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -616,23 +616,6 @@ found:
|
||||
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
|
||||
@ -656,6 +639,8 @@ xfs_buf_get_map(
|
||||
goto found;
|
||||
if (error != -ENOENT)
|
||||
return error;
|
||||
if (flags & XBF_INCORE)
|
||||
return -ENOENT;
|
||||
|
||||
error = _xfs_buf_alloc(target, map, nmaps, flags, &new_bp);
|
||||
if (error)
|
||||
|
@ -42,9 +42,11 @@ struct xfs_buf;
|
||||
#define _XBF_DELWRI_Q (1u << 22)/* buffer on a delwri queue */
|
||||
|
||||
/* flags used only as arguments to access routines */
|
||||
#define XBF_INCORE (1u << 29)/* lookup only, return if found in cache */
|
||||
#define XBF_TRYLOCK (1u << 30)/* lock requested, but do not wait */
|
||||
#define XBF_UNMAPPED (1u << 31)/* do not map the buffer */
|
||||
|
||||
|
||||
typedef unsigned int xfs_buf_flags_t;
|
||||
|
||||
#define XFS_BUF_FLAGS \
|
||||
@ -63,6 +65,7 @@ typedef unsigned int xfs_buf_flags_t;
|
||||
{ _XBF_KMEM, "KMEM" }, \
|
||||
{ _XBF_DELWRI_Q, "DELWRI_Q" }, \
|
||||
/* The following interface flags should never be set */ \
|
||||
{ XBF_INCORE, "INCORE" }, \
|
||||
{ XBF_TRYLOCK, "TRYLOCK" }, \
|
||||
{ XBF_UNMAPPED, "UNMAPPED" }
|
||||
|
||||
@ -196,10 +199,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,
|
||||
@ -209,6 +208,19 @@ void xfs_buf_readahead_map(struct xfs_buftarg *target,
|
||||
struct xfs_buf_map *map, int nmaps,
|
||||
const struct xfs_buf_ops *ops);
|
||||
|
||||
static inline int
|
||||
xfs_buf_incore(
|
||||
struct xfs_buftarg *target,
|
||||
xfs_daddr_t blkno,
|
||||
size_t numblks,
|
||||
xfs_buf_flags_t flags,
|
||||
struct xfs_buf **bpp)
|
||||
{
|
||||
DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
|
||||
|
||||
return xfs_buf_get_map(target, &map, 1, XBF_INCORE | flags, bpp);
|
||||
}
|
||||
|
||||
static inline int
|
||||
xfs_buf_get(
|
||||
struct xfs_buftarg *target,
|
||||
|
@ -1229,12 +1229,11 @@ 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) {
|
||||
error = -EINVAL;
|
||||
error = xfs_buf_incore(mp->m_ddev_targp, dqp->q_blkno,
|
||||
mp->m_quotainfo->qi_dqchunklen, 0, &bp);
|
||||
if (error)
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
xfs_buf_unlock(bp);
|
||||
|
||||
xfs_buf_delwri_pushbuf(bp, buffer_list);
|
||||
|
Loading…
Reference in New Issue
Block a user