From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45873) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XWskv-0003Hv-Md for qemu-devel@nongnu.org; Wed, 24 Sep 2014 16:01:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XWskp-0003AR-Dt for qemu-devel@nongnu.org; Wed, 24 Sep 2014 16:01:41 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56978) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XWskp-00039x-7T for qemu-devel@nongnu.org; Wed, 24 Sep 2014 16:01:35 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s8OJmjaX006127 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 24 Sep 2014 15:48:45 -0400 From: Max Reitz Date: Wed, 24 Sep 2014 21:48:26 +0200 Message-Id: <1411588107-4275-4-git-send-email-mreitz@redhat.com> In-Reply-To: <1411588107-4275-1-git-send-email-mreitz@redhat.com> References: <1411588107-4275-1-git-send-email-mreitz@redhat.com> Subject: [Qemu-devel] [PATCH 3/4] block: Add bdrv_filename() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Stefan Hajnoczi , Max Reitz 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. 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 9311cef..955ea3d 100644 --- a/block.c +++ b/block.c @@ -1508,7 +1508,7 @@ int bdrv_open(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. */ @@ -6000,9 +6000,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) { @@ -6089,15 +6086,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 7d64a23..15896c0 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 7687466..fb0b921 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -1039,7 +1039,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 c6e82f3..3507c4e 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -276,6 +276,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); -- 2.1.0