From patchwork Tue Jul 24 11:03:59 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 172858 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id DBCFB2C008E for ; Tue, 24 Jul 2012 22:13:14 +1000 (EST) Received: from localhost ([::1]:45322 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1StdzE-0000Al-UR for incoming@patchwork.ozlabs.org; Tue, 24 Jul 2012 08:13:12 -0400 Received: from eggs.gnu.org ([208.118.235.92]:56755) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Stcvz-0007ON-0l for qemu-devel@nongnu.org; Tue, 24 Jul 2012 07:05:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Stcvr-0005hM-Rt for qemu-devel@nongnu.org; Tue, 24 Jul 2012 07:05:46 -0400 Received: from mail-yw0-f45.google.com ([209.85.213.45]:36778) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Stcvr-00058R-Nx for qemu-devel@nongnu.org; Tue, 24 Jul 2012 07:05:39 -0400 Received: by mail-yw0-f45.google.com with SMTP id p34so6575216yhp.4 for ; Tue, 24 Jul 2012 04:05:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=kgtvPGbt0Sy7ImjPOrNNORGkmE5KnTtLgqpqvg1cVqs=; b=AUjQnK8Glrz3iIxca2Q9Rbd1MiwTiQMy7GANSCUDpEqbQ/OU00dDQ2Fe7NBWSsevSZ 6eZXeKx4RXUrRobEeYNkNvtxUQNDMmOr2XJ5gkvKqicrVlhZzQS2uI/HYbuvdP+9lOVE RXd+KzyMNeioA1PE8/93O1aGy5ZalurUM3v9HtrEvIadlFbI2PSuW4qng4QuoHzXgtDH wjXkP+DF09BATVrLMiIOT8uaqmJy+6qx3u/Z+tBnMRPPurq6zXCdauFaA2rJbdsxoaIw lSFy5WTeNj3XB5SfE3itYckl8ea4NneLLCO2Yc20+4gK15j6YwdqF2qry5EhUGWccnTk 7D9g== Received: by 10.43.69.12 with SMTP id ya12mr14541230icb.50.1343127939472; Tue, 24 Jul 2012 04:05:39 -0700 (PDT) Received: from yakj.usersys.redhat.com (93-34-189-113.ip51.fastwebnet.it. [93.34.189.113]) by mx.google.com with ESMTPS id if4sm1752561igc.10.2012.07.24.04.05.36 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 24 Jul 2012 04:05:38 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 24 Jul 2012 13:03:59 +0200 Message-Id: <1343127865-16608-22-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1343127865-16608-1-git-send-email-pbonzini@redhat.com> References: <1343127865-16608-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.213.45 Cc: kwolf@redhat.com, jcody@redhat.com, eblake@redhat.com, stefanha@linux.vnet.ibm.com Subject: [Qemu-devel] [PATCH 21/47] block: add bdrv_ensure_backing_file 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 Mirroring runs without the backing file so that it can be copied outside QEMU. However, we need to add it at the time the job is completed and QEMU switches to the target. Factor out the common bits of opening an image and completing a mirroring operation. Signed-off-by: Paolo Bonzini --- block.c | 69 ++++++++++++++++++++++++++++++++++++++++----------------------- block.h | 1 + 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/block.c b/block.c index 19da114..002b442 100644 --- a/block.c +++ b/block.c @@ -730,6 +730,48 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags) return 0; } +int bdrv_ensure_backing_file(BlockDriverState *bs) +{ + char backing_filename[PATH_MAX]; + int back_flags, ret; + BlockDriver *back_drv = NULL; + + if (bs->backing_hd != NULL) { + return 0; + } + + bs->open_flags &= ~BDRV_O_NO_BACKING; + if (bs->backing_file[0] == '\0') { + return 0; + } + + bs->backing_hd = bdrv_new(""); + bdrv_get_full_backing_filename(bs, backing_filename, + sizeof(backing_filename)); + + if (bs->backing_format[0] != '\0') { + back_drv = bdrv_find_format(bs->backing_format); + } + + /* backing files always opened read-only */ + back_flags = bs->open_flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT); + + ret = bdrv_open(bs->backing_hd, backing_filename, back_flags, back_drv); + if (ret < 0) { + bdrv_close(bs); + bdrv_delete(bs->backing_hd); + bs->backing_hd = NULL; + return ret; + } + if (bs->is_temporary) { + bs->backing_hd->keep_read_only = !(bs->open_flags & BDRV_O_RDWR); + } else { + /* base images use the same setting as leaf */ + bs->backing_hd->keep_read_only = bs->keep_read_only; + } + return 0; +} + /* * Opens a disk image (raw, qcow2, vmdk, ...) */ @@ -813,34 +855,11 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags, } /* If there is a backing file, use it */ - if ((flags & BDRV_O_NO_BACKING) == 0 && bs->backing_file[0] != '\0') { - char backing_filename[PATH_MAX]; - int back_flags; - BlockDriver *back_drv = NULL; - - bs->backing_hd = bdrv_new(""); - bdrv_get_full_backing_filename(bs, backing_filename, - sizeof(backing_filename)); - - if (bs->backing_format[0] != '\0') { - back_drv = bdrv_find_format(bs->backing_format); - } - - /* backing files always opened read-only */ - back_flags = - flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING); - - ret = bdrv_open(bs->backing_hd, backing_filename, back_flags, back_drv); + if ((flags & BDRV_O_NO_BACKING) == 0) { + ret = bdrv_ensure_backing_file(bs); if (ret < 0) { - bdrv_close(bs); return ret; } - if (bs->is_temporary) { - bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR); - } else { - /* base image inherits from "parent" */ - bs->backing_hd->keep_read_only = bs->keep_read_only; - } } if (!bdrv_key_required(bs)) { diff --git a/block.h b/block.h index 9bff842..8aeb7a9 100644 --- a/block.h +++ b/block.h @@ -122,6 +122,7 @@ void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top); void bdrv_delete(BlockDriverState *bs); int bdrv_parse_cache_flags(const char *mode, int *flags); int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags); +int bdrv_ensure_backing_file(BlockDriverState *bs); int bdrv_open(BlockDriverState *bs, const char *filename, int flags, BlockDriver *drv); void bdrv_close(BlockDriverState *bs);