[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safe
From: |
Luiz Capitulino |
Subject: |
Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely |
Date: |
Thu, 17 Nov 2011 11:16:27 -0200 |
On Fri, 11 Nov 2011 12:18:18 +0530
Supriya Kannery <address@hidden> wrote:
> 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.
Shouldn't this patch come before the one introducing the QMP command?
>
> 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);
>
- Re: [Qemu-devel] [v9 Patch 4/6]Qemu: Add commandline -drive option 'hostcache', (continued)
- 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, 2011/11/11
- Re: [Qemu-devel] [v9 Patch 5/6]Qemu: Framework for reopening images safely,
Luiz Capitulino <=
- 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