|
@@ -283,6 +283,33 @@ start: bv->bv_len = min_t(size_t, PAGE_SIZE - bv->bv_offset,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * bch_bio_alloc_pages - allocates a single page for each bvec in a bio
|
|
|
+ * @bio: bio to allocate pages for
|
|
|
+ * @gfp_mask: flags for allocation
|
|
|
+ *
|
|
|
+ * Allocates pages up to @bio->bi_vcnt.
|
|
|
+ *
|
|
|
+ * Returns 0 on success, -ENOMEM on failure. On failure, any allocated pages are
|
|
|
+ * freed.
|
|
|
+ */
|
|
|
+int bch_bio_alloc_pages(struct bio *bio, gfp_t gfp_mask)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ struct bio_vec *bv;
|
|
|
+
|
|
|
+ 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);
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group (Any
|
|
|
* use permitted, subject to terms of PostgreSQL license; see.)
|