Commit 9f0bbd8ca7905fcc0602c038013b095322fec939
1 parent
41b93bc1ee
Exists in
master
and in
20 other branches
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
fs/logfs/dev_bdev.c
... | ... | @@ -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 |