diff options
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index bb0dfb1c7af1..c25639e907bd 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -390,9 +390,17 @@ int bdev_read_page(struct block_device *bdev, sector_t sector, | |||
390 | struct page *page) | 390 | struct page *page) |
391 | { | 391 | { |
392 | const struct block_device_operations *ops = bdev->bd_disk->fops; | 392 | const struct block_device_operations *ops = bdev->bd_disk->fops; |
393 | int result = -EOPNOTSUPP; | ||
394 | |||
393 | if (!ops->rw_page || bdev_get_integrity(bdev)) | 395 | if (!ops->rw_page || bdev_get_integrity(bdev)) |
394 | return -EOPNOTSUPP; | 396 | return result; |
395 | return ops->rw_page(bdev, sector + get_start_sect(bdev), page, READ); | 397 | |
398 | result = blk_queue_enter(bdev->bd_queue, GFP_KERNEL); | ||
399 | if (result) | ||
400 | return result; | ||
401 | result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, READ); | ||
402 | blk_queue_exit(bdev->bd_queue); | ||
403 | return result; | ||
396 | } | 404 | } |
397 | EXPORT_SYMBOL_GPL(bdev_read_page); | 405 | EXPORT_SYMBOL_GPL(bdev_read_page); |
398 | 406 | ||
@@ -421,14 +429,20 @@ int bdev_write_page(struct block_device *bdev, sector_t sector, | |||
421 | int result; | 429 | int result; |
422 | int rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE; | 430 | int rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE; |
423 | const struct block_device_operations *ops = bdev->bd_disk->fops; | 431 | const struct block_device_operations *ops = bdev->bd_disk->fops; |
432 | |||
424 | if (!ops->rw_page || bdev_get_integrity(bdev)) | 433 | if (!ops->rw_page || bdev_get_integrity(bdev)) |
425 | return -EOPNOTSUPP; | 434 | return -EOPNOTSUPP; |
435 | result = blk_queue_enter(bdev->bd_queue, GFP_KERNEL); | ||
436 | if (result) | ||
437 | return result; | ||
438 | |||
426 | set_page_writeback(page); | 439 | set_page_writeback(page); |
427 | result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, rw); | 440 | result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, rw); |
428 | if (result) | 441 | if (result) |
429 | end_page_writeback(page); | 442 | end_page_writeback(page); |
430 | else | 443 | else |
431 | unlock_page(page); | 444 | unlock_page(page); |
445 | blk_queue_exit(bdev->bd_queue); | ||
432 | return result; | 446 | return result; |
433 | } | 447 | } |
434 | EXPORT_SYMBOL_GPL(bdev_write_page); | 448 | EXPORT_SYMBOL_GPL(bdev_write_page); |