diff options
author | Kent Overstreet <kmo@daterainc.com> | 2013-08-07 17:30:24 -0400 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2013-11-24 01:33:52 -0500 |
commit | f38a5181d9f3e004b1f50f9d7e1f2a8492ce240a (patch) | |
tree | f9e4457ba8def6a8a066cd0b545bfa2b9fb60a47 | |
parent | feb261e2ee5d782c7e9c71fe1ef0828244a42cc1 (diff) |
ceph: Convert to immutable biovecs
Now that we've got a mechanism for immutable biovecs -
bi_iter.bi_bvec_done - we need to convert drivers to use primitives that
respect it instead of using the bvec array directly.
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Sage Weil <sage@inktank.com>
Cc: ceph-devel@vger.kernel.org
-rw-r--r-- | include/linux/ceph/messenger.h | 4 | ||||
-rw-r--r-- | net/ceph/messenger.c | 43 |
2 files changed, 19 insertions, 28 deletions
diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h index 7c1420bb1dce..091fdb600d55 100644 --- a/include/linux/ceph/messenger.h +++ b/include/linux/ceph/messenger.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef __FS_CEPH_MESSENGER_H | 1 | #ifndef __FS_CEPH_MESSENGER_H |
2 | #define __FS_CEPH_MESSENGER_H | 2 | #define __FS_CEPH_MESSENGER_H |
3 | 3 | ||
4 | #include <linux/blk_types.h> | ||
4 | #include <linux/kref.h> | 5 | #include <linux/kref.h> |
5 | #include <linux/mutex.h> | 6 | #include <linux/mutex.h> |
6 | #include <linux/net.h> | 7 | #include <linux/net.h> |
@@ -119,8 +120,7 @@ struct ceph_msg_data_cursor { | |||
119 | #ifdef CONFIG_BLOCK | 120 | #ifdef CONFIG_BLOCK |
120 | struct { /* bio */ | 121 | struct { /* bio */ |
121 | struct bio *bio; /* bio from list */ | 122 | struct bio *bio; /* bio from list */ |
122 | unsigned int vector_index; /* vector from bio */ | 123 | struct bvec_iter bvec_iter; |
123 | unsigned int vector_offset; /* bytes from vector */ | ||
124 | }; | 124 | }; |
125 | #endif /* CONFIG_BLOCK */ | 125 | #endif /* CONFIG_BLOCK */ |
126 | struct { /* pages */ | 126 | struct { /* pages */ |
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 4a5df7b1cc9f..18c039b95c22 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -777,13 +777,12 @@ static void ceph_msg_data_bio_cursor_init(struct ceph_msg_data_cursor *cursor, | |||
777 | 777 | ||
778 | bio = data->bio; | 778 | bio = data->bio; |
779 | BUG_ON(!bio); | 779 | BUG_ON(!bio); |
780 | BUG_ON(!bio->bi_vcnt); | ||
781 | 780 | ||
782 | cursor->resid = min(length, data->bio_length); | 781 | cursor->resid = min(length, data->bio_length); |
783 | cursor->bio = bio; | 782 | cursor->bio = bio; |
784 | cursor->vector_index = 0; | 783 | cursor->bvec_iter = bio->bi_iter; |
785 | cursor->vector_offset = 0; | 784 | cursor->last_piece = |
786 | cursor->last_piece = length <= bio->bi_io_vec[0].bv_len; | 785 | cursor->resid <= bio_iter_len(bio, cursor->bvec_iter); |
787 | } | 786 | } |
788 | 787 | ||
789 | static struct page *ceph_msg_data_bio_next(struct ceph_msg_data_cursor *cursor, | 788 | static struct page *ceph_msg_data_bio_next(struct ceph_msg_data_cursor *cursor, |
@@ -792,71 +791,63 @@ static struct page *ceph_msg_data_bio_next(struct ceph_msg_data_cursor *cursor, | |||
792 | { | 791 | { |
793 | struct ceph_msg_data *data = cursor->data; | 792 | struct ceph_msg_data *data = cursor->data; |
794 | struct bio *bio; | 793 | struct bio *bio; |
795 | struct bio_vec *bio_vec; | 794 | struct bio_vec bio_vec; |
796 | unsigned int index; | ||
797 | 795 | ||
798 | BUG_ON(data->type != CEPH_MSG_DATA_BIO); | 796 | BUG_ON(data->type != CEPH_MSG_DATA_BIO); |
799 | 797 | ||
800 | bio = cursor->bio; | 798 | bio = cursor->bio; |
801 | BUG_ON(!bio); | 799 | BUG_ON(!bio); |
802 | 800 | ||
803 | index = cursor->vector_index; | 801 | bio_vec = bio_iter_iovec(bio, cursor->bvec_iter); |
804 | BUG_ON(index >= (unsigned int) bio->bi_vcnt); | ||
805 | 802 | ||
806 | bio_vec = &bio->bi_io_vec[index]; | 803 | *page_offset = (size_t) bio_vec.bv_offset; |
807 | BUG_ON(cursor->vector_offset >= bio_vec->bv_len); | ||
808 | *page_offset = (size_t) (bio_vec->bv_offset + cursor->vector_offset); | ||
809 | BUG_ON(*page_offset >= PAGE_SIZE); | 804 | BUG_ON(*page_offset >= PAGE_SIZE); |
810 | if (cursor->last_piece) /* pagelist offset is always 0 */ | 805 | if (cursor->last_piece) /* pagelist offset is always 0 */ |
811 | *length = cursor->resid; | 806 | *length = cursor->resid; |
812 | else | 807 | else |
813 | *length = (size_t) (bio_vec->bv_len - cursor->vector_offset); | 808 | *length = (size_t) bio_vec.bv_len; |
814 | BUG_ON(*length > cursor->resid); | 809 | BUG_ON(*length > cursor->resid); |
815 | BUG_ON(*page_offset + *length > PAGE_SIZE); | 810 | BUG_ON(*page_offset + *length > PAGE_SIZE); |
816 | 811 | ||
817 | return bio_vec->bv_page; | 812 | return bio_vec.bv_page; |
818 | } | 813 | } |
819 | 814 | ||
820 | static bool ceph_msg_data_bio_advance(struct ceph_msg_data_cursor *cursor, | 815 | static bool ceph_msg_data_bio_advance(struct ceph_msg_data_cursor *cursor, |
821 | size_t bytes) | 816 | size_t bytes) |
822 | { | 817 | { |
823 | struct bio *bio; | 818 | struct bio *bio; |
824 | struct bio_vec *bio_vec; | 819 | struct bio_vec bio_vec; |
825 | unsigned int index; | ||
826 | 820 | ||
827 | BUG_ON(cursor->data->type != CEPH_MSG_DATA_BIO); | 821 | BUG_ON(cursor->data->type != CEPH_MSG_DATA_BIO); |
828 | 822 | ||
829 | bio = cursor->bio; | 823 | bio = cursor->bio; |
830 | BUG_ON(!bio); | 824 | BUG_ON(!bio); |
831 | 825 | ||
832 | index = cursor->vector_index; | 826 | bio_vec = bio_iter_iovec(bio, cursor->bvec_iter); |
833 | BUG_ON(index >= (unsigned int) bio->bi_vcnt); | ||
834 | bio_vec = &bio->bi_io_vec[index]; | ||
835 | 827 | ||
836 | /* Advance the cursor offset */ | 828 | /* Advance the cursor offset */ |
837 | 829 | ||
838 | BUG_ON(cursor->resid < bytes); | 830 | BUG_ON(cursor->resid < bytes); |
839 | cursor->resid -= bytes; | 831 | cursor->resid -= bytes; |
840 | cursor->vector_offset += bytes; | 832 | |
841 | if (cursor->vector_offset < bio_vec->bv_len) | 833 | bio_advance_iter(bio, &cursor->bvec_iter, bytes); |
834 | |||
835 | if (bytes < bio_vec.bv_len) | ||
842 | return false; /* more bytes to process in this segment */ | 836 | return false; /* more bytes to process in this segment */ |
843 | BUG_ON(cursor->vector_offset != bio_vec->bv_len); | ||
844 | 837 | ||
845 | /* Move on to the next segment, and possibly the next bio */ | 838 | /* Move on to the next segment, and possibly the next bio */ |
846 | 839 | ||
847 | if (++index == (unsigned int) bio->bi_vcnt) { | 840 | if (!cursor->bvec_iter.bi_size) { |
848 | bio = bio->bi_next; | 841 | bio = bio->bi_next; |
849 | index = 0; | 842 | cursor->bvec_iter = bio->bi_iter; |
850 | } | 843 | } |
851 | cursor->bio = bio; | 844 | cursor->bio = bio; |
852 | cursor->vector_index = index; | ||
853 | cursor->vector_offset = 0; | ||
854 | 845 | ||
855 | if (!cursor->last_piece) { | 846 | if (!cursor->last_piece) { |
856 | BUG_ON(!cursor->resid); | 847 | BUG_ON(!cursor->resid); |
857 | BUG_ON(!bio); | 848 | BUG_ON(!bio); |
858 | /* A short read is OK, so use <= rather than == */ | 849 | /* A short read is OK, so use <= rather than == */ |
859 | if (cursor->resid <= bio->bi_io_vec[index].bv_len) | 850 | if (cursor->resid <= bio_iter_len(bio, cursor->bvec_iter)) |
860 | cursor->last_piece = true; | 851 | cursor->last_piece = true; |
861 | } | 852 | } |
862 | 853 | ||