From: Kevin Wolf <kwolf@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: mreitz@redhat.com, famz@redhat.com, qemu-devel@nongnu.org,
stefanha@redhat.com, benoit.canet@nodalink.com
Subject: Re: [Qemu-devel] [PATCH v3 14/23] hw: Convert from BlockDriverState to BlockBackend, mostly
Date: Fri, 26 Sep 2014 16:26:05 +0200 [thread overview]
Message-ID: <20140926142605.GC4068@noname.redhat.com> (raw)
In-Reply-To: <1410891148-28849-15-git-send-email-armbru@redhat.com>
Am 16.09.2014 um 20:12 hat Markus Armbruster geschrieben:
> Just four uses of BlockDriverState are left:
>
> * The Xen paravirtual block device backend (xen_disk.c) opens images
> itself when set up via xenbus, bypassing blockdev.c. I figure it
> should go through qmp_blockdev_add() instead.
>
> * Device model "usb-storage" prompts for keys. No other device model
> does, and this one probably shouldn't do it, either.
>
> * ide_issue_trim_cb() uses bdrv_aio_discard() instead of
> blk_aio_discard() because it fishes its backend out of a BlockAIOCB,
> which has only the BlockDriverState.
>
> * PC87312State has an unused BlockDriverState[] member.
>
> The next two commits take care of the latter two.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
Okay. This patch gives us a chance to have a look at each of the
functions that we'll expose in the BlockBackend layer.
> diff --git a/block/block-backend.c b/block/block-backend.c
> index 7fd832d..5f796b4 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -235,3 +235,260 @@ void blk_hide_on_behalf_of_do_drive_del(BlockBackend *blk)
> bdrv_make_anon(blk->bs);
> }
> }
> +
> +void blk_iostatus_enable(BlockBackend *blk)
> +{
> + bdrv_iostatus_enable(blk->bs);
> +}
Even at the end of the series, iostatus (i.e. rerror/werror handling) is
still at the BDS level. I think our earlier conclusion was that
it's really a BB thing, so I would expect it to be implemented in
block-backend.c with no calls into block.c.
Is this on your todo list?
> +int blk_attach_dev(BlockBackend *blk, void *dev)
> +{
> + return bdrv_attach_dev(blk->bs, dev);
> +}
> +
> +void blk_attach_dev_nofail(BlockBackend *blk, void *dev)
> +{
> + bdrv_attach_dev_nofail(blk->bs, dev);
> +}
> +
> +void blk_detach_dev(BlockBackend *blk, void *dev)
> +{
> + bdrv_detach_dev(blk->bs, dev);
> +}
> +
> +void *blk_get_attached_dev(BlockBackend *blk)
> +{
> + return bdrv_get_attached_dev(blk->bs);
> +}
> +
> +void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, void *opaque)
> +{
> + bdrv_set_dev_ops(blk->bs, ops, opaque);
> +}
At the end of the series, all of these are BB-only code. Good.
> +int blk_read(BlockBackend *blk, int64_t sector_num, uint8_t *buf,
> + int nb_sectors)
> +{
> + return bdrv_read(blk->bs, sector_num, buf, nb_sectors);
> +}
> +
> +int blk_read_unthrottled(BlockBackend *blk, int64_t sector_num, uint8_t *buf,
> + int nb_sectors)
> +{
> + return bdrv_read_unthrottled(blk->bs, sector_num, buf, nb_sectors);
> +}
This one is a hack that I'd rather see disappear. Unrelated to this
series, though.
> +int blk_write(BlockBackend *blk, int64_t sector_num, const uint8_t *buf,
> + int nb_sectors)
> +{
> + return bdrv_write(blk->bs, sector_num, buf, nb_sectors);
> +}
> +
> +BlockAIOCB *blk_aio_write_zeroes(BlockBackend *blk, int64_t sector_num,
> + int nb_sectors, BdrvRequestFlags flags,
> + BlockCompletionFunc *cb, void *opaque)
> +{
> + return bdrv_aio_write_zeroes(blk->bs, sector_num, nb_sectors, flags,
> + cb, opaque);
> +}
> +
> +int blk_pread(BlockBackend *blk, int64_t offset, void *buf, int count)
> +{
> + return bdrv_pread(blk->bs, offset, buf, count);
> +}
> +
> +int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int count)
> +{
> + return bdrv_pwrite(blk->bs, offset, buf, count);
> +}
Any particular reason for the ordering of the functions here? Is this
just how they were in block.c? I would have expected all read function
and all write functions in one place.
> +int64_t blk_getlength(BlockBackend *blk)
> +{
> + return bdrv_getlength(blk->bs);
> +}
> +
> +void blk_get_geometry(BlockBackend *blk, uint64_t *nb_sectors_ptr)
> +{
> + bdrv_get_geometry(blk->bs, nb_sectors_ptr);
> +}
> +
> +BlockAIOCB *blk_aio_readv(BlockBackend *blk, int64_t sector_num,
> + QEMUIOVector *iov, int nb_sectors,
> + BlockCompletionFunc *cb, void *opaque)
> +{
> + return bdrv_aio_readv(blk->bs, sector_num, iov, nb_sectors, cb, opaque);
> +}
> +
> +BlockAIOCB *blk_aio_writev(BlockBackend *blk, int64_t sector_num,
> + QEMUIOVector *iov, int nb_sectors,
> + BlockCompletionFunc *cb, void *opaque)
> +{
> + return bdrv_aio_writev(blk->bs, sector_num, iov, nb_sectors, cb, opaque);
> +}
> +
> +BlockAIOCB *blk_aio_flush(BlockBackend *blk,
> + BlockCompletionFunc *cb, void *opaque)
> +{
> + return bdrv_aio_flush(blk->bs, cb, opaque);
> +}
> +
> +BlockAIOCB *blk_aio_discard(BlockBackend *blk,
> + int64_t sector_num, int nb_sectors,
> + BlockCompletionFunc *cb, void *opaque)
> +{
> + return bdrv_aio_discard(blk->bs, sector_num, nb_sectors, cb, opaque);
> +}
> +
> +void blk_aio_cancel(BlockAIOCB *acb)
> +{
> + bdrv_aio_cancel(acb);
> +}
> +
> +int blk_aio_multiwrite(BlockBackend *blk, BlockRequest *reqs, int num_reqs)
> +{
> + return bdrv_aio_multiwrite(blk->bs, reqs, num_reqs);
> +}
> +
> +int blk_ioctl(BlockBackend *blk, unsigned long int req, void *buf)
> +{
> + return bdrv_ioctl(blk->bs, req, buf);
> +}
> +
> +BlockAIOCB *blk_aio_ioctl(BlockBackend *blk, unsigned long int req, void *buf,
> + BlockCompletionFunc *cb, void *opaque)
> +{
> + return bdrv_aio_ioctl(blk->bs, req, buf, cb, opaque);
> +}
> +
> +int blk_flush(BlockBackend *blk)
> +{
> + return bdrv_flush(blk->bs);
> +}
> +
> +int blk_flush_all(void)
> +{
> + return bdrv_flush_all();
> +}
> +
> +void blk_drain_all(void)
> +{
> + bdrv_drain_all();
> +}
> +BlockdevOnError blk_get_on_error(BlockBackend *blk, bool is_read)
> +{
> + return bdrv_get_on_error(blk->bs, is_read);
> +}
> +
> +BlockErrorAction blk_get_error_action(BlockBackend *blk, bool is_read,
> + int error)
> +{
> + return bdrv_get_error_action(blk->bs, is_read, error);
> +}
> +
> +void blk_error_action(BlockBackend *blk, BlockErrorAction action,
> + bool is_read, int error)
> +{
> + bdrv_error_action(blk->bs, action, is_read, error);
> +}
Like iostatus, this probably should be a BB-only thing in the end.
> +int blk_is_read_only(BlockBackend *blk)
> +{
> + return bdrv_is_read_only(blk->bs);
> +}
> +
> +int blk_is_sg(BlockBackend *blk)
> +{
> + return bdrv_is_sg(blk->bs);
> +}
> +
> +int blk_enable_write_cache(BlockBackend *blk)
> +{
> + return bdrv_enable_write_cache(blk->bs);
> +}
> +
> +void blk_set_enable_write_cache(BlockBackend *blk, bool wce)
> +{
> + bdrv_set_enable_write_cache(blk->bs, wce);
> +}
> +
> +int blk_is_inserted(BlockBackend *blk)
> +{
> + return bdrv_is_inserted(blk->bs);
> +}
> +
> +void blk_lock_medium(BlockBackend *blk, bool locked)
> +{
> + bdrv_lock_medium(blk->bs, locked);
> +}
> +
> +void blk_eject(BlockBackend *blk, bool eject_flag)
> +{
> + bdrv_eject(blk->bs, eject_flag);
> +}
> +
> +int blk_get_flags(BlockBackend *blk)
> +{
> + return bdrv_get_flags(blk->bs);
> +}
> +
> +void blk_set_guest_block_size(BlockBackend *blk, int align)
> +{
> + bdrv_set_guest_block_size(blk->bs, align);
> +}
> +
> +void *blk_blockalign(BlockBackend *blk, size_t size)
Perhaps better blk_memalign?
> +{
> + return qemu_blockalign(blk ? blk->bs : NULL, size);
> +}
> +
> +bool blk_op_is_blocked(BlockBackend *blk, BlockOpType op, Error **errp)
> +{
> + return bdrv_op_is_blocked(blk->bs, op, errp);
> +}
> +
> +void blk_op_unblock(BlockBackend *blk, BlockOpType op, Error *reason)
> +{
> + bdrv_op_unblock(blk->bs, op, reason);
> +}
> +
> +void blk_op_block_all(BlockBackend *blk, Error *reason)
> +{
> + bdrv_op_block_all(blk->bs, reason);
> +}
> +
> +void blk_op_unblock_all(BlockBackend *blk, Error *reason)
> +{
> + bdrv_op_unblock_all(blk->bs, reason);
> +}
> +
> +AioContext *blk_get_aio_context(BlockBackend *blk)
> +{
> + return bdrv_get_aio_context(blk->bs);
> +}
> +
> +void blk_set_aio_context(BlockBackend *blk, AioContext *new_context)
> +{
> + bdrv_set_aio_context(blk->bs, new_context);
> +}
> +
> +void blk_io_plug(BlockBackend *blk)
> +{
> + bdrv_io_plug(blk->bs);
> +}
> +
> +void blk_io_unplug(BlockBackend *blk)
> +{
> + bdrv_io_unplug(blk->bs);
> +}
> +
> +BlockAcctStats *blk_get_stats(BlockBackend *blk)
> +{
> + return bdrv_get_stats(blk->bs);
> +}
> +
> +void *blk_aio_get(const AIOCBInfo *aiocb_info, BlockBackend *blk,
> + BlockCompletionFunc *cb, void *opaque)
> +{
> + return qemu_aio_get(aiocb_info, blk_bs(blk), cb, opaque);
> +}
There are a few more in this list that look dubious, but this patch
series isn't the right place to discuss them.
Found nothing noteworthy in the rest of the patch, though I only
quickly scanned it, so that wasn't thorough enough for a R-b.
Kevin
next prev parent reply other threads:[~2014-09-26 15:09 UTC|newest]
Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-16 18:12 [Qemu-devel] [PATCH v3 00/23] Split BlockBackend off BDS with an axe Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 01/23] block: Split bdrv_new_root() off bdrv_new() Markus Armbruster
2014-09-18 14:44 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 02/23] block: New BlockBackend Markus Armbruster
2014-09-19 16:17 ` Kevin Wolf
2014-09-19 17:13 ` Markus Armbruster
2014-09-20 19:04 ` Max Reitz
2014-09-22 6:56 ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 03/23] block: Connect BlockBackend to BlockDriverState Markus Armbruster
2014-09-20 19:08 ` Max Reitz
2014-09-22 14:59 ` Kevin Wolf
2014-09-22 16:34 ` Markus Armbruster
2014-09-23 11:45 ` Kevin Wolf
2014-09-23 12:52 ` Markus Armbruster
2014-09-23 13:36 ` Kevin Wolf
2014-09-23 15:29 ` Markus Armbruster
2014-09-25 21:54 ` Benoît Canet
2014-09-30 10:40 ` Kevin Wolf
2014-09-30 10:56 ` Markus Armbruster
2014-09-30 11:10 ` Kevin Wolf
2014-09-30 12:03 ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 04/23] block: Connect BlockBackend and DriveInfo Markus Armbruster
2014-09-20 19:38 ` Max Reitz
2014-09-22 7:33 ` Markus Armbruster
2014-09-22 17:15 ` Kevin Wolf
2014-09-23 10:57 ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 05/23] block: Code motion to get rid of stubs/blockdev.c Markus Armbruster
2014-09-20 19:46 ` Max Reitz
2014-09-23 12:15 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 06/23] block: Make BlockBackend own its BlockDriverState Markus Armbruster
2014-09-20 20:10 ` Max Reitz
2014-09-23 13:12 ` Kevin Wolf
2014-09-23 16:24 ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 07/23] block: Eliminate bdrv_iterate(), use bdrv_next() Markus Armbruster
2014-09-20 20:29 ` Max Reitz
2014-09-25 11:25 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 08/23] block: Eliminate BlockDriverState member device_name[] Markus Armbruster
2014-09-20 20:49 ` Max Reitz
2014-09-25 11:37 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 09/23] block: Merge BlockBackend and BlockDriverState name spaces Markus Armbruster
2014-09-20 20:52 ` Max Reitz
2014-09-25 12:57 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 10/23] block: Eliminate DriveInfo member bdrv, use blk_by_legacy_dinfo() Markus Armbruster
2014-09-17 11:24 ` Benoît Canet
2014-09-18 7:11 ` Markus Armbruster
2014-09-20 21:09 ` Max Reitz
2014-09-25 13:06 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 11/23] block: Rename BlockDriverAIOCB* to BlockAIOCB* Markus Armbruster
2014-09-20 21:16 ` Max Reitz
2014-09-25 13:15 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 12/23] virtio-blk: Drop redundant VirtIOBlock member conf Markus Armbruster
2014-09-17 11:31 ` Benoît Canet
2014-09-20 21:22 ` Max Reitz
2014-09-22 7:34 ` Markus Armbruster
2014-09-25 13:18 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 13/23] virtio-blk: Rename VirtIOBlkConf variables to conf Markus Armbruster
2014-09-17 11:35 ` Benoît Canet
2014-09-18 7:17 ` Markus Armbruster
2014-09-20 21:25 ` Max Reitz
2014-09-26 13:22 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 14/23] hw: Convert from BlockDriverState to BlockBackend, mostly Markus Armbruster
2014-09-20 22:01 ` Max Reitz
2014-09-22 7:42 ` Markus Armbruster
2014-09-26 14:26 ` Kevin Wolf [this message]
2014-09-26 15:00 ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 15/23] ide: Complete conversion from BlockDriverState to BlockBackend Markus Armbruster
2014-09-20 22:05 ` Max Reitz
2014-09-29 12:07 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 16/23] pc87312: Drop unused members of PC87312State Markus Armbruster
2014-09-17 11:44 ` Benoît Canet
2014-09-20 22:07 ` Max Reitz
2014-09-29 12:08 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 17/23] blockdev: Drop superfluous DriveInfo member id Markus Armbruster
2014-09-17 11:43 ` Benoît Canet
2014-09-22 12:58 ` Max Reitz
2014-09-29 12:13 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 18/23] blockdev: Fix blockdev-add not to create IDE drive (0, 0) Markus Armbruster
2014-09-17 12:09 ` Benoît Canet
2014-09-22 13:05 ` Max Reitz
2014-09-29 12:24 ` Kevin Wolf
2014-09-29 13:05 ` Markus Armbruster
2014-09-29 15:34 ` Kevin Wolf
2014-09-30 6:21 ` Markus Armbruster
2014-09-29 13:12 ` Kevin Wolf
2014-09-29 14:04 ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 19/23] blockdev: Drop DriveInfo member enable_auto_del Markus Armbruster
2014-09-17 12:12 ` Benoît Canet
2014-09-22 13:16 ` Max Reitz
2014-09-22 15:06 ` Markus Armbruster
2014-09-22 15:12 ` Max Reitz
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 20/23] block/qapi: Convert qmp_query_block() to BlockBackend Markus Armbruster
2014-09-22 12:05 ` Benoît Canet
2014-09-22 13:22 ` Max Reitz
2014-09-29 13:26 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 21/23] blockdev: Convert qmp_eject(), qmp_change_blockdev() " Markus Armbruster
2014-09-22 12:08 ` Benoît Canet
2014-09-22 13:26 ` Max Reitz
2014-09-22 15:07 ` Markus Armbruster
2014-09-30 9:55 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 22/23] block: Lift device model API into BlockBackend Markus Armbruster
2014-09-22 12:13 ` Benoît Canet
2014-09-22 12:54 ` Markus Armbruster
2014-09-22 13:58 ` Max Reitz
2014-09-30 10:49 ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 23/23] block: Make device model's references to BlockBackend strong Markus Armbruster
2014-09-22 12:06 ` Benoît Canet
2014-09-22 14:06 ` Max Reitz
2014-09-22 15:08 ` Markus Armbruster
2014-09-30 11:01 ` Kevin Wolf
2014-09-30 12:04 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140926142605.GC4068@noname.redhat.com \
--to=kwolf@redhat.com \
--cc=armbru@redhat.com \
--cc=benoit.canet@nodalink.com \
--cc=famz@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.