iblock: fix handling of large requests
authorChristoph Hellwig <hch@infradead.org>
Thu, 2 Feb 2012 21:51:24 +0000 (16:51 -0500)
committerNicholas Bellinger <nab@linux-iscsi.org>
Tue, 7 Feb 2012 06:48:46 +0000 (06:48 +0000)
Requesting to many bvecs upsets bio_alloc_bioset, so limit the number we ask
for to the amount it can handle.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/target_core_iblock.c

index d43d5eb5ed20cf7c96923f60539fa9ea0e2d259b..8572eae62da7a20399216db03ea04fe9fa1dde3e 100644 (file)
@@ -488,6 +488,13 @@ iblock_get_bio(struct se_task *task, sector_t lba, u32 sg_num)
        struct iblock_req *ib_req = IBLOCK_REQ(task);
        struct bio *bio;
 
+       /*
+        * Only allocate as many vector entries as the bio code allows us to,
+        * we'll loop later on until we have handled the whole request.
+        */
+       if (sg_num > BIO_MAX_PAGES)
+               sg_num = BIO_MAX_PAGES;
+
        bio = bio_alloc_bioset(GFP_NOIO, sg_num, ib_dev->ibd_bio_set);
        if (!bio) {
                pr_err("Unable to allocate memory for bio\n");