block: add a bdev_write_cache helper
Add a helper to check the write cache flag based on the block_device instead of having to poke into the block layer internal request_queue. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Acked-by: David Sterba <dsterba@suse.com> [btrfs] Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Link: https://lore.kernel.org/r/20220415045258.199825-13-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
10f0d2a517
Коммит
08e688fdb8
|
@ -558,7 +558,7 @@ static void rnbd_srv_fill_msg_open_rsp(struct rnbd_msg_open_rsp *rsp,
|
|||
rsp->secure_discard =
|
||||
cpu_to_le16(rnbd_dev_get_secure_discard(rnbd_dev));
|
||||
rsp->cache_policy = 0;
|
||||
if (test_bit(QUEUE_FLAG_WC, &q->queue_flags))
|
||||
if (bdev_write_cache(rnbd_dev->bdev))
|
||||
rsp->cache_policy |= RNBD_WRITEBACK;
|
||||
if (blk_queue_fua(q))
|
||||
rsp->cache_policy |= RNBD_FUA;
|
||||
|
|
|
@ -517,7 +517,7 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
|
|||
vbd->type |= VDISK_REMOVABLE;
|
||||
|
||||
q = bdev_get_queue(bdev);
|
||||
if (q && test_bit(QUEUE_FLAG_WC, &q->queue_flags))
|
||||
if (bdev_write_cache(bdev))
|
||||
vbd->flush_support = true;
|
||||
|
||||
if (q && blk_queue_secure_erase(q))
|
||||
|
|
|
@ -737,7 +737,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
|
|||
if (test_bit(QUEUE_FLAG_FUA, &q->queue_flags)) {
|
||||
if (cmd->se_cmd_flags & SCF_FUA)
|
||||
opf |= REQ_FUA;
|
||||
else if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags))
|
||||
else if (!bdev_write_cache(ib_dev->ibd_bd))
|
||||
opf |= REQ_FUA;
|
||||
}
|
||||
} else {
|
||||
|
@ -886,11 +886,7 @@ iblock_parse_cdb(struct se_cmd *cmd)
|
|||
|
||||
static bool iblock_get_write_cache(struct se_device *dev)
|
||||
{
|
||||
struct iblock_dev *ib_dev = IBLOCK_DEV(dev);
|
||||
struct block_device *bd = ib_dev->ibd_bd;
|
||||
struct request_queue *q = bdev_get_queue(bd);
|
||||
|
||||
return test_bit(QUEUE_FLAG_WC, &q->queue_flags);
|
||||
return bdev_write_cache(IBLOCK_DEV(dev)->ibd_bd);
|
||||
}
|
||||
|
||||
static const struct target_backend_ops iblock_ops = {
|
||||
|
|
|
@ -4249,8 +4249,7 @@ static void write_dev_flush(struct btrfs_device *device)
|
|||
* of simplicity, since this is a debug tool and not meant for use in
|
||||
* non-debug builds.
|
||||
*/
|
||||
struct request_queue *q = bdev_get_queue(device->bdev);
|
||||
if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags))
|
||||
if (!bdev_write_cache(device->bdev))
|
||||
return;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1331,6 +1331,11 @@ static inline bool bdev_nonrot(struct block_device *bdev)
|
|||
return blk_queue_nonrot(bdev_get_queue(bdev));
|
||||
}
|
||||
|
||||
static inline bool bdev_write_cache(struct block_device *bdev)
|
||||
{
|
||||
return test_bit(QUEUE_FLAG_WC, &bdev_get_queue(bdev)->queue_flags);
|
||||
}
|
||||
|
||||
static inline enum blk_zoned_model bdev_zoned_model(struct block_device *bdev)
|
||||
{
|
||||
struct request_queue *q = bdev_get_queue(bdev);
|
||||
|
|
Загрузка…
Ссылка в новой задаче