[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely
From: |
Supriya Kannery |
Subject: |
[Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely |
Date: |
Fri, 11 Nov 2011 12:18:18 +0530 |
Struct BDRVReopenState along with three reopen related functions
introduced for handling reopen state of images safely. This can be
extended by each of the block drivers to reopen respective
image files.
Signed-off-by: Supriya Kannery <address@hidden>
Index: qemu/block.c
===================================================================
--- qemu.orig/block.c
+++ qemu/block.c
@@ -696,10 +696,33 @@ unlink_and_fail:
return ret;
}
+int bdrv_reopen_prepare(BlockDriverState *bs, BDRVReopenState **prs, int flags)
+{
+ BlockDriver *drv = bs->drv;
+
+ return drv->bdrv_reopen_prepare(bs, prs, flags);
+}
+
+void bdrv_reopen_commit(BlockDriverState *bs, BDRVReopenState *rs, int flags)
+{
+ BlockDriver *drv = bs->drv;
+
+ drv->bdrv_reopen_commit(bs, rs, flags);
+ bs->open_flags = flags;
+}
+
+void bdrv_reopen_abort(BlockDriverState *bs, BDRVReopenState *rs)
+{
+ BlockDriver *drv = bs->drv;
+
+ drv->bdrv_reopen_abort(bs, rs);
+}
+
int bdrv_reopen(BlockDriverState *bs, int bdrv_flags)
{
BlockDriver *drv = bs->drv;
int ret = 0, open_flags;
+ BDRVReopenState *reopen_state = NULL;
/* Quiesce IO for the given block device */
qemu_aio_flush();
@@ -708,17 +731,31 @@ 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_prepare) {
+ ret = bdrv_reopen_prepare(bs, &reopen_state, bdrv_flags);
+ if (ret < 0) {
+ bdrv_reopen_abort(bs, reopen_state);
+ qerror_report(QERR_REOPEN_FILE_FAILED, bs->filename);
+ return ret;
+ }
+
+ bdrv_reopen_commit(bs, reopen_state, bdrv_flags);
+
+ } else {
+ 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 failed with orig and modified flags */
+ bs->drv = NULL;
+ }
}
}
Index: qemu/block_int.h
===================================================================
--- qemu.orig/block_int.h
+++ qemu/block_int.h
@@ -56,6 +56,14 @@ 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);
+
+ /* For handling image reopen for split or non-split files */
+ int (*bdrv_reopen_prepare)(BlockDriverState *bs,
+ BDRVReopenState **prs,
+ int flags);
+ void (*bdrv_reopen_commit)(BlockDriverState *bs, BDRVReopenState *rs,
+ int flags);
+ void (*bdrv_reopen_abort)(BlockDriverState *bs, BDRVReopenState *rs);
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);
@@ -213,6 +221,11 @@ struct BlockDriverState {
void *private;
};
+struct BDRVReopenState {
+ BlockDriverState *bs;
+ int reopen_flags;
+};
+
struct BlockDriverAIOCB {
AIOPool *pool;
BlockDriverState *bs;
Index: qemu/qemu-common.h
===================================================================
--- qemu.orig/qemu-common.h
+++ qemu/qemu-common.h
@@ -203,6 +203,7 @@ typedef struct NICInfo NICInfo;
typedef struct HCIInfo HCIInfo;
typedef struct AudioState AudioState;
typedef struct BlockDriverState BlockDriverState;
+typedef struct BDRVReopenState BDRVReopenState;
typedef struct DriveInfo DriveInfo;
typedef struct DisplayState DisplayState;
typedef struct DisplayChangeListener DisplayChangeListener;
Index: qemu/block.h
===================================================================
--- qemu.orig/block.h
+++ qemu/block.h
@@ -105,6 +105,9 @@ int bdrv_file_open(BlockDriverState **pb
int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
BlockDriver *drv);
int bdrv_reopen(BlockDriverState *bs, int bdrv_flags);
+int bdrv_reopen_prepare(BlockDriverState *bs, BDRVReopenState **prs, int
flags);
+void bdrv_reopen_commit(BlockDriverState *bs, BDRVReopenState *rs, int flags);
+void bdrv_reopen_abort(BlockDriverState *bs, BDRVReopenState *rs);
void bdrv_close(BlockDriverState *bs);
int bdrv_attach_dev(BlockDriverState *bs, void *dev);
void bdrv_attach_dev_nofail(BlockDriverState *bs, void *dev);
- [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', (continued)
- [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', Supriya Kannery, 2011/11/11
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', Stefan Hajnoczi, 2011/11/16
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', Supriya Kannery, 2011/11/17
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', Stefan Hajnoczi, 2011/11/17
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', supriya kannery, 2011/11/21
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', Stefan Hajnoczi, 2011/11/21
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', supriya kannery, 2011/11/22
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', Kevin Wolf, 2011/11/22
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', Stefan Hajnoczi, 2011/11/22
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', Kevin Wolf, 2011/11/22
[Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely,
Supriya Kannery <=
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely, Luiz Capitulino, 2011/11/17
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely, Stefan Hajnoczi, 2011/11/17
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely, supriya kannery, 2011/11/21
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely, Stefan Hajnoczi, 2011/11/21
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely, supriya kannery, 2011/11/22
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely, Kevin Wolf, 2011/11/22
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely, supriya kannery, 2011/11/22
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely, Stefan Hajnoczi, 2011/11/22
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely, Supriya Kannery, 2011/11/22
[Qemu-devel] [v9 Patch 6/6]Qemu: raw posix implementation of reopen functions, Supriya Kannery, 2011/11/11