From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> Source kernel commit: 2842b6db3d539bec08d080b22635b6e8acaa30ec Convert xfs_buf_get_uncached() to return numeric error codes like most everywhere else in xfs. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> Reviewed-by: Christoph Hellwig <hch@xxxxxx> Reviewed-by: Dave Chinner <dchinner@xxxxxxxxxx> Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- libxfs/libxfs_io.h | 4 ++-- libxfs/rdwr.c | 8 +++++--- libxfs/xfs_ag.c | 21 ++++++++++++--------- libxlog/xfs_log_recover.c | 7 +++++-- mkfs/xfs_mkfs.c | 8 +++++++- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h index 064587a6..6fbf976b 100644 --- a/libxfs/libxfs_io.h +++ b/libxfs/libxfs_io.h @@ -256,8 +256,8 @@ xfs_buf_associate_memory(struct xfs_buf *bp, void *mem, size_t len) return 0; } -struct xfs_buf *libxfs_buf_get_uncached(struct xfs_buftarg *targ, size_t bblen, - int flags); +int libxfs_buf_get_uncached(struct xfs_buftarg *targ, size_t bblen, int flags, + struct xfs_buf **bpp); int libxfs_buf_read_uncached(struct xfs_buftarg *targ, xfs_daddr_t daddr, size_t bblen, int flags, struct xfs_buf **bpp, const struct xfs_buf_ops *ops); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index a05e0fee..0bfe46f3 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -1128,13 +1128,15 @@ libxfs_getbufr_uncached( * Allocate an uncached buffer that points nowhere. The refcount will be 1, * and the cache node hash list will be empty to indicate that it's uncached. */ -struct xfs_buf * +int libxfs_buf_get_uncached( struct xfs_buftarg *targ, size_t bblen, - int flags) + int flags, + struct xfs_buf **bpp) { - return libxfs_getbufr_uncached(targ, XFS_BUF_DADDR_NULL, bblen); + *bpp = libxfs_getbufr_uncached(targ, XFS_BUF_DADDR_NULL, bblen); + return *bpp != NULL ? 0 : -ENOMEM; } /* diff --git a/libxfs/xfs_ag.c b/libxfs/xfs_ag.c index 5bf6975d..73fb30cb 100644 --- a/libxfs/xfs_ag.c +++ b/libxfs/xfs_ag.c @@ -23,25 +23,28 @@ #include "xfs_ag_resv.h" #include "xfs_health.h" -static struct xfs_buf * +static int xfs_get_aghdr_buf( struct xfs_mount *mp, xfs_daddr_t blkno, size_t numblks, + struct xfs_buf **bpp, const struct xfs_buf_ops *ops) { struct xfs_buf *bp; + int error; - bp = xfs_buf_get_uncached(mp->m_ddev_targp, numblks, 0); - if (!bp) - return NULL; + error = xfs_buf_get_uncached(mp->m_ddev_targp, numblks, 0, &bp); + if (error) + return error; xfs_buf_zero(bp, 0, BBTOB(bp->b_length)); bp->b_bn = blkno; bp->b_maps[0].bm_bn = blkno; bp->b_ops = ops; - return bp; + *bpp = bp; + return 0; } static inline bool is_log_ag(struct xfs_mount *mp, struct aghdr_init_data *id) @@ -340,13 +343,13 @@ xfs_ag_init_hdr( struct aghdr_init_data *id, aghdr_init_work_f work, const struct xfs_buf_ops *ops) - { struct xfs_buf *bp; + int error; - bp = xfs_get_aghdr_buf(mp, id->daddr, id->numblks, ops); - if (!bp) - return -ENOMEM; + error = xfs_get_aghdr_buf(mp, id->daddr, id->numblks, &bp, ops); + if (error) + return error; (*work)(mp, bp, id); diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index e7e57bd2..78fbafab 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -35,11 +35,13 @@ xlog_buf_bbcount_valid( * to map to a range of nbblks basic blocks at any valid (basic * block) offset within the log. */ -xfs_buf_t * +struct xfs_buf * xlog_get_bp( struct xlog *log, int nbblks) { + struct xfs_buf *bp; + if (!xlog_buf_bbcount_valid(log, nbblks)) { xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer", nbblks); @@ -67,7 +69,8 @@ xlog_get_bp( nbblks += log->l_sectBBsize; nbblks = round_up(nbblks, log->l_sectBBsize); - return libxfs_buf_get_uncached(log->l_dev, nbblks, 0); + libxfs_buf_get_uncached(log->l_dev, nbblks, 0, &bp); + return bp; } /* diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index b50b8b3a..e6b44575 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -3404,8 +3404,14 @@ get_write_buf( int bblen) { struct xfs_buf *bp; + int error; - bp = libxfs_buf_get_uncached(btp, bblen, 0); + error = -libxfs_buf_get_uncached(btp, bblen, 0, &bp); + if (error) { + fprintf(stderr, _("Could not get memory for buffer, err=%d\n"), + error); + exit(1); + } bp->b_bn = daddr; bp->b_maps[0].bm_bn = daddr; return bp;