From: Supriya Kannery <supriyak@linux.vnet.ibm.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: Stefan Hajnoczi <stefanha@gmail.com>,
qemu-devel@nongnu.org, Christoph Hellwig <hch@lst.de>
Subject: Re: [Qemu-devel] [v7 Patch 5/5]Qemu: New struct 'BDRVReopenState' for image files reopen
Date: Fri, 14 Oct 2011 19:12:41 +0530 [thread overview]
Message-ID: <4E983C51.8010008@linux.vnet.ibm.com> (raw)
In-Reply-To: <4E95AA53.8050901@redhat.com>
On 10/12/2011 08:25 PM, Kevin Wolf wrote:
> Am 11.10.2011 05:11, schrieb Supriya Kannery:
>> Struct BDRVReopenState introduced for handling reopen state of images.
>> This can be extended by each of the block drivers to reopen respective
>> image files. Implementation for raw-posix is done here.
>>
>> Signed-off-by: Supriya Kannery<supriyak@linux.vnet.ibm.com>
>
> Maybe it would make sense to split this into two patches, one for the
> block.c infrastructure and another one for adding the callbacks in drivers.
>
ok..will split in v8.
>> +
>> + /* If only O_DIRECT to be toggled, use fcntl */
>> + if (!((bs->open_flags& ~BDRV_O_NOCACHE) ^
>> + (flags& ~BDRV_O_NOCACHE))) {
>> + raw_rs->reopen_fd = dup(s->fd);
>> + if (raw_rs->reopen_fd<= 0) {
>> + return -1;
>
> This leaks raw_rs.
>
will handle
>> + }
>> + }
>> +
>> + /* TBD: Handle O_DSYNC and other flags */
>> + *rs = raw_rs;
>> + return 0;
>> +}
>> +
>> +static int raw_reopen_commit(BDRVReopenState *rs)
>
> bdrv_reopen_commit must never fail. Any error that can happen must
> already be handled in bdrv_reopen_prepare.
>
> The commit function should really only do s->fd = rs->reopen_fd (besides
> cleanup), everything else should already be prepared.
>
will move call to fcntl to bdrv_reopen_prepare.
>> +{
>> + BlockDriverState *bs = rs->bs;
>> + BDRVRawState *s = bs->opaque;
>> +
>> + if (!rs->reopen_fd) {
>> + return -1;
>> + }
>> +
>> + int ret = fcntl_setfl(rs->reopen_fd, rs->reopen_flags);
>
> reopen_flags is BDRV_O_*, not O_*, so it needs to be translated.
>
ok
>> + /* Use driver specific reopen() if available */
>> + if (drv->bdrv_reopen_prepare) {
>> + ret = drv->bdrv_reopen_prepare(bs,&rs, bdrv_flags);
>> if (ret< 0) {
>> - /* Reopen failed with orig and modified flags */
>> - abort();
>> + goto fail;
>> }
>> - }
>> + if (drv->bdrv_reopen_commit) {
>> + ret = drv->bdrv_reopen_commit(rs);
>> + if (ret< 0) {
>> + goto fail;
>> + }
>> + return 0;
>> + }
>
> Pull the return 0; out one level. It would be really strange if we
> turned a successful prepare into reopen_abort just because the driver
> doesn't need a commit function.
>
> (The other consistent way would be to require that if a driver
> implements one reopen function, it has to implement all three of them.
> I'm fine either way.)
>
Will give flexibility to drivers, not mandating all the three functions.
>> + ret = bdrv_open(bs, bs->filename, open_flags, drv);
>> + if (ret< 0) {
>> + /*
>> + * Reopen with orig and modified flags failed
>> + */
>> + abort();
>
> Make this bs->drv = NULL, so that trying to access to image will fail,
> but at least not the whole VM crashes.
>
ok
>> static int raw_read(BlockDriverState *bs, int64_t sector_num,
>> uint8_t *buf, int nb_sectors)
>> {
>> @@ -128,6 +137,8 @@ static BlockDriver bdrv_raw = {
>> .instance_size = 1,
>>
>> .bdrv_open = raw_open,
>> + .bdrv_reopen_prepare
>> + = raw_reopen,
>> .bdrv_close = raw_close,
>> .bdrv_read = raw_read,
>> .bdrv_write = raw_write,
>
> I think raw must pass through all three functions. Otherwise it could
> happen that we need to abort, but the image has already been reopened.
>
ok..got it..will have three separate functions to avoid unnecessary
dependencies.
Got a question..
In raw-posix, the three functions are implemented for file_reopen
for now. Should this be extended to hdev, cdrom and floppy?
> Kevin
>
next prev parent reply other threads:[~2011-10-14 13:43 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-11 3:10 [Qemu-devel] [v7 Patch 0/5]Qemu: Host pagecache setting from cmdline and monitor Supriya Kannery
2011-10-11 3:10 ` [Qemu-devel] [v7 Patch 1/5]Qemu: Enhance "info block" to display host cache setting Supriya Kannery
2011-10-12 14:17 ` Kevin Wolf
2011-10-14 10:47 ` Supriya Kannery
2011-10-11 3:11 ` [Qemu-devel] [v7 Patch 2/5]Qemu: Error classes for file reopen and data sync failure Supriya Kannery
2011-10-11 3:11 ` [Qemu-devel] [v7 Patch 3/5]Qemu: Cmd "block_set_hostcache" for dynamic cache change Supriya Kannery
2011-10-11 3:11 ` [Qemu-devel] [v7 Patch 4/5]Qemu: Add commandline -drive option 'hostcache' Supriya Kannery
2011-10-12 14:30 ` Kevin Wolf
2011-10-14 11:19 ` Supriya Kannery
2011-10-14 11:26 ` Kevin Wolf
2011-10-11 3:11 ` [Qemu-devel] [v7 Patch 5/5]Qemu: New struct 'BDRVReopenState' for image files reopen Supriya Kannery
2011-10-12 14:55 ` Kevin Wolf
2011-10-14 13:42 ` Supriya Kannery [this message]
2011-10-14 13:52 ` Kevin Wolf
2011-10-14 11:13 ` Stefan Hajnoczi
2011-10-14 13:45 ` Supriya Kannery
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=4E983C51.8010008@linux.vnet.ibm.com \
--to=supriyak@linux.vnet.ibm.com \
--cc=hch@lst.de \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.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.