From patchwork Wed Feb 1 03:06:58 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Supriya Kannery X-Patchwork-Id: 138894 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 0EFD2B6EF7 for ; Wed, 1 Feb 2012 14:07:35 +1100 (EST) Received: from localhost ([::1]:53547 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RsQXl-0007ym-MR for incoming@patchwork.ozlabs.org; Tue, 31 Jan 2012 22:07:33 -0500 Received: from eggs.gnu.org ([140.186.70.92]:55459) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RsQXe-0007yC-VH for qemu-devel@nongnu.org; Tue, 31 Jan 2012 22:07:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RsQXa-0006X4-NN for qemu-devel@nongnu.org; Tue, 31 Jan 2012 22:07:26 -0500 Received: from e35.co.us.ibm.com ([32.97.110.153]:60802) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RsQXa-0006WO-Aw for qemu-devel@nongnu.org; Tue, 31 Jan 2012 22:07:22 -0500 Received: from /spool/local by e35.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 31 Jan 2012 20:07:12 -0700 Received: from d03dlp01.boulder.ibm.com (9.17.202.177) by e35.co.us.ibm.com (192.168.1.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 31 Jan 2012 20:07:04 -0700 Received: from d03relay01.boulder.ibm.com (d03relay01.boulder.ibm.com [9.17.195.226]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id 56AA81FF004B for ; Tue, 31 Jan 2012 20:07:04 -0700 (MST) Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay01.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q11373g3143134 for ; Tue, 31 Jan 2012 20:07:03 -0700 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q11372aF016038 for ; Tue, 31 Jan 2012 20:07:03 -0700 Received: from skannery.in.ibm.com ([9.77.213.207]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q1136xiF015896; Tue, 31 Jan 2012 20:07:00 -0700 From: Supriya Kannery To: qemu-devel@nongnu.org Date: Wed, 01 Feb 2012 08:36:58 +0530 Message-Id: <20120201030658.2990.15176.sendpatchset@skannery.in.ibm.com> In-Reply-To: <20120201030557.2990.74150.sendpatchset@skannery.in.ibm.com> References: <20120201030557.2990.74150.sendpatchset@skannery.in.ibm.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12020103-6148-0000-0000-0000030EDF44 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 32.97.110.153 Cc: Kevin Wolf , Stefan Hajnoczi , Christoph Hellwig , Luiz Capitulino Subject: [Qemu-devel] [RFC Patch 4/7]Qemu: Framework for reopening image files safely X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Struct BDRVReopenState along with three reopen related functions introduced for handling reopening of images safely. This can be extended by each of the block drivers to reopen respective image files. Signed-off-by: Supriya Kannery Index: qemu/block.c =================================================================== --- qemu.orig/block.c +++ qemu/block.c @@ -808,10 +808,32 @@ 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) +{ + BlockDriver *drv = bs->drv; + + drv->bdrv_reopen_commit(bs, rs); +} + +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(); @@ -820,17 +842,32 @@ 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); + bs->open_flags = 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 @@ -105,6 +105,13 @@ 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); + 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); @@ -299,6 +306,10 @@ struct BlockDriverState { BlockJob *job; }; +struct BDRVReopenState { + BlockDriverState *bs; +}; + struct BlockDriverAIOCB { AIOPool *pool; BlockDriverState *bs; Index: qemu/qemu-common.h =================================================================== --- qemu.orig/qemu-common.h +++ qemu/qemu-common.h @@ -210,6 +210,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 @@ -120,6 +120,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); +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);