xfs: add discontiguous buffer map interface
With the internal interfaces supporting discontiguous buffer maps, add external lookup, read and get interfaces so they can start to be used. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
3e85c868a6
commit
6dde27077e
2 changed files with 58 additions and 25 deletions
|
@ -581,22 +581,21 @@ _xfs_buf_find(
|
|||
* more hits than misses.
|
||||
*/
|
||||
struct xfs_buf *
|
||||
xfs_buf_get(
|
||||
xfs_buftarg_t *target,
|
||||
xfs_daddr_t blkno,
|
||||
size_t numblks,
|
||||
xfs_buf_get_map(
|
||||
struct xfs_buftarg *target,
|
||||
struct xfs_buf_map *map,
|
||||
int nmaps,
|
||||
xfs_buf_flags_t flags)
|
||||
{
|
||||
struct xfs_buf *bp;
|
||||
struct xfs_buf *new_bp;
|
||||
int error = 0;
|
||||
DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
|
||||
|
||||
bp = _xfs_buf_find(target, &map, 1, flags, NULL);
|
||||
bp = _xfs_buf_find(target, map, nmaps, flags, NULL);
|
||||
if (likely(bp))
|
||||
goto found;
|
||||
|
||||
new_bp = _xfs_buf_alloc(target, &map, 1, flags);
|
||||
new_bp = _xfs_buf_alloc(target, map, nmaps, flags);
|
||||
if (unlikely(!new_bp))
|
||||
return NULL;
|
||||
|
||||
|
@ -606,7 +605,7 @@ xfs_buf_get(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
bp = _xfs_buf_find(target, &map, 1, flags, new_bp);
|
||||
bp = _xfs_buf_find(target, map, nmaps, flags, new_bp);
|
||||
if (!bp) {
|
||||
xfs_buf_free(new_bp);
|
||||
return NULL;
|
||||
|
@ -649,17 +648,17 @@ _xfs_buf_read(
|
|||
}
|
||||
|
||||
xfs_buf_t *
|
||||
xfs_buf_read(
|
||||
xfs_buftarg_t *target,
|
||||
xfs_daddr_t blkno,
|
||||
size_t numblks,
|
||||
xfs_buf_read_map(
|
||||
struct xfs_buftarg *target,
|
||||
struct xfs_buf_map *map,
|
||||
int nmaps,
|
||||
xfs_buf_flags_t flags)
|
||||
{
|
||||
xfs_buf_t *bp;
|
||||
struct xfs_buf *bp;
|
||||
|
||||
flags |= XBF_READ;
|
||||
|
||||
bp = xfs_buf_get(target, blkno, numblks, flags);
|
||||
bp = xfs_buf_get_map(target, map, nmaps, flags);
|
||||
if (bp) {
|
||||
trace_xfs_buf_read(bp, flags, _RET_IP_);
|
||||
|
||||
|
@ -687,15 +686,15 @@ xfs_buf_read(
|
|||
* safe manner.
|
||||
*/
|
||||
void
|
||||
xfs_buf_readahead(
|
||||
xfs_buftarg_t *target,
|
||||
xfs_daddr_t blkno,
|
||||
size_t numblks)
|
||||
xfs_buf_readahead_map(
|
||||
struct xfs_buftarg *target,
|
||||
struct xfs_buf_map *map,
|
||||
int nmaps)
|
||||
{
|
||||
if (bdi_read_congested(target->bt_bdi))
|
||||
return;
|
||||
|
||||
xfs_buf_read(target, blkno, numblks,
|
||||
xfs_buf_read_map(target, map, nmaps,
|
||||
XBF_TRYLOCK|XBF_ASYNC|XBF_READ_AHEAD);
|
||||
}
|
||||
|
||||
|
|
|
@ -184,12 +184,46 @@ xfs_buf_alloc(
|
|||
return _xfs_buf_alloc(target, &map, 1, flags);
|
||||
}
|
||||
|
||||
struct xfs_buf *xfs_buf_get(struct xfs_buftarg *target, xfs_daddr_t blkno,
|
||||
size_t numblks, xfs_buf_flags_t flags);
|
||||
struct xfs_buf *xfs_buf_read(struct xfs_buftarg *target, xfs_daddr_t blkno,
|
||||
size_t numblks, xfs_buf_flags_t flags);
|
||||
void xfs_buf_readahead(struct xfs_buftarg *target, xfs_daddr_t blkno,
|
||||
size_t numblks);
|
||||
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);
|
||||
void xfs_buf_readahead_map(struct xfs_buftarg *target,
|
||||
struct xfs_buf_map *map, int nmaps);
|
||||
|
||||
static inline struct xfs_buf *
|
||||
xfs_buf_get(
|
||||
struct xfs_buftarg *target,
|
||||
xfs_daddr_t blkno,
|
||||
size_t numblks,
|
||||
xfs_buf_flags_t flags)
|
||||
{
|
||||
DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
|
||||
return xfs_buf_get_map(target, &map, 1, flags);
|
||||
}
|
||||
|
||||
static inline struct xfs_buf *
|
||||
xfs_buf_read(
|
||||
struct xfs_buftarg *target,
|
||||
xfs_daddr_t blkno,
|
||||
size_t numblks,
|
||||
xfs_buf_flags_t flags)
|
||||
{
|
||||
DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
|
||||
return xfs_buf_read_map(target, &map, 1, flags);
|
||||
}
|
||||
|
||||
static inline void
|
||||
xfs_buf_readahead(
|
||||
struct xfs_buftarg *target,
|
||||
xfs_daddr_t blkno,
|
||||
size_t numblks)
|
||||
{
|
||||
DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
|
||||
return xfs_buf_readahead_map(target, &map, 1);
|
||||
}
|
||||
|
||||
struct xfs_buf *xfs_buf_get_empty(struct xfs_buftarg *target, size_t numblks);
|
||||
void xfs_buf_set_empty(struct xfs_buf *bp, size_t numblks);
|
||||
|
|
Loading…
Reference in a new issue