|
@@ -390,9 +390,17 @@ int bdev_read_page(struct block_device *bdev, sector_t sector,
|
|
|
struct page *page)
|
|
|
{
|
|
|
const struct block_device_operations *ops = bdev->bd_disk->fops;
|
|
|
+ int result = -EOPNOTSUPP;
|
|
|
+
|
|
|
if (!ops->rw_page || bdev_get_integrity(bdev))
|
|
|
- return -EOPNOTSUPP;
|
|
|
- return ops->rw_page(bdev, sector + get_start_sect(bdev), page, READ);
|
|
|
+ return result;
|
|
|
+
|
|
|
+ result = blk_queue_enter(bdev->bd_queue, GFP_KERNEL);
|
|
|
+ if (result)
|
|
|
+ return result;
|
|
|
+ result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, READ);
|
|
|
+ blk_queue_exit(bdev->bd_queue);
|
|
|
+ return result;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(bdev_read_page);
|
|
|
|
|
@@ -421,14 +429,20 @@ int bdev_write_page(struct block_device *bdev, sector_t sector,
|
|
|
int result;
|
|
|
int rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE;
|
|
|
const struct block_device_operations *ops = bdev->bd_disk->fops;
|
|
|
+
|
|
|
if (!ops->rw_page || bdev_get_integrity(bdev))
|
|
|
return -EOPNOTSUPP;
|
|
|
+ result = blk_queue_enter(bdev->bd_queue, GFP_KERNEL);
|
|
|
+ if (result)
|
|
|
+ return result;
|
|
|
+
|
|
|
set_page_writeback(page);
|
|
|
result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, rw);
|
|
|
if (result)
|
|
|
end_page_writeback(page);
|
|
|
else
|
|
|
unlock_page(page);
|
|
|
+ blk_queue_exit(bdev->bd_queue);
|
|
|
return result;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(bdev_write_page);
|