diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-07-10 16:12:15 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-07-11 12:00:51 -0400 |
commit | f96ba8e0aac91f2650270e9639359243cb9ac2d1 (patch) | |
tree | caad4c77122cd24f45a6deb1405faad88cb1b8d8 /libbcachefs/util.c | |
parent | 07a0a5b5c42e7429c2bb3b7feead23274454eb57 (diff) |
Update bcachefs sources to b91a514413 bcachefs: Don't try to delete stripes when RO
Diffstat (limited to 'libbcachefs/util.c')
-rw-r--r-- | libbcachefs/util.c | 49 |
1 files changed, 17 insertions, 32 deletions
diff --git a/libbcachefs/util.c b/libbcachefs/util.c index 94dd6519..2cc433ec 100644 --- a/libbcachefs/util.c +++ b/libbcachefs/util.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * random utiility code, for bcache but in theory not specific to bcache * @@ -503,48 +504,32 @@ size_t bch2_pd_controller_print_debug(struct bch_pd_controller *pd, char *buf) /* misc: */ -void bch2_bio_map(struct bio *bio, void *base) +void bch2_bio_map(struct bio *bio, void *base, size_t size) { - size_t size = bio->bi_iter.bi_size; - struct bio_vec *bv = bio->bi_io_vec; - - BUG_ON(!bio->bi_iter.bi_size); - BUG_ON(bio->bi_vcnt); - BUG_ON(!bio->bi_max_vecs); - - bv->bv_offset = base ? offset_in_page(base) : 0; - goto start; - - for (; size; bio->bi_vcnt++, bv++) { - BUG_ON(bio->bi_vcnt >= bio->bi_max_vecs); - - bv->bv_offset = 0; -start: bv->bv_len = min_t(size_t, PAGE_SIZE - bv->bv_offset, - size); - if (base) { - bv->bv_page = is_vmalloc_addr(base) + while (size) { + struct page *page = is_vmalloc_addr(base) ? vmalloc_to_page(base) : virt_to_page(base); + unsigned offset = offset_in_page(base); + unsigned len = min_t(size_t, PAGE_SIZE - offset, size); - base += bv->bv_len; - } - - size -= bv->bv_len; + BUG_ON(!bio_add_page(bio, page, len, offset)); + size -= len; + base += len; } } -int bch2_bio_alloc_pages(struct bio *bio, gfp_t gfp_mask) +int bch2_bio_alloc_pages(struct bio *bio, size_t size, gfp_t gfp_mask) { - int i; - struct bio_vec *bv; + while (size) { + struct page *page = alloc_page(gfp_mask); + unsigned len = min(PAGE_SIZE, size); - bio_for_each_segment_all(bv, bio, i) { - bv->bv_page = alloc_page(gfp_mask); - if (!bv->bv_page) { - while (--bv >= bio->bi_io_vec) - __free_page(bv->bv_page); + if (!page) return -ENOMEM; - } + + BUG_ON(!bio_add_page(bio, page, len, 0)); + size -= len; } return 0; |