From patchwork Wed Jun 21 12:50:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Reitz X-Patchwork-Id: 9801773 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5BED26038C for ; Wed, 21 Jun 2017 13:03:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 48A1225D9E for ; Wed, 21 Jun 2017 13:03:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 38E4428515; Wed, 21 Jun 2017 13:03:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id ACDF925D9E for ; Wed, 21 Jun 2017 13:03:05 +0000 (UTC) Received: from localhost ([::1]:53805 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dNfHk-0001qa-3G for patchwork-qemu-devel@patchwork.kernel.org; Wed, 21 Jun 2017 09:03:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34170) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dNf6q-0008BS-2y for qemu-devel@nongnu.org; Wed, 21 Jun 2017 08:51:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dNf6p-0005Ma-5E for qemu-devel@nongnu.org; Wed, 21 Jun 2017 08:51:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40222) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dNf6m-0005K9-Mj; Wed, 21 Jun 2017 08:51:44 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 891FA61D10; Wed, 21 Jun 2017 12:51:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 891FA61D10 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=mreitz@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 891FA61D10 Received: from localhost (unknown [10.40.205.46]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9083390AC2; Wed, 21 Jun 2017 12:51:41 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Wed, 21 Jun 2017 14:50:38 +0200 Message-Id: <20170621125047.30294-17-mreitz@redhat.com> In-Reply-To: <20170621125047.30294-1-mreitz@redhat.com> References: <20170621125047.30294-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 21 Jun 2017 12:51:42 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 16/25] block: Add 'base-directory' BDS option X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Alberto Garcia , qemu-devel@nongnu.org, Max Reitz Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Using this option, one can directly override what bdrv_dirname() will return. This is useful if one uses e.g. qcow2 on top of quorum (with only protocol BDSs under the quorum BDS) and wants to be able to use relative backing filenames. Signed-off-by: Max Reitz --- qapi/block-core.json | 9 +++++++++ include/block/block_int.h | 2 ++ block.c | 14 ++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/qapi/block-core.json b/qapi/block-core.json index f85c223..4090c62 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2940,6 +2940,14 @@ # (default: off) # @force-share: force share all permission on added nodes. # Requires read-only=true. (Since 2.10) +# @base-directory May be specified for any node. Normally, whenever a filename +# is specified which is supposed to be relative to this node +# (such as relative backing filenames), the base directory to be +# used is the directory the image file of this node is in, which +# is simply prepended to the relative filename. Using this +# option, the string which is prepended (i.e. the base +# directory) can be overridden. +# (Since 2.10) # # Remaining options are determined by the block driver. # @@ -2948,6 +2956,7 @@ { 'union': 'BlockdevOptions', 'base': { 'driver': 'BlockdevDriver', '*node-name': 'str', + '*base-directory': 'str', '*discard': 'BlockdevDiscardOptions', '*cache': 'BlockdevCacheOptions', '*read-only': 'bool', diff --git a/include/block/block_int.h b/include/block/block_int.h index 61e7d7a..8a7fc2d 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -559,6 +559,8 @@ struct BlockDriverState { QDict *full_open_options; char exact_filename[PATH_MAX]; + char *dirname; + BdrvChild *backing; BdrvChild *file; diff --git a/block.c b/block.c index a5dd6bb..8e03cca 100644 --- a/block.c +++ b/block.c @@ -1233,6 +1233,12 @@ QemuOptsList bdrv_runtime_opts = { .type = QEMU_OPT_BOOL, .help = "always accept other writers (default: off)", }, + { + .name = "base-directory", + .type = QEMU_OPT_STRING, + .help = "String to prepend to filenames relative to this BDS for " + "making them absolute", + }, { /* end of list */ } }, }; @@ -1305,6 +1311,8 @@ static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file, trace_bdrv_open_common(bs, filename ?: "", bs->open_flags, drv->format_name); + bs->dirname = g_strdup(qemu_opt_get(opts, "base-directory")); + bs->read_only = !(bs->open_flags & BDRV_O_RDWR); if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) { @@ -3249,6 +3257,8 @@ static void bdrv_delete(BlockDriverState *bs) bdrv_close(bs); + g_free(bs->dirname); + /* remove from list, if necessary */ if (bs->node_name[0] != '\0') { QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list); @@ -4931,6 +4941,10 @@ char *bdrv_dirname(BlockDriverState *bs, Error **errp) { BlockDriver *drv = bs->drv; + if (bs->dirname) { + return g_strdup(bs->dirname); + } + if (!drv) { error_setg(errp, "Node '%s' is ejected", bs->node_name); return NULL;