Sam Li <faithilike...@gmail.com> writes: > Markus Armbruster <arm...@redhat.com> 于2022年8月30日周二 19:57写道: >> >> Sam Li <faithilike...@gmail.com> writes: >> >> > By adding zone management operations in BlockDriver, storage controller >> > emulation can use the new block layer APIs including Report Zone and >> > four zone management operations (open, close, finish, reset). >> > >> > Add zoned storage commands of the device: zone_report(zrp), zone_open(zo), >> > zone_close(zc), zone_reset(zrs), zone_finish(zf). >> > >> > For example, to test zone_report, use following command: >> > $ ./build/qemu-io --image-opts driver=zoned_host_device, >> > filename=/dev/nullb0 >> > -c "zrp offset nr_zones" >> > >> > Signed-off-by: Sam Li <faithilike...@gmail.com> >> > Reviewed-by: Hannes Reinecke <h...@suse.de> >> >> [...] >> >> > diff --git a/block/file-posix.c b/block/file-posix.c >> > index 0a8b4b426e..e3efba6db7 100644 >> > --- a/block/file-posix.c >> > +++ b/block/file-posix.c >> >> [...] >> >> > @@ -3752,6 +4025,54 @@ static BlockDriver bdrv_host_device = { >> > #endif >> > }; >> > >> > +#if defined(CONFIG_BLKZONED) >> > +static BlockDriver bdrv_zoned_host_device = { >> > + .format_name = "zoned_host_device", >> >> Indentation should be 4, not 8. >> >> > + .protocol_name = "zoned_host_device", >> > + .instance_size = sizeof(BDRVRawState), >> > + .bdrv_needs_filename = true, >> > + .bdrv_probe_device = hdev_probe_device, >> > + .bdrv_file_open = hdev_open, >> > + .bdrv_close = raw_close, >> > + .bdrv_reopen_prepare = raw_reopen_prepare, >> > + .bdrv_reopen_commit = raw_reopen_commit, >> > + .bdrv_reopen_abort = raw_reopen_abort, >> > + .bdrv_co_create_opts = bdrv_co_create_opts_simple, >> > + .create_opts = &bdrv_create_opts_simple, >> > + .mutable_opts = mutable_opts, >> > + .bdrv_co_invalidate_cache = raw_co_invalidate_cache, >> > + .bdrv_co_pwrite_zeroes = hdev_co_pwrite_zeroes, >> > + >> > + .bdrv_co_preadv = raw_co_preadv, >> > + .bdrv_co_pwritev = raw_co_pwritev, >> > + .bdrv_co_flush_to_disk = raw_co_flush_to_disk, >> > + .bdrv_co_pdiscard = hdev_co_pdiscard, >> > + .bdrv_co_copy_range_from = raw_co_copy_range_from, >> > + .bdrv_co_copy_range_to = raw_co_copy_range_to, >> > + .bdrv_refresh_limits = raw_refresh_limits, >> > + .bdrv_io_plug = raw_aio_plug, >> > + .bdrv_io_unplug = raw_aio_unplug, >> > + .bdrv_attach_aio_context = raw_aio_attach_aio_context, >> > + >> > + .bdrv_co_truncate = raw_co_truncate, >> > + .bdrv_getlength = raw_getlength, >> > + .bdrv_get_info = raw_get_info, >> > + .bdrv_get_allocated_file_size >> > + = raw_get_allocated_file_size, >> > + .bdrv_get_specific_stats = hdev_get_specific_stats, >> > + .bdrv_check_perm = raw_check_perm, >> > + .bdrv_set_perm = raw_set_perm, >> > + .bdrv_abort_perm_update = raw_abort_perm_update, >> > + .bdrv_probe_blocksizes = hdev_probe_blocksizes, >> > + .bdrv_probe_geometry = hdev_probe_geometry, >> > + .bdrv_co_ioctl = hdev_co_ioctl, >> > + >> > + /* zone management operations */ >> > + .bdrv_co_zone_report = raw_co_zone_report, >> > + .bdrv_co_zone_mgmt = raw_co_zone_mgmt, >> > +}; >> >> Differences to bdrv_host_device: >> >> * .bdrv_parse_filename is not set >> >> * .bdrv_co_ioctl is not set >> >> * .bdrv_co_zone_report and .bdrv_co_zone_mgmt are set > > As Stefan mentioned, zoned_host_device is a new driver that doesn't > work with string filenames. .bdrv_parse_filename() helps legacy > drivers strip the optional protocol prefix off the filename and no use > here. Therefore it can be dropped.
Makes sense. > .bdrv_co_ioctl is set actually. You're right; I diffed the two and misread the result. > Zoned_host_device is basically host_device + zone operations. It > serves for a simple purpose: if the host device is zoned, register > zoned_host_device driver; else, register host_device. Why would I ever want to use host_device instead of zoned_host_device? To answer this question, we need to understand how their behavior differs. We can ignore the legacy protocol prefix / string filename part. All that's left seems to be "if the host device is zoned, then using the zoned_host_device driver gets you the zoned features, whereas using the host_device driver doesn't". What am I missing? >> Notably common is .bdrv_file_open = hdev_open. What happens when you >> try to create a zoned_host_device where the @filename argument is not in >> fact a zoned device? > > If the device is a regular block device, QEMU will still open the > device. For instance, I use a loopback device to test zone_report in > qemu-io. It returns ENOTTY which indicates Inappropriate ioctl for the > device. Meanwhile, if using a regular block device when emulation a > zoned device on a guest os, the best case is that the guest can boot > but has no emulated block device. In some cases, QEMU just terminates > because the block device has not met the alignment requirements. I'm not sure I understand all of this. I'm also not sure I have to :) >> Do we really need a separate, but almost identical BlockDriver? Could >> the existing one provide zoned functionality exactly when the underlying >> host device does? > > I did use the existing one host device to add zoned commands at first. > But then, we decided to change that and use a separate BlockDriver. > Though the existing one can provide zoned functionality, a new > BlockDriver makes it clear when mixing block drivers, adding more > configurations/constraints, etc. For example, zoned devices must > enforce direct I/O instead of using page cache to ensure the order of > writes. It would be good to print a message for users when using > zoned_host_device without setting direct I/O. > > However, it's still a simple version I was thinking about and can be > improved/changed afterward. Using host_device only is possible I think > but needs more carefully thinking. I'm not opposed to making this a separate driver. But the case for it should be made in the commit message. Discussing it in review is a fine way to get to a better commit message, of course. > Maybe Damien and Stefan can talk more about this? > >> >> Forgive me if these are ignorant questions, or have been discussed >> before. > > Always a pleasure. Thanks! [...]