From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: Jinhua Cao <caojinhua1@huawei.com>,
qemu-devel@nongnu.org, qemu-block@nongnu.org
Cc: jsnow@redhat.com, kwolf@redhat.com, mreitz@redhat.com,
eric.fangyi@huawei.com
Subject: Re: [RFC] block/mirror: fix file-system went to read-only after block-mirror
Date: Mon, 5 Jul 2021 14:36:04 +0300 [thread overview]
Message-ID: <02ebaaf7-5ce8-992b-46c7-d4f62c68182c@virtuozzo.com> (raw)
In-Reply-To: <20210624120635.54573-1-caojinhua1@huawei.com>
24.06.2021 15:06, Jinhua Cao wrote:
> 1) Configure the VM disk as prdm.
> ...
> <disk type='block' device='lun'>
> <driver name='qemu' type='raw' cache='none'/>
> <source dev='/dev/disk/by-id/scsi-368886030000000ca50c1cd1563996917' index='1'/>
> <backingStore/>
> <target dev='sdb' bus='scsi'/>
> <alias name='scsi0-0-0-1'/>
> <address type='drive' controller='0' bus='0' target='0' unit='1'/>
> </disk>
> ...
> Mount the disk in guest and keep the disk writing data continuously during block-mirror,
> the file-system went to read-only after block-mirror.
>
> 2) This commit 6cdbceb12cf[mirror: Add filter-node-name to blockdev-mirror] introduces
> mirror_top_bs which does not set default function for mirror_top_bs->drv->bdrv_co_ioctl.
>
> 3) The function bdrv_co_ioctl in block/io.c will be called during block-mirror, in this
> function, the judgment is as follow:
> ---
> if (!drv || (!drv->bdrv_aio_ioctl && !drv->bdrv_co_ioctl)) {
> co.ret = -ENOTSUP;
> goto out;
> }
> ---
> The mirror_top_bs does not set drv->bdrv_aio_ioctl or drv->bdrv_co_ioctl which result this
> return -ENOTSUP. So the file-system went to read-only after block-mirror.
>
> 4) This patch set a default function for mirror_top_bs->drv->bdrv_aio_ioctl, fix this problem.
> ---
> block/mirror.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/block/mirror.c b/block/mirror.c
> index 019f6deaa5..63b788ec39 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -1480,6 +1480,12 @@ static int coroutine_fn bdrv_mirror_top_flush(BlockDriverState *bs)
> return bdrv_co_flush(bs->backing->bs);
> }
>
> +static int coroutine_fn bdrv_mirror_top_ioctl(BlockDriverState *bs,
> + unsigned long int req, void *buf)
> +{
> + return 0;
> +}
I'm not very familiar with .bdrv_co_ioctl kitchen in Qemu, but intuitively this seems wrong to me: you do nothing and report success in this handler.
So, probably more correct would be at least call bdrv_co_ioctl() on bs->backing->bs, which is filtered child of mirror_top.
This raise another question: what exactly this ioctl does? If it changes the device like write operation, we should somehow handle it to update dirty bitmap, otherwise mirror will not work correctly. In this way, it seems correctly to not implement .bdrv_co_ioctl in mirror_top, and keep it returning ENOTSUP, as we really can't support it..
> +
> static int coroutine_fn bdrv_mirror_top_pwrite_zeroes(BlockDriverState *bs,
> int64_t offset, int bytes, BdrvRequestFlags flags)
> {
> @@ -1555,6 +1561,7 @@ static BlockDriver bdrv_mirror_top = {
> .bdrv_co_pwrite_zeroes = bdrv_mirror_top_pwrite_zeroes,
> .bdrv_co_pdiscard = bdrv_mirror_top_pdiscard,
> .bdrv_co_flush = bdrv_mirror_top_flush,
> + .bdrv_co_ioctl = bdrv_mirror_top_ioctl,
> .bdrv_refresh_filename = bdrv_mirror_top_refresh_filename,
> .bdrv_child_perm = bdrv_mirror_top_child_perm,
>
>
--
Best regards,
Vladimir
prev parent reply other threads:[~2021-07-05 11:37 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-24 12:06 [RFC] block/mirror: fix file-system went to read-only after block-mirror Jinhua Cao
2021-06-24 13:30 ` no-reply
2021-07-05 11:36 ` Vladimir Sementsov-Ogievskiy [this message]
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=02ebaaf7-5ce8-992b-46c7-d4f62c68182c@virtuozzo.com \
--to=vsementsov@virtuozzo.com \
--cc=caojinhua1@huawei.com \
--cc=eric.fangyi@huawei.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).