* [Qemu-devel] [PATCH v7 1/4] block: Add zoned device model property
2019-09-07 22:38 [Qemu-devel] [PATCH v7 0/4] virtio/block: handle zoned backing devices Dmitry Fomichev
@ 2019-09-07 22:38 ` Dmitry Fomichev
2019-09-09 8:01 ` Stefano Garzarella
2019-09-07 22:38 ` [Qemu-devel] [PATCH v7 2/4] raw: Recognize zoned backing devices Dmitry Fomichev
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Dmitry Fomichev @ 2019-09-07 22:38 UTC (permalink / raw)
To: Stefano Garzarella, Paolo Bonzini, Kevin Wolf, Max Reitz,
Michael S . Tsirkin, Stefan Hajnoczi, John Snow
Cc: Dmitry Fomichev, Alistair Francis, qemu-devel, qemu-block
This commit adds Zoned Device Model (as defined in T10 ZBC and
T13 ZAC standards) as a block driver property, along with some
useful access functions.
A new backend driver permission, BLK_PERM_SUPPORT_HM_ZONED, is also
introduced. Only the drivers having this permission will be allowed
to open host managed zoned block devices.
No code is added yet to initialize or check the value of this new
property, therefore this commit doesn't change any functionality.
Signed-off-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
block.c | 37 +++++++++++++++++++++++++++----------
include/block/block.h | 21 +++++++++++++++++++--
include/block/block_int.h | 3 +++
qapi/block-core.json | 5 ++++-
4 files changed, 53 insertions(+), 13 deletions(-)
diff --git a/block.c b/block.c
index 5944124845..f0390196f2 100644
--- a/block.c
+++ b/block.c
@@ -1968,11 +1968,12 @@ char *bdrv_perm_names(uint64_t perm)
uint64_t perm;
const char *name;
} permissions[] = {
- { BLK_PERM_CONSISTENT_READ, "consistent read" },
- { BLK_PERM_WRITE, "write" },
- { BLK_PERM_WRITE_UNCHANGED, "write unchanged" },
- { BLK_PERM_RESIZE, "resize" },
- { BLK_PERM_GRAPH_MOD, "change children" },
+ { BLK_PERM_CONSISTENT_READ, "consistent read" },
+ { BLK_PERM_WRITE, "write" },
+ { BLK_PERM_WRITE_UNCHANGED, "write unchanged" },
+ { BLK_PERM_RESIZE, "resize" },
+ { BLK_PERM_GRAPH_MOD, "change children" },
+ { BLK_PERM_SUPPORT_HM_ZONED, "attach hm-zoned" },
{ 0, NULL }
};
@@ -4678,6 +4679,21 @@ void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
*nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
}
+BdrvZonedModel bdrv_get_zoned_model(BlockDriverState *bs)
+{
+ return bs->bl.zoned_model;
+}
+
+bool bdrv_is_hm_zoned(BlockDriverState *bs)
+{
+ /*
+ * Host Aware zone devices are supposed to be able to work
+ * just like regular block devices. Thus, we only consider
+ * Host Managed devices to be zoned here.
+ */
+ return bdrv_get_zoned_model(bs) == BDRV_ZONED_MODEL_HM;
+}
+
bool bdrv_is_sg(BlockDriverState *bs)
{
return bs->sg;
@@ -4871,11 +4887,12 @@ static void xdbg_graph_add_edge(XDbgBlockGraphConstructor *gr, void *parent,
} PermissionMap;
static const PermissionMap permissions[] = {
- { BLK_PERM_CONSISTENT_READ, BLOCK_PERMISSION_CONSISTENT_READ },
- { BLK_PERM_WRITE, BLOCK_PERMISSION_WRITE },
- { BLK_PERM_WRITE_UNCHANGED, BLOCK_PERMISSION_WRITE_UNCHANGED },
- { BLK_PERM_RESIZE, BLOCK_PERMISSION_RESIZE },
- { BLK_PERM_GRAPH_MOD, BLOCK_PERMISSION_GRAPH_MOD },
+ { BLK_PERM_CONSISTENT_READ, BLOCK_PERMISSION_CONSISTENT_READ },
+ { BLK_PERM_WRITE, BLOCK_PERMISSION_WRITE },
+ { BLK_PERM_WRITE_UNCHANGED, BLOCK_PERMISSION_WRITE_UNCHANGED },
+ { BLK_PERM_RESIZE, BLOCK_PERMISSION_RESIZE },
+ { BLK_PERM_GRAPH_MOD, BLOCK_PERMISSION_GRAPH_MOD },
+ { BLK_PERM_SUPPORT_HM_ZONED, BLOCK_PERMISSION_SUPPORT_HM_ZONED },
{ 0, 0 }
};
const PermissionMap *p;
diff --git a/include/block/block.h b/include/block/block.h
index 124ad40809..46cfa5bfa9 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -271,18 +271,33 @@ enum {
*/
BLK_PERM_GRAPH_MOD = 0x10,
- BLK_PERM_ALL = 0x1f,
+ /**
+ * This permission is required to open host-managed zoned block devices.
+ */
+ BLK_PERM_SUPPORT_HM_ZONED = 0x20,
+
+ BLK_PERM_ALL = 0x3f,
DEFAULT_PERM_PASSTHROUGH = BLK_PERM_CONSISTENT_READ
| BLK_PERM_WRITE
| BLK_PERM_WRITE_UNCHANGED
- | BLK_PERM_RESIZE,
+ | BLK_PERM_RESIZE
+ | BLK_PERM_SUPPORT_HM_ZONED,
DEFAULT_PERM_UNCHANGED = BLK_PERM_ALL & ~DEFAULT_PERM_PASSTHROUGH,
};
char *bdrv_perm_names(uint64_t perm);
+/*
+ * Known zoned device models.
+ */
+typedef enum {
+ BDRV_ZONED_MODEL_NONE, /* Regular block device */
+ BDRV_ZONED_MODEL_HA, /* Host-aware zoned block device */
+ BDRV_ZONED_MODEL_HM, /* Host-managed zoned block device */
+} BdrvZonedModel;
+
/* disk I/O throttling */
void bdrv_init(void);
void bdrv_init_with_whitelist(void);
@@ -359,6 +374,8 @@ int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
BlockMeasureInfo *bdrv_measure(BlockDriver *drv, QemuOpts *opts,
BlockDriverState *in_bs, Error **errp);
void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
+BdrvZonedModel bdrv_get_zoned_model(BlockDriverState *bs);
+bool bdrv_is_hm_zoned(BlockDriverState *bs);
void bdrv_refresh_limits(BlockDriverState *bs, Error **errp);
int bdrv_commit(BlockDriverState *bs);
int bdrv_change_backing_file(BlockDriverState *bs,
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 0422acdf1c..928cbae9a5 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -635,6 +635,9 @@ typedef struct BlockLimits {
/* maximum number of iovec elements */
int max_iov;
+
+ /* Zoned device model. Zero value indicates a regular block device */
+ BdrvZonedModel zoned_model;
} BlockLimits;
typedef struct BdrvOpBlocker BdrvOpBlocker;
diff --git a/qapi/block-core.json b/qapi/block-core.json
index e6edd641f1..860a8e16e5 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -1803,11 +1803,14 @@
# @graph-mod: This permission is required to change the node that this
# BdrvChild points to.
#
+# @support-hm-zoned: This permission is required to attach host-managed
+# zoned devices.
+#
# Since: 4.0
##
{ 'enum': 'BlockPermission',
'data': [ 'consistent-read', 'write', 'write-unchanged', 'resize',
- 'graph-mod' ] }
+ 'graph-mod', 'support-hm-zoned' ] }
##
# @XDbgBlockGraphEdge:
#
--
2.21.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v7 1/4] block: Add zoned device model property
2019-09-07 22:38 ` [Qemu-devel] [PATCH v7 1/4] block: Add zoned device model property Dmitry Fomichev
@ 2019-09-09 8:01 ` Stefano Garzarella
0 siblings, 0 replies; 6+ messages in thread
From: Stefano Garzarella @ 2019-09-09 8:01 UTC (permalink / raw)
To: Dmitry Fomichev
Cc: Kevin Wolf, qemu-block, Michael S . Tsirkin, qemu-devel,
Max Reitz, Alistair Francis, Stefan Hajnoczi, Paolo Bonzini,
John Snow
On Sat, Sep 07, 2019 at 06:38:38PM -0400, Dmitry Fomichev wrote:
> This commit adds Zoned Device Model (as defined in T10 ZBC and
> T13 ZAC standards) as a block driver property, along with some
> useful access functions.
>
> A new backend driver permission, BLK_PERM_SUPPORT_HM_ZONED, is also
> introduced. Only the drivers having this permission will be allowed
> to open host managed zoned block devices.
>
> No code is added yet to initialize or check the value of this new
> property, therefore this commit doesn't change any functionality.
>
> Signed-off-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> block.c | 37 +++++++++++++++++++++++++++----------
> include/block/block.h | 21 +++++++++++++++++++--
> include/block/block_int.h | 3 +++
> qapi/block-core.json | 5 ++++-
> 4 files changed, 53 insertions(+), 13 deletions(-)
>
Acked-by: Stefano Garzarella <sgarzare@redhat.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v7 2/4] raw: Recognize zoned backing devices
2019-09-07 22:38 [Qemu-devel] [PATCH v7 0/4] virtio/block: handle zoned backing devices Dmitry Fomichev
2019-09-07 22:38 ` [Qemu-devel] [PATCH v7 1/4] block: Add zoned device model property Dmitry Fomichev
@ 2019-09-07 22:38 ` Dmitry Fomichev
2019-09-07 22:38 ` [Qemu-devel] [PATCH v7 3/4] block/ide/scsi: Set BLK_PERM_SUPPORT_HM_ZONED Dmitry Fomichev
2019-09-07 22:38 ` [Qemu-devel] [PATCH v7 4/4] raw: Don't open ZBDs if backend can't handle them Dmitry Fomichev
3 siblings, 0 replies; 6+ messages in thread
From: Dmitry Fomichev @ 2019-09-07 22:38 UTC (permalink / raw)
To: Stefano Garzarella, Paolo Bonzini, Kevin Wolf, Max Reitz,
Michael S . Tsirkin, Stefan Hajnoczi, John Snow
Cc: Dmitry Fomichev, Alistair Francis, qemu-devel, qemu-block
The purpose of this patch is to recognize a zoned block device (ZBD)
when it is opened as a raw file. The new code initializes the zoned
model propery introduced by the previous commit.
This commit is Linux-specific as it gets the Zoned Block Device Model
value (none/host-managed/host-aware) from sysfs on the host.
In order to avoid code duplication in file-posix.c, a common helper
function is added to read values of sysfs entries under
/sys/block/<dev>/queue. This way, the existing function that reads
the value of "max_segments" entry and the the new function that reads
"zoned" value both share the same helper code.
Signed-off-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
block/file-posix.c | 75 ++++++++++++++++++++++++++++++++++++++--------
block/io.c | 5 ++++
2 files changed, 67 insertions(+), 13 deletions(-)
diff --git a/block/file-posix.c b/block/file-posix.c
index 71f168ee2f..caacb21f07 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -1067,15 +1067,13 @@ static int sg_get_max_transfer_length(int fd)
#endif
}
-static int sg_get_max_segments(int fd)
+static int hdev_read_blk_queue_entry(int fd, const char *key,
+ char *buf, int buf_len)
{
#ifdef CONFIG_LINUX
- char buf[32];
- const char *end;
char *sysfspath = NULL;
int ret;
int sysfd = -1;
- long max_segments;
struct stat st;
if (fstat(fd, &st)) {
@@ -1083,23 +1081,45 @@ static int sg_get_max_segments(int fd)
goto out;
}
- sysfspath = g_strdup_printf("/sys/dev/block/%u:%u/queue/max_segments",
- major(st.st_rdev), minor(st.st_rdev));
+ sysfspath = g_strdup_printf("/sys/dev/block/%u:%u/queue/%s",
+ major(st.st_rdev), minor(st.st_rdev), key);
sysfd = open(sysfspath, O_RDONLY);
if (sysfd == -1) {
ret = -errno;
goto out;
}
do {
- ret = read(sysfd, buf, sizeof(buf) - 1);
+ ret = read(sysfd, buf, buf_len - 1);
} while (ret == -1 && errno == EINTR);
if (ret < 0) {
ret = -errno;
- goto out;
} else if (ret == 0) {
ret = -EIO;
+ }
+out:
+ if (sysfd != -1) {
+ close(sysfd);
+ }
+ g_free(sysfspath);
+ return ret;
+#else
+ return -ENOTSUP;
+#endif
+}
+
+static int sg_get_max_segments(int fd)
+{
+#ifdef CONFIG_LINUX
+ char buf[32];
+ const char *end;
+ int ret;
+ long max_segments;
+
+ ret = hdev_read_blk_queue_entry(fd, "max_segments", buf, sizeof(buf));
+ if (ret < 0) {
goto out;
}
+
buf[ret] = 0;
/* The file is ended with '\n', pass 'end' to accept that. */
ret = qemu_strtol(buf, &end, 10, &max_segments);
@@ -1108,22 +1128,45 @@ static int sg_get_max_segments(int fd)
}
out:
- if (sysfd != -1) {
- close(sysfd);
- }
- g_free(sysfspath);
return ret;
#else
return -ENOTSUP;
#endif
}
+static BdrvZonedModel hdev_get_zoned_model(int fd)
+{
+#ifdef CONFIG_LINUX
+ char buf[32];
+ BdrvZonedModel zm = BDRV_ZONED_MODEL_NONE;
+ int ret;
+
+ ret = hdev_read_blk_queue_entry(fd, "zoned", buf, sizeof(buf));
+ if (ret < 0) {
+ goto out;
+ }
+
+ buf[ret - 1] = '\0'; /* replace the newline character with NULL */
+ if (strcmp(buf, "host-managed") == 0) {
+ zm = BDRV_ZONED_MODEL_HM;
+ } else if (strcmp(buf, "host-aware") == 0) {
+ zm = BDRV_ZONED_MODEL_HA;
+ }
+
+out:
+ return zm;
+#else
+ return BDRV_ZONED_MODEL_NONE;
+#endif
+}
+
static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
{
BDRVRawState *s = bs->opaque;
+ int ret;
if (bs->sg) {
- int ret = sg_get_max_transfer_length(s->fd);
+ ret = sg_get_max_transfer_length(s->fd);
if (ret > 0 && ret <= BDRV_REQUEST_MAX_BYTES) {
bs->bl.max_transfer = pow2floor(ret);
@@ -1133,6 +1176,12 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
if (ret > 0) {
bs->bl.max_transfer = MIN(bs->bl.max_transfer, ret * getpagesize());
}
+
+ }
+
+ ret = hdev_get_zoned_model(s->fd);
+ if (ret >= 0) {
+ bs->bl.zoned_model = ret;
}
raw_probe_alignment(bs, s->fd, errp);
diff --git a/block/io.c b/block/io.c
index 0fa10831ed..147c320061 100644
--- a/block/io.c
+++ b/block/io.c
@@ -157,6 +157,11 @@ void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
return;
}
bdrv_merge_limits(&bs->bl, &bs->file->bs->bl);
+
+ /* Propagate zoned model */
+ if (!bs->probed) {
+ bs->bl.zoned_model = bs->file->bs->bl.zoned_model;
+ }
} else {
bs->bl.min_mem_alignment = 512;
bs->bl.opt_mem_alignment = getpagesize();
--
2.21.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v7 3/4] block/ide/scsi: Set BLK_PERM_SUPPORT_HM_ZONED
2019-09-07 22:38 [Qemu-devel] [PATCH v7 0/4] virtio/block: handle zoned backing devices Dmitry Fomichev
2019-09-07 22:38 ` [Qemu-devel] [PATCH v7 1/4] block: Add zoned device model property Dmitry Fomichev
2019-09-07 22:38 ` [Qemu-devel] [PATCH v7 2/4] raw: Recognize zoned backing devices Dmitry Fomichev
@ 2019-09-07 22:38 ` Dmitry Fomichev
2019-09-07 22:38 ` [Qemu-devel] [PATCH v7 4/4] raw: Don't open ZBDs if backend can't handle them Dmitry Fomichev
3 siblings, 0 replies; 6+ messages in thread
From: Dmitry Fomichev @ 2019-09-07 22:38 UTC (permalink / raw)
To: Stefano Garzarella, Paolo Bonzini, Kevin Wolf, Max Reitz,
Michael S . Tsirkin, Stefan Hajnoczi, John Snow
Cc: Dmitry Fomichev, Alistair Francis, qemu-devel, qemu-block
Added a new boolean argument to blkconf_apply_backend_options()
to let the common block code know whether the chosen block
backend can handle host managed zoned block devices.
blkconf_apply_backend_options() then sets BLK_PERM_SUPPORT_HM_ZONED
permission accordingly. The raw code can then use this permission
to allow or deny opening a zone device by a particular block driver.
Signed-off-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
Acked-by: Paul Durrant <paul.durrant@citrix.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
hw/block/block.c | 6 +++++-
hw/block/fdc.c | 5 +++--
hw/block/nvme.c | 2 +-
hw/block/virtio-blk.c | 2 +-
hw/block/xen-block.c | 2 +-
hw/ide/qdev.c | 2 +-
hw/scsi/scsi-disk.c | 13 +++++++------
hw/scsi/scsi-generic.c | 2 +-
hw/usb/dev-storage.c | 2 +-
include/hw/block/block.h | 3 ++-
10 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/hw/block/block.c b/hw/block/block.c
index bf56c7612b..1c6019eee7 100644
--- a/hw/block/block.c
+++ b/hw/block/block.c
@@ -86,7 +86,8 @@ void blkconf_blocksizes(BlockConf *conf)
}
bool blkconf_apply_backend_options(BlockConf *conf, bool readonly,
- bool resizable, Error **errp)
+ bool resizable, bool zoned_support,
+ Error **errp)
{
BlockBackend *blk = conf->blk;
BlockdevOnError rerror, werror;
@@ -98,6 +99,9 @@ bool blkconf_apply_backend_options(BlockConf *conf, bool readonly,
if (!readonly) {
perm |= BLK_PERM_WRITE;
}
+ if (zoned_support) {
+ perm |= BLK_PERM_SUPPORT_HM_ZONED;
+ }
shared_perm = BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED |
BLK_PERM_GRAPH_MOD;
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index ac5d31e8c1..673a8b39bc 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -477,7 +477,7 @@ static void fd_change_cb(void *opaque, bool load, Error **errp)
} else {
if (!blkconf_apply_backend_options(drive->conf,
blk_is_read_only(drive->blk), false,
- errp)) {
+ false, errp)) {
return;
}
}
@@ -569,7 +569,8 @@ static void floppy_drive_realize(DeviceState *qdev, Error **errp)
dev->conf.rerror = BLOCKDEV_ON_ERROR_AUTO;
dev->conf.werror = BLOCKDEV_ON_ERROR_AUTO;
- if (!blkconf_apply_backend_options(&dev->conf, read_only, false, errp)) {
+ if (!blkconf_apply_backend_options(&dev->conf, read_only, false, false,
+ errp)) {
return;
}
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index 12d8254250..07f08d0768 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -1334,7 +1334,7 @@ static void nvme_realize(PCIDevice *pci_dev, Error **errp)
}
blkconf_blocksizes(&n->conf);
if (!blkconf_apply_backend_options(&n->conf, blk_is_read_only(n->conf.blk),
- false, errp)) {
+ false, false, errp)) {
return;
}
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index 18851601cb..8be62903e2 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -1127,7 +1127,7 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
if (!blkconf_apply_backend_options(&conf->conf,
blk_is_read_only(conf->conf.blk), true,
- errp)) {
+ false, errp)) {
return;
}
s->original_wce = blk_enable_write_cache(conf->conf.blk);
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index f77343db60..57fe970908 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -229,7 +229,7 @@ static void xen_block_realize(XenDevice *xendev, Error **errp)
}
if (!blkconf_apply_backend_options(conf, blockdev->info & VDISK_READONLY,
- true, errp)) {
+ true, false, errp)) {
return;
}
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 6fba6b62b8..a57a8f1a8f 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -200,7 +200,7 @@ static void ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind, Error **errp)
}
}
if (!blkconf_apply_backend_options(&dev->conf, kind == IDE_CD,
- kind != IDE_CD, errp)) {
+ kind != IDE_CD, false, errp)) {
return;
}
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
index 915641a0f1..8a57caafd7 100644
--- a/hw/scsi/scsi-disk.c
+++ b/hw/scsi/scsi-disk.c
@@ -2318,7 +2318,7 @@ static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
}
}
-static void scsi_realize(SCSIDevice *dev, Error **errp)
+static void scsi_realize(SCSIDevice *dev, bool zoned_support, Error **errp)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
bool read_only;
@@ -2362,7 +2362,8 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
}
if (!blkconf_apply_backend_options(&dev->conf, read_only,
- dev->type == TYPE_DISK, errp)) {
+ dev->type == TYPE_DISK, zoned_support,
+ errp)) {
return;
}
@@ -2421,7 +2422,7 @@ static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
if (!s->product) {
s->product = g_strdup("QEMU HARDDISK");
}
- scsi_realize(&s->qdev, errp);
+ scsi_realize(&s->qdev, false, errp);
if (ctx) {
aio_context_release(ctx);
}
@@ -2449,7 +2450,7 @@ static void scsi_cd_realize(SCSIDevice *dev, Error **errp)
if (!s->product) {
s->product = g_strdup("QEMU CD-ROM");
}
- scsi_realize(&s->qdev, errp);
+ scsi_realize(&s->qdev, false, errp);
aio_context_release(ctx);
}
@@ -2459,7 +2460,7 @@ static void scsi_disk_realize(SCSIDevice *dev, Error **errp)
Error *local_err = NULL;
if (!dev->conf.blk) {
- scsi_realize(dev, &local_err);
+ scsi_realize(dev, false, &local_err);
assert(local_err);
error_propagate(errp, local_err);
return;
@@ -2652,7 +2653,7 @@ static void scsi_block_realize(SCSIDevice *dev, Error **errp)
*/
s->features |= (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS);
- scsi_realize(&s->qdev, errp);
+ scsi_realize(&s->qdev, true, errp);
scsi_generic_read_device_inquiry(&s->qdev);
out:
diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
index e7798ebcd0..ccce710497 100644
--- a/hw/scsi/scsi-generic.c
+++ b/hw/scsi/scsi-generic.c
@@ -692,7 +692,7 @@ static void scsi_generic_realize(SCSIDevice *s, Error **errp)
}
if (!blkconf_apply_backend_options(&s->conf,
blk_is_read_only(s->conf.blk),
- true, errp)) {
+ true, true, errp)) {
return;
}
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index 8545193488..c75c0dd6a5 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -603,7 +603,7 @@ static void usb_msd_storage_realize(USBDevice *dev, Error **errp)
blkconf_blocksizes(&s->conf);
if (!blkconf_apply_backend_options(&s->conf, blk_is_read_only(blk), true,
- errp)) {
+ false, errp)) {
return;
}
diff --git a/include/hw/block/block.h b/include/hw/block/block.h
index 607539057a..f988edc87e 100644
--- a/include/hw/block/block.h
+++ b/include/hw/block/block.h
@@ -85,7 +85,8 @@ bool blkconf_geometry(BlockConf *conf, int *trans,
Error **errp);
void blkconf_blocksizes(BlockConf *conf);
bool blkconf_apply_backend_options(BlockConf *conf, bool readonly,
- bool resizable, Error **errp);
+ bool resizable, bool zoned_support,
+ Error **errp);
/* Hard disk geometry */
--
2.21.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v7 4/4] raw: Don't open ZBDs if backend can't handle them
2019-09-07 22:38 [Qemu-devel] [PATCH v7 0/4] virtio/block: handle zoned backing devices Dmitry Fomichev
` (2 preceding siblings ...)
2019-09-07 22:38 ` [Qemu-devel] [PATCH v7 3/4] block/ide/scsi: Set BLK_PERM_SUPPORT_HM_ZONED Dmitry Fomichev
@ 2019-09-07 22:38 ` Dmitry Fomichev
3 siblings, 0 replies; 6+ messages in thread
From: Dmitry Fomichev @ 2019-09-07 22:38 UTC (permalink / raw)
To: Stefano Garzarella, Paolo Bonzini, Kevin Wolf, Max Reitz,
Michael S . Tsirkin, Stefan Hajnoczi, John Snow
Cc: Dmitry Fomichev, Alistair Francis, qemu-devel, qemu-block
Abort opening a zoned device as a raw file in case the chosen
block backend driver lacks proper support for this type of
storage.
Signed-off-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
block/file-posix.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/block/file-posix.c b/block/file-posix.c
index caacb21f07..3de371a97d 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -2934,6 +2934,20 @@ static int raw_check_perm(BlockDriverState *bs, uint64_t perm, uint64_t shared,
goto fail;
}
}
+
+ /*
+ * If we are opening a zoned block device, check if the backend
+ * driver can properly handle host-managed devices, abort if not.
+ */
+ if (bdrv_is_hm_zoned(bs) &&
+ !(shared & BLK_PERM_SUPPORT_HM_ZONED) &&
+ !(perm & BLK_PERM_SUPPORT_HM_ZONED)) {
+ error_setg(errp,
+ "block backend driver doesn't support host-managed zoned devices");
+ ret = -ENOTSUP;
+ goto fail;
+ }
+
return 0;
fail:
--
2.21.0
^ permalink raw reply related [flat|nested] 6+ messages in thread