@@ -2960,6 +2960,10 @@ xfs_read_agf(
mp, tp, mp->m_ddev_targp,
XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), flags, bpp, &xfs_agf_buf_ops);
+ if (error == -EAGAIN && (flags & XBF_TRYLOCK)) {
+ *bpp = NULL;
+ return 0;
+ }
if (error)
return error;
if (!*bpp)
@@ -826,12 +826,13 @@ xfs_buf_reverify(
return bp->b_error;
}
-xfs_buf_t *
+int
xfs_buf_read_map(
struct xfs_buftarg *target,
struct xfs_buf_map *map,
int nmaps,
xfs_buf_flags_t flags,
+ struct xfs_buf **bpp,
const struct xfs_buf_ops *ops)
{
struct xfs_buf *bp;
@@ -840,7 +841,7 @@ xfs_buf_read_map(
bp = xfs_buf_get_map(target, map, nmaps, flags);
if (!bp)
- return NULL;
+ return -ENOMEM;
trace_xfs_buf_read(bp, flags, _RET_IP_);
@@ -848,7 +849,8 @@ xfs_buf_read_map(
XFS_STATS_INC(target->bt_mount, xb_get_read);
bp->b_ops = ops;
_xfs_buf_read(bp, flags);
- return bp;
+ *bpp = bp;
+ return 0;
}
xfs_buf_reverify(bp, ops);
@@ -859,13 +861,15 @@ xfs_buf_read_map(
* drop the buffer
*/
xfs_buf_relse(bp);
- return NULL;
+ *bpp = NULL;
+ return 0;
}
/* We do not want read in the flags */
bp->b_flags &= ~XBF_READ;
ASSERT(bp->b_ops != NULL || ops == NULL);
- return bp;
+ *bpp = bp;
+ return 0;
}
int
@@ -881,9 +885,9 @@ xfs_buf_read(
int error;
DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
- bp = xfs_buf_read_map(target, &map, 1, flags, ops);
- if (!bp)
- return -ENOMEM;
+ error = xfs_buf_read_map(target, &map, 1, flags, &bp, ops);
+ if (error)
+ return error;
error = bp->b_error;
if (error) {
xfs_buf_ioerror_alert(bp, __func__);
@@ -911,11 +915,13 @@ xfs_buf_readahead_map(
int nmaps,
const struct xfs_buf_ops *ops)
{
+ struct xfs_buf *bp;
+
if (bdi_read_congested(target->bt_bdev->bd_bdi))
return;
xfs_buf_read_map(target, map, nmaps,
- XBF_TRYLOCK|XBF_ASYNC|XBF_READ_AHEAD, ops);
+ XBF_TRYLOCK | XBF_ASYNC | XBF_READ_AHEAD, &bp, ops);
}
/*
@@ -195,13 +195,11 @@ struct xfs_buf *xfs_buf_incore(struct xfs_buftarg *target,
struct xfs_buf *xfs_buf_get_map(struct xfs_buftarg *target,
struct xfs_buf_map *map, int nmaps,
xfs_buf_flags_t flags);
-struct xfs_buf *xfs_buf_read_map(struct xfs_buftarg *target,
- struct xfs_buf_map *map, int nmaps,
- xfs_buf_flags_t flags,
- const struct xfs_buf_ops *ops);
-void xfs_buf_readahead_map(struct xfs_buftarg *target,
- struct xfs_buf_map *map, int nmaps,
- const struct xfs_buf_ops *ops);
+int xfs_buf_read_map(struct xfs_buftarg *target, struct xfs_buf_map *map,
+ int nmaps, xfs_buf_flags_t flags, struct xfs_buf **bpp,
+ const struct xfs_buf_ops *ops);
+void xfs_buf_readahead_map(struct xfs_buftarg *target, struct xfs_buf_map *map,
+ int nmaps, const struct xfs_buf_ops *ops);
int xfs_buf_get(struct xfs_buftarg *target, xfs_daddr_t blkno, size_t numblks,
struct xfs_buf **bpp);
@@ -298,12 +298,9 @@ xfs_trans_read_buf_map(
return 0;
}
- bp = xfs_buf_read_map(target, map, nmaps, flags, ops);
- if (!bp) {
- if (!(flags & XBF_TRYLOCK))
- return -ENOMEM;
- return tp ? 0 : -EAGAIN;
- }
+ error = xfs_buf_read_map(target, map, nmaps, flags, &bp, ops);
+ if (error)
+ return error;
/*
* If we've had a read error, then the contents of the buffer are