[PATCH 08/14] xfs: make xfs_buf_get_uncached return an error code

Darrick J. Wong
2020-02-20T01:45:31Z

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@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
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;