aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2012-06-22 04:50:10 -0400
committerBen Myers <bpm@sgi.com>2012-07-01 15:50:05 -0400
commit6dde27077eaf590eac279627f74b7e4e40b864b2 (patch)
tree0556e1118b68fc251c33ba650a0ffc75e7caa8d9
parent3e85c868a697805a3d4c7800a6bacdfc81d15cdf (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.c37
-rw-r--r--fs/xfs/xfs_buf.h46
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 */
583struct xfs_buf * 583struct xfs_buf *
584xfs_buf_get( 584xfs_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
651xfs_buf_t * 650xfs_buf_t *
652xfs_buf_read( 651xfs_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 */
689void 688void
690xfs_buf_readahead( 689xfs_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
187struct xfs_buf *xfs_buf_get(struct xfs_buftarg *target, xfs_daddr_t blkno, 187struct 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,
189struct 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); 190struct xfs_buf *xfs_buf_read_map(struct xfs_buftarg *target,
191void 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);
193void xfs_buf_readahead_map(struct xfs_buftarg *target,
194 struct xfs_buf_map *map, int nmaps);
195
196static inline struct xfs_buf *
197xfs_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
207static inline struct xfs_buf *
208xfs_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
218static inline void
219xfs_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
194struct xfs_buf *xfs_buf_get_empty(struct xfs_buftarg *target, size_t numblks); 228struct xfs_buf *xfs_buf_get_empty(struct xfs_buftarg *target, size_t numblks);
195void xfs_buf_set_empty(struct xfs_buf *bp, size_t numblks); 229void xfs_buf_set_empty(struct xfs_buf *bp, size_t numblks);