From: Supriya Kannery <supriyak@linux.vnet.ibm.com>
To: supriya kannery <supriyak@in.ibm.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
Stefan Hajnoczi <stefanha@gmail.com>,
Christoph Hellwig <hch@lst.de>,
qemu-devel <qemu-devel@nongnu.org>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [RFC] Safely reopening image files by stashing fds
Date: Wed, 17 Aug 2011 00:48:55 +0530 [thread overview]
Message-ID: <4E4AC29F.7010601@linux.vnet.ibm.com> (raw)
In-Reply-To: <4E40FEBA.60001@in.ibm.com>
On 08/09/2011 03:02 PM, supriya kannery wrote:
> Kevin Wolf wrote:
>> Am 09.08.2011 11:22, schrieb supriya kannery:
>>> Kevin Wolf wrote:
>>
>> What I meant is that in the end, with a generic bdrv_reopen(), we can
>> have raw-posix only call dup() and fcntl() instead of doing a
>> close()/open() sequence if it can satisfy the new flags this way. But
>> this would be an implementation detail and not be visible in the
>> interface.
>>
>> Kevin
>
> ok
> - thanks, Supriya
>
Though I started the RFC patch with defining BDRVReopenState, ended up
in enhancing struct BlockDriver with .bdrv_reopen. bdrv_reopen
mplementation specific to respective driver is assigned to this
function pointer.
Please find the implementation of O_DIRECT flag change, done in
raw-posix.c. Similar implementation can be done for vmdk (with
bdrv_reopen_commit and bdrv_reopen_abort as internal functions in
vmdk.c for opening split files), sheepdog, nbd etc..
Request for comments on this approach.
Note: Following patch is for demonstrating the approach using
raw-posix as sample driver. This patch is not complete.
- thanks, Supriya
---
block.c | 33 +++++++++++++++++++++++----------
block/raw-posix.c | 34 ++++++++++++++++++++++++++++++++++
block_int.h | 1 +
3 files changed, 58 insertions(+), 10 deletions(-)
Index: qemu/block/raw-posix.c
===================================================================
--- qemu.orig/block/raw-posix.c
+++ qemu/block/raw-posix.c
@@ -276,6 +276,39 @@ static int raw_open(BlockDriverState *bs
return raw_open_common(bs, filename, flags, 0);
}
+static int raw_reopen(BlockDriverState *bs, int flags)
+{
+ BDRVRawState *s = bs->opaque;
+ int new_fd;
+ int ret = 0;
+
+ /* Handle request for toggling O_DIRECT */
+ if ((bs->open_flags | BDRV_O_NOCACHE) ^
+ (flags | BDRV_O_NOCACHE))
+ {
+ if ((new_fd = dup(s->fd)) <= 0) {
+ return -1;
+ }
+
+ if ((ret = fcntl_setfl(new_fd, flags)) < 0) {
+ close(new_fd);
+ return ret;
+ }
+
+ /* Set new flags, so replace old fd with new one */
+ close(s->fd);
+ s->fd = new_fd;
+ s->open_flags = flags;
+ bs->open_flags = flags;
+ }
+
+ /*
+ * TBD: handle O_DSYNC and other flags for which image
+ * file has to be reopened
+ */
+ return 0;
+}
+
/* XXX: use host sector size if necessary with:
#ifdef DIOCGSECTORSIZE
{
@@ -886,6 +919,7 @@ static BlockDriver bdrv_file = {
.instance_size = sizeof(BDRVRawState),
.bdrv_probe = NULL, /* no probe for protocols */
.bdrv_file_open = raw_open,
+ .bdrv_reopen = raw_reopen,
.bdrv_read = raw_read,
.bdrv_write = raw_write,
.bdrv_close = raw_close,
Index: qemu/block.c
===================================================================
--- qemu.orig/block.c
+++ qemu/block.c
@@ -687,20 +687,33 @@ int bdrv_reopen(BlockDriverState *bs, in
qerror_report(QERR_DATA_SYNC_FAILED, bs->device_name);
return ret;
}
- open_flags = bs->open_flags;
- bdrv_close(bs);
- ret = bdrv_open(bs, bs->filename, bdrv_flags, drv);
- if (ret < 0) {
- /* Reopen failed. Try to open with original flags */
- qerror_report(QERR_REOPEN_FILE_FAILED, bs->filename);
- ret = bdrv_open(bs, bs->filename, open_flags, drv);
+ /* Use driver specific reopen() if available */
+ if (drv->bdrv_reopen) {
+ if ((ret = drv->bdrv_reopen(bs, bdrv_flags)) < 0) {
+ qerror_report(QERR_REOPEN_FILE_FAILED, bs->filename);
+ return ret;
+ }
+ } else {
+ /* Use reopen procedure common for drivers */
+ open_flags = bs->open_flags;
+ bdrv_close(bs);
+
+ ret = bdrv_open(bs, bs->filename, bdrv_flags, drv);
if (ret < 0) {
- /* Reopen failed with orig and modified flags */
- abort();
+ /*
+ * Reopen failed. Try to open with original flags
+ */
+ qerror_report(QERR_REOPEN_FILE_FAILED, bs->filename);
+ ret = bdrv_open(bs, bs->filename, open_flags, drv);
+ if (ret < 0) {
+ /*
+ * Reopen with orig and modified flags failed
+ */
+ abort();
+ }
}
}
-
return ret;
}
Index: qemu/block_int.h
===================================================================
--- qemu.orig/block_int.h
+++ qemu/block_int.h
@@ -54,6 +54,7 @@ struct BlockDriver {
int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char
*filename);
int (*bdrv_probe_device)(const char *filename);
int (*bdrv_open)(BlockDriverState *bs, int flags);
+ int (*bdrv_reopen)(BlockDriverState *bs, int flags);
int (*bdrv_file_open)(BlockDriverState *bs, const char *filename,
int flags);
int (*bdrv_read)(BlockDriverState *bs, int64_t sector_num,
uint8_t *buf, int nb_sectors);
next prev parent reply other threads:[~2011-08-16 19:07 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-05 8:40 [Qemu-devel] Safely reopening image files by stashing fds Stefan Hajnoczi
2011-08-05 9:04 ` Paolo Bonzini
2011-08-05 9:27 ` Stefan Hajnoczi
2011-08-05 9:55 ` Paolo Bonzini
2011-08-05 13:03 ` Stefan Hajnoczi
2011-08-05 13:12 ` Daniel P. Berrange
2011-08-05 14:28 ` Christoph Hellwig
2011-08-05 15:24 ` Stefan Hajnoczi
2011-08-05 15:43 ` Kevin Wolf
2011-08-05 15:49 ` Anthony Liguori
2011-08-08 7:02 ` Supriya Kannery
2011-08-08 8:12 ` Kevin Wolf
2011-08-09 9:22 ` supriya kannery
2011-08-09 9:51 ` Kevin Wolf
2011-08-09 9:32 ` supriya kannery
2011-08-16 19:18 ` [Qemu-devel] [RFC] " Supriya Kannery
2011-08-16 19:18 ` Supriya Kannery [this message]
2011-08-17 14:35 ` Kevin Wolf
2011-10-10 18:28 ` [Qemu-devel] " Kevin Wolf
2011-10-11 5:21 ` Supriya Kannery
2011-08-05 14:27 ` Christoph Hellwig
2011-08-05 9:07 ` Kevin Wolf
2011-08-05 9:29 ` Stefan Hajnoczi
2011-08-05 9:48 ` Kevin Wolf
2011-08-08 14:49 ` Stefan Hajnoczi
2011-08-08 15:16 ` Kevin Wolf
2011-08-09 10:25 ` Stefan Hajnoczi
2011-08-09 10:35 ` Kevin Wolf
2011-08-09 10:50 ` Stefan Hajnoczi
2011-08-09 10:56 ` Stefan Hajnoczi
2011-08-09 11:39 ` Kevin Wolf
2011-08-09 12:00 ` Stefan Hajnoczi
2011-08-09 12:24 ` Kevin Wolf
2011-08-09 19:39 ` Blue Swirl
2011-08-10 7:58 ` Kevin Wolf
2011-08-10 17:20 ` Blue Swirl
2011-08-11 7:37 ` Kevin Wolf
2011-08-11 16:21 ` Blue Swirl
2011-08-05 20:16 ` Blue Swirl
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=4E4AC29F.7010601@linux.vnet.ibm.com \
--to=supriyak@linux.vnet.ibm.com \
--cc=hch@lst.de \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
--cc=supriyak@in.ibm.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.