diff options
author | Dave Chinner <dchinner@redhat.com> | 2012-06-22 04:50:10 -0400 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2012-07-01 15:50:05 -0400 |
commit | 6dde27077eaf590eac279627f74b7e4e40b864b2 (patch) | |
tree | 0556e1118b68fc251c33ba650a0ffc75e7caa8d9 | |
parent | 3e85c868a697805a3d4c7800a6bacdfc81d15cdf (diff) |
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>
-rw-r--r-- | fs/xfs/xfs_buf.c | 37 | ||||
-rw-r--r-- | fs/xfs/xfs_buf.h | 46 |
2 files changed, 58 insertions, 25 deletions
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 82bb8123ab2b..39c5d7622dec 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c | |||
@@ -581,22 +581,21 @@ found: | |||
581 | * more hits than misses. | 581 | * more hits than misses. |
582 | */ | 582 | */ |
583 | struct xfs_buf * | 583 | struct xfs_buf * |
584 | xfs_buf_get( | 584 | xfs_buf_get_map( |
585 | xfs_buftarg_t *target, | 585 | struct xfs_buftarg *target, |
586 | xfs_daddr_t blkno, | 586 | struct xfs_buf_map *map, |
587 | size_t numblks, | 587 | int nmaps, |
588 | xfs_buf_flags_t flags) | 588 | xfs_buf_flags_t flags) |
589 | { | 589 | { |
590 | struct xfs_buf *bp; | 590 | struct xfs_buf *bp; |
591 | struct xfs_buf *new_bp; | 591 | struct xfs_buf *new_bp; |
592 | int error = 0; | 592 | int error = 0; |
593 | DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); | ||
594 | 593 | ||
595 | bp = _xfs_buf_find(target, &map, 1, flags, NULL); | 594 | bp = _xfs_buf_find(target, map, nmaps, flags, NULL); |
596 | if (likely(bp)) | 595 | if (likely(bp)) |
597 | goto found; | 596 | goto found; |
598 | 597 | ||
599 | new_bp = _xfs_buf_alloc(target, &map, 1, flags); | 598 | new_bp = _xfs_buf_alloc(target, map, nmaps, flags); |
600 | if (unlikely(!new_bp)) | 599 | if (unlikely(!new_bp)) |
601 | return NULL; | 600 | return NULL; |
602 | 601 | ||
@@ -606,7 +605,7 @@ xfs_buf_get( | |||
606 | return NULL; | 605 | return NULL; |
607 | } | 606 | } |
608 | 607 | ||
609 | bp = _xfs_buf_find(target, &map, 1, flags, new_bp); | 608 | bp = _xfs_buf_find(target, map, nmaps, flags, new_bp); |
610 | if (!bp) { | 609 | if (!bp) { |
611 | xfs_buf_free(new_bp); | 610 | xfs_buf_free(new_bp); |
612 | return NULL; | 611 | return NULL; |
@@ -649,17 +648,17 @@ _xfs_buf_read( | |||
649 | } | 648 | } |
650 | 649 | ||
651 | xfs_buf_t * | 650 | xfs_buf_t * |
652 | xfs_buf_read( | 651 | xfs_buf_read_map( |
653 | xfs_buftarg_t *target, | 652 | struct xfs_buftarg *target, |
654 | xfs_daddr_t blkno, | 653 | struct xfs_buf_map *map, |
655 | size_t numblks, | 654 | int nmaps, |
656 | xfs_buf_flags_t flags) | 655 | xfs_buf_flags_t flags) |
657 | { | 656 | { |
658 | xfs_buf_t *bp; | 657 | struct xfs_buf *bp; |
659 | 658 | ||
660 | flags |= XBF_READ; | 659 | flags |= XBF_READ; |
661 | 660 | ||
662 | bp = xfs_buf_get(target, blkno, numblks, flags); | 661 | bp = xfs_buf_get_map(target, map, nmaps, flags); |
663 | if (bp) { | 662 | if (bp) { |
664 | trace_xfs_buf_read(bp, flags, _RET_IP_); | 663 | trace_xfs_buf_read(bp, flags, _RET_IP_); |
665 | 664 | ||
@@ -687,15 +686,15 @@ xfs_buf_read( | |||
687 | * safe manner. | 686 | * safe manner. |
688 | */ | 687 | */ |
689 | void | 688 | void |
690 | xfs_buf_readahead( | 689 | xfs_buf_readahead_map( |
691 | xfs_buftarg_t *target, | 690 | struct xfs_buftarg *target, |
692 | xfs_daddr_t blkno, | 691 | struct xfs_buf_map *map, |
693 | size_t numblks) | 692 | int nmaps) |
694 | { | 693 | { |
695 | if (bdi_read_congested(target->bt_bdi)) | 694 | if (bdi_read_congested(target->bt_bdi)) |
696 | return; | 695 | return; |
697 | 696 | ||
698 | xfs_buf_read(target, blkno, numblks, | 697 | xfs_buf_read_map(target, map, nmaps, |
699 | XBF_TRYLOCK|XBF_ASYNC|XBF_READ_AHEAD); | 698 | XBF_TRYLOCK|XBF_ASYNC|XBF_READ_AHEAD); |
700 | } | 699 | } |
701 | 700 | ||
diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 67d134994ae4..aa96bd410aed 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h | |||
@@ -184,12 +184,46 @@ xfs_buf_alloc( | |||
184 | return _xfs_buf_alloc(target, &map, 1, flags); | 184 | return _xfs_buf_alloc(target, &map, 1, flags); |
185 | } | 185 | } |
186 | 186 | ||
187 | struct xfs_buf *xfs_buf_get(struct xfs_buftarg *target, xfs_daddr_t blkno, | 187 | struct xfs_buf *xfs_buf_get_map(struct xfs_buftarg *target, |
188 | size_t numblks, xfs_buf_flags_t flags); | 188 | struct xfs_buf_map *map, int nmaps, |
189 | struct xfs_buf *xfs_buf_read(struct xfs_buftarg *target, xfs_daddr_t blkno, | 189 | xfs_buf_flags_t flags); |
190 | size_t numblks, xfs_buf_flags_t flags); | 190 | struct xfs_buf *xfs_buf_read_map(struct xfs_buftarg *target, |
191 | void xfs_buf_readahead(struct xfs_buftarg *target, xfs_daddr_t blkno, | 191 | struct xfs_buf_map *map, int nmaps, |
192 | size_t numblks); | 192 | xfs_buf_flags_t flags); |
193 | void xfs_buf_readahead_map(struct xfs_buftarg *target, | ||
194 | struct xfs_buf_map *map, int nmaps); | ||
195 | |||
196 | static inline struct xfs_buf * | ||
197 | xfs_buf_get( | ||
198 | struct xfs_buftarg *target, | ||
199 | xfs_daddr_t blkno, | ||
200 | size_t numblks, | ||
201 | xfs_buf_flags_t flags) | ||
202 | { | ||
203 | DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); | ||
204 | return xfs_buf_get_map(target, &map, 1, flags); | ||
205 | } | ||
206 | |||
207 | static inline struct xfs_buf * | ||
208 | xfs_buf_read( | ||
209 | struct xfs_buftarg *target, | ||
210 | xfs_daddr_t blkno, | ||
211 | size_t numblks, | ||
212 | xfs_buf_flags_t flags) | ||
213 | { | ||
214 | DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); | ||
215 | return xfs_buf_read_map(target, &map, 1, flags); | ||
216 | } | ||
217 | |||
218 | static inline void | ||
219 | xfs_buf_readahead( | ||
220 | struct xfs_buftarg *target, | ||
221 | xfs_daddr_t blkno, | ||
222 | size_t numblks) | ||
223 | { | ||
224 | DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); | ||
225 | return xfs_buf_readahead_map(target, &map, 1); | ||
226 | } | ||
193 | 227 | ||
194 | struct xfs_buf *xfs_buf_get_empty(struct xfs_buftarg *target, size_t numblks); | 228 | struct xfs_buf *xfs_buf_get_empty(struct xfs_buftarg *target, size_t numblks); |
195 | void xfs_buf_set_empty(struct xfs_buf *bp, size_t numblks); | 229 | void xfs_buf_set_empty(struct xfs_buf *bp, size_t numblks); |