diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2017-10-16 09:59:09 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2017-10-25 14:28:22 -0400 |
commit | 425a4dba7953e35ffd096771973add6d2f40d2ed (patch) | |
tree | e72c382923db4b3bdaaee639eeeee4f1b728732e /block/blk-lib.c | |
parent | bb749b31c25e9b11f8f974baac8d507298ffbb70 (diff) |
block: factor out __blkdev_issue_zero_pages()
blkdev_issue_zeroout() will use this in !BLKDEV_ZERO_NOFALLBACK case.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-lib.c')
-rw-r--r-- | block/blk-lib.c | 63 |
1 files changed, 37 insertions, 26 deletions
diff --git a/block/blk-lib.c b/block/blk-lib.c index 62240f8832ca..9d2ab8bba52a 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c | |||
@@ -274,6 +274,40 @@ static unsigned int __blkdev_sectors_to_bio_pages(sector_t nr_sects) | |||
274 | return min(pages, (sector_t)BIO_MAX_PAGES); | 274 | return min(pages, (sector_t)BIO_MAX_PAGES); |
275 | } | 275 | } |
276 | 276 | ||
277 | static int __blkdev_issue_zero_pages(struct block_device *bdev, | ||
278 | sector_t sector, sector_t nr_sects, gfp_t gfp_mask, | ||
279 | struct bio **biop) | ||
280 | { | ||
281 | struct request_queue *q = bdev_get_queue(bdev); | ||
282 | struct bio *bio = *biop; | ||
283 | int bi_size = 0; | ||
284 | unsigned int sz; | ||
285 | |||
286 | if (!q) | ||
287 | return -ENXIO; | ||
288 | |||
289 | while (nr_sects != 0) { | ||
290 | bio = next_bio(bio, __blkdev_sectors_to_bio_pages(nr_sects), | ||
291 | gfp_mask); | ||
292 | bio->bi_iter.bi_sector = sector; | ||
293 | bio_set_dev(bio, bdev); | ||
294 | bio_set_op_attrs(bio, REQ_OP_WRITE, 0); | ||
295 | |||
296 | while (nr_sects != 0) { | ||
297 | sz = min((sector_t) PAGE_SIZE, nr_sects << 9); | ||
298 | bi_size = bio_add_page(bio, ZERO_PAGE(0), sz, 0); | ||
299 | nr_sects -= bi_size >> 9; | ||
300 | sector += bi_size >> 9; | ||
301 | if (bi_size < sz) | ||
302 | break; | ||
303 | } | ||
304 | cond_resched(); | ||
305 | } | ||
306 | |||
307 | *biop = bio; | ||
308 | return 0; | ||
309 | } | ||
310 | |||
277 | /** | 311 | /** |
278 | * __blkdev_issue_zeroout - generate number of zero filed write bios | 312 | * __blkdev_issue_zeroout - generate number of zero filed write bios |
279 | * @bdev: blockdev to issue | 313 | * @bdev: blockdev to issue |
@@ -304,9 +338,6 @@ int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, | |||
304 | unsigned flags) | 338 | unsigned flags) |
305 | { | 339 | { |
306 | int ret; | 340 | int ret; |
307 | int bi_size = 0; | ||
308 | struct bio *bio = *biop; | ||
309 | unsigned int sz; | ||
310 | sector_t bs_mask; | 341 | sector_t bs_mask; |
311 | 342 | ||
312 | bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; | 343 | bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; |
@@ -316,30 +347,10 @@ int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, | |||
316 | ret = __blkdev_issue_write_zeroes(bdev, sector, nr_sects, gfp_mask, | 347 | ret = __blkdev_issue_write_zeroes(bdev, sector, nr_sects, gfp_mask, |
317 | biop, flags); | 348 | biop, flags); |
318 | if (ret != -EOPNOTSUPP || (flags & BLKDEV_ZERO_NOFALLBACK)) | 349 | if (ret != -EOPNOTSUPP || (flags & BLKDEV_ZERO_NOFALLBACK)) |
319 | goto out; | 350 | return ret; |
320 | |||
321 | ret = 0; | ||
322 | while (nr_sects != 0) { | ||
323 | bio = next_bio(bio, __blkdev_sectors_to_bio_pages(nr_sects), | ||
324 | gfp_mask); | ||
325 | bio->bi_iter.bi_sector = sector; | ||
326 | bio_set_dev(bio, bdev); | ||
327 | bio_set_op_attrs(bio, REQ_OP_WRITE, 0); | ||
328 | |||
329 | while (nr_sects != 0) { | ||
330 | sz = min((sector_t) PAGE_SIZE, nr_sects << 9); | ||
331 | bi_size = bio_add_page(bio, ZERO_PAGE(0), sz, 0); | ||
332 | nr_sects -= bi_size >> 9; | ||
333 | sector += bi_size >> 9; | ||
334 | if (bi_size < sz) | ||
335 | break; | ||
336 | } | ||
337 | cond_resched(); | ||
338 | } | ||
339 | 351 | ||
340 | *biop = bio; | 352 | return __blkdev_issue_zero_pages(bdev, sector, nr_sects, gfp_mask, |
341 | out: | 353 | biop); |
342 | return ret; | ||
343 | } | 354 | } |
344 | EXPORT_SYMBOL(__blkdev_issue_zeroout); | 355 | EXPORT_SYMBOL(__blkdev_issue_zeroout); |
345 | 356 | ||