Commit 2842b6db authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: make xfs_buf_get_uncached return an error code



Convert xfs_buf_get_uncached() to return numeric error codes like most
everywhere else in xfs.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
parent 841263e9
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -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);

+16 −9
Original line number Diff line number Diff line
@@ -902,12 +902,13 @@ xfs_buf_read_uncached(
	const struct xfs_buf_ops *ops)
{
	struct xfs_buf		*bp;
	int			error;

	*bpp = NULL;

	bp = xfs_buf_get_uncached(target, numblks, flags);
	if (!bp)
		return -ENOMEM;
	error = xfs_buf_get_uncached(target, numblks, flags, &bp);
	if (error)
		return error;

	/* set up the buffer for a read IO */
	ASSERT(bp->b_map_count == 1);
@@ -918,7 +919,7 @@ xfs_buf_read_uncached(

	xfs_buf_submit(bp);
	if (bp->b_error) {
		int	error = bp->b_error;
		error = bp->b_error;
		xfs_buf_relse(bp);
		return error;
	}
@@ -927,17 +928,20 @@ xfs_buf_read_uncached(
	return 0;
}

xfs_buf_t *
int
xfs_buf_get_uncached(
	struct xfs_buftarg	*target,
	size_t			numblks,
	int			flags)
	int			flags,
	struct xfs_buf		**bpp)
{
	unsigned long		page_count;
	int			error, i;
	struct xfs_buf		*bp;
	DEFINE_SINGLE_BUF_MAP(map, XFS_BUF_DADDR_NULL, numblks);

	*bpp = NULL;

	/* flags might contain irrelevant bits, pass only what we care about */
	error = _xfs_buf_alloc(target, &map, 1, flags & XBF_NO_IOACCT, &bp);
	if (error)
@@ -950,9 +954,11 @@ xfs_buf_get_uncached(

	for (i = 0; i < page_count; i++) {
		bp->b_pages[i] = alloc_page(xb_to_gfp(flags));
		if (!bp->b_pages[i])
		if (!bp->b_pages[i]) {
			error = -ENOMEM;
			goto fail_free_mem;
		}
	}
	bp->b_flags |= _XBF_PAGES;

	error = _xfs_buf_map_pages(bp, 0);
@@ -963,7 +969,8 @@ xfs_buf_get_uncached(
	}

	trace_xfs_buf_get_uncached(bp, _RET_IP_);
	return bp;
	*bpp = bp;
	return 0;

 fail_free_mem:
	while (--i >= 0)
@@ -973,7 +980,7 @@ xfs_buf_get_uncached(
	xfs_buf_free_maps(bp);
	kmem_cache_free(xfs_buf_zone, bp);
 fail:
	return NULL;
	return error;
}

/*
+2 −2
Original line number Diff line number Diff line
@@ -242,8 +242,8 @@ xfs_buf_readahead(
	return xfs_buf_readahead_map(target, &map, 1, ops);
}

struct xfs_buf *xfs_buf_get_uncached(struct xfs_buftarg *target, size_t numblks,
				int flags);
int xfs_buf_get_uncached(struct xfs_buftarg *target, size_t numblks, int flags,
		struct xfs_buf **bpp);
int xfs_buf_read_uncached(struct xfs_buftarg *target, xfs_daddr_t daddr,
			  size_t numblks, int flags, struct xfs_buf **bpp,
			  const struct xfs_buf_ops *ops);