From patchwork Wed Aug 5 20:52:47 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Reitz X-Patchwork-Id: 504204 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id D6B411402A8 for ; Thu, 6 Aug 2015 06:53:53 +1000 (AEST) Received: from localhost ([::1]:42091 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZN5hA-0002at-3U for incoming@patchwork.ozlabs.org; Wed, 05 Aug 2015 16:53:52 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46611) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZN5gb-0001a1-Kw for qemu-devel@nongnu.org; Wed, 05 Aug 2015 16:53:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZN5ga-0003mO-CZ for qemu-devel@nongnu.org; Wed, 05 Aug 2015 16:53:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40683) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZN5gX-0003kB-Me; Wed, 05 Aug 2015 16:53:13 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id E6E67107F8D; Wed, 5 Aug 2015 20:53:12 +0000 (UTC) Received: from localhost (ovpn-116-43.ams2.redhat.com [10.36.116.43]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t75Kr8Wo016267 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 5 Aug 2015 16:53:11 -0400 From: Max Reitz To: qemu-block@nongnu.org Date: Wed, 5 Aug 2015 22:52:47 +0200 Message-Id: <1438807969-9723-4-git-send-email-mreitz@redhat.com> In-Reply-To: <1438807969-9723-1-git-send-email-mreitz@redhat.com> References: <1438807969-9723-1-git-send-email-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Kevin Wolf , qemu-devel@nongnu.org, Stefan Hajnoczi , Max Reitz Subject: [Qemu-devel] [PATCH v2 3/5] block: Add bdrv_filename() 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 Split the part which actually refreshes the BlockDriverState.filename field off of bdrv_refresh_filename() into a more generic function bdrv_filename(), which first calls bdrv_refresh_filename() and then stores a qemu-usable filename into the given buffer instead of BlockDriverState.filename. Since bdrv_refresh_filename() therefore no longer refreshes that field, some calls to that function have to be replaced by calls to bdrv_filename() "manually" refreshing the BDS filename field (this is only temporary). Signed-off-by: Max Reitz --- block.c | 31 ++++++++++++++++++++++++------- block/blkverify.c | 3 ++- block/quorum.c | 2 +- include/block/block.h | 1 + 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/block.c b/block.c index 5a1dc16..cbc53e2 100644 --- a/block.c +++ b/block.c @@ -1558,7 +1558,7 @@ static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename, } } - bdrv_refresh_filename(bs); + bdrv_filename(bs, bs->filename, sizeof(bs->filename)); /* For snapshot=on, create a temporary qcow2 overlay. bs points to the * temporary snapshot afterwards. */ @@ -4151,9 +4151,6 @@ static bool append_open_options(QDict *d, BlockDriverState *bs) * - full_open_options: Options which, when given when opening a block device * (without a filename), result in a BDS (mostly) * equalling the given one - * - filename: If exact_filename is set, it is copied here. Otherwise, - * full_open_options is converted to a JSON object, prefixed with - * "json:" (for use through the JSON pseudo protocol) and put here. */ void bdrv_refresh_filename(BlockDriverState *bs) { @@ -4240,15 +4237,35 @@ void bdrv_refresh_filename(BlockDriverState *bs) bs->full_open_options = opts; } +} + +/* First refreshes exact_filename and full_open_options by calling + * bdrv_refresh_filename(). Then, if exact_filename is set, it is copied into + * the target buffer. Otherwise, full_open_options is converted to a JSON + * object, prefixed with "json:" (for use through the JSON pseudo protocol) and + * put there. + * + * If sz > 0, the string put into the buffer will always be null-terminated. + * + * Returns @dest. + */ +char *bdrv_filename(BlockDriverState *bs, char *dest, size_t sz) +{ + bdrv_refresh_filename(bs); + + if (sz > INT_MAX) { + sz = INT_MAX; + } if (bs->exact_filename[0]) { - pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename); + pstrcpy(dest, sz, bs->exact_filename); } else if (bs->full_open_options) { QString *json = qobject_to_json(QOBJECT(bs->full_open_options)); - snprintf(bs->filename, sizeof(bs->filename), "json:%s", - qstring_get_str(json)); + snprintf(dest, sz, "json:%s", qstring_get_str(json)); QDECREF(json); } + + return dest; } /* This accessor function purpose is to allow the device models to access the diff --git a/block/blkverify.c b/block/blkverify.c index d277e63..cb9ce02 100644 --- a/block/blkverify.c +++ b/block/blkverify.c @@ -309,7 +309,8 @@ static void blkverify_refresh_filename(BlockDriverState *bs) BDRVBlkverifyState *s = bs->opaque; /* bs->file has already been refreshed */ - bdrv_refresh_filename(s->test_file); + bdrv_filename(s->test_file, s->test_file->filename, + sizeof(s->test_file->filename)); if (bs->file->full_open_options && s->test_file->full_open_options) { QDict *opts = qdict_new(); diff --git a/block/quorum.c b/block/quorum.c index 2f6c45f..00d1fb0 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -1003,7 +1003,7 @@ static void quorum_refresh_filename(BlockDriverState *bs) int i; for (i = 0; i < s->num_children; i++) { - bdrv_refresh_filename(s->bs[i]); + bdrv_filename(s->bs[i], s->bs[i]->filename, sizeof(s->bs[i]->filename)); if (!s->bs[i]->full_open_options) { return; } diff --git a/include/block/block.h b/include/block/block.h index a78e4f1..263442e 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -267,6 +267,7 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs, const char *backing_file); int bdrv_get_backing_file_depth(BlockDriverState *bs); void bdrv_refresh_filename(BlockDriverState *bs); +char *bdrv_filename(BlockDriverState *bs, char *dest, size_t sz); int bdrv_truncate(BlockDriverState *bs, int64_t offset); int64_t bdrv_nb_sectors(BlockDriverState *bs); int64_t bdrv_getlength(BlockDriverState *bs);