Commit 9f0bbd8ca7905fcc0602c038013b095322fec939

Authored by Prasad Joshi
1 parent 41b93bc1ee

logfs: query block device for number of pages to send with bio

The block device driver puts a limit on maximum number of pages that
can be sent with the bio. Not all block devices can handle
BIO_MAX_PAGES number of pages in bio. Specifically the virtio-blk
diriver limits it to 126. When the LogFS file system was excersized in
KVM, the following bug from do_virtblk_request() was observed

static void do_virtblk_request(struct request_queue *q)
{
	....
	....
	while ((req = blk_peek_request(q)) != NULL) {
		BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems);
		....
		....
	}
	....
}

The patch fixes the problem by querring the maximum number of pages in
bio allowed from block device driver and then using those many pages
during submit_bio.

Signed-off-by: Prasad Joshi <prasadjoshi.linux@gmail.com>

Showing 1 changed file with 6 additions and 8 deletions Side-by-side Diff

... ... @@ -96,12 +96,11 @@
96 96 struct address_space *mapping = super->s_mapping_inode->i_mapping;
97 97 struct bio *bio;
98 98 struct page *page;
99   - struct request_queue *q = bdev_get_queue(sb->s_bdev);
100   - unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9);
  99 + unsigned int max_pages;
101 100 int i;
102 101  
103   - if (max_pages > BIO_MAX_PAGES)
104   - max_pages = BIO_MAX_PAGES;
  102 + max_pages = min(nr_pages, (size_t) bio_get_nr_vecs(super->s_bdev));
  103 +
105 104 bio = bio_alloc(GFP_NOFS, max_pages);
106 105 BUG_ON(!bio);
107 106  
108 107  
... ... @@ -191,12 +190,11 @@
191 190 {
192 191 struct logfs_super *super = logfs_super(sb);
193 192 struct bio *bio;
194   - struct request_queue *q = bdev_get_queue(sb->s_bdev);
195   - unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9);
  193 + unsigned int max_pages;
196 194 int i;
197 195  
198   - if (max_pages > BIO_MAX_PAGES)
199   - max_pages = BIO_MAX_PAGES;
  196 + max_pages = min(nr_pages, (size_t) bio_get_nr_vecs(super->s_bdev));
  197 +
200 198 bio = bio_alloc(GFP_NOFS, max_pages);
201 199 BUG_ON(!bio);
202 200