diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index 5d228bdab..b1128a2db 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -249,6 +249,17 @@ uint32_t spdk_bdev_get_max_unmap_descriptors(const struct spdk_bdev *bdev); */ size_t spdk_bdev_get_buf_align(const struct spdk_bdev *bdev); +/** + * Query whether block device has an enabled write cache. + * + * \param bdev Block device to query. + * \return true if block device has a volatile write cache enabled. + * + * If this function returns true, written data may not be persistent until a flush command + * is issued. + */ +bool spdk_bdev_has_write_cache(const struct spdk_bdev *bdev); + struct spdk_bdev_io *spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch, void *buf, uint64_t offset, uint64_t nbytes, spdk_bdev_io_completion_cb cb, void *cb_arg); diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 62535946f..3399811ed 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -574,6 +574,12 @@ spdk_bdev_get_buf_align(const struct spdk_bdev *bdev) return 1; } +bool +spdk_bdev_has_write_cache(const struct spdk_bdev *bdev) +{ + return bdev->write_cache; +} + static int spdk_bdev_io_valid(struct spdk_bdev *bdev, uint64_t offset, uint64_t nbytes) { diff --git a/lib/scsi/scsi_bdev.c b/lib/scsi/scsi_bdev.c index 5d6146905..b33ff55f5 100644 --- a/lib/scsi/scsi_bdev.c +++ b/lib/scsi/scsi_bdev.c @@ -888,7 +888,7 @@ spdk_bdev_scsi_mode_sense_page(struct spdk_bdev *bdev, plen = 0x12 + 2; mode_sense_page_init(cp, plen, page, subpage); - if (cp && bdev->write_cache && pc != 0x01) + if (cp && spdk_bdev_has_write_cache(bdev) && pc != 0x01) cp[2] |= 0x4; /* WCE */ /* Read Cache Disable (RCD) = 1 */ diff --git a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c index 169dda251..79dbc6fed 100644 --- a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c +++ b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c @@ -115,6 +115,12 @@ spdk_bdev_get_max_unmap_descriptors(const struct spdk_bdev *bdev) return 1; } +bool +spdk_bdev_has_write_cache(const struct spdk_bdev *bdev) +{ + return false; +} + void spdk_scsi_lun_clear_all(struct spdk_scsi_lun *lun) {