From patchwork Sun Nov 27 01:56:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Reitz X-Patchwork-Id: 9448643 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 626CE60235 for ; Sun, 27 Nov 2016 02:07:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5483C2624C for ; Sun, 27 Nov 2016 02:07:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4772526785; Sun, 27 Nov 2016 02:07:38 +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 7F03A2624C for ; Sun, 27 Nov 2016 02:07:37 +0000 (UTC) Received: from localhost ([::1]:52429 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cAosR-0001Tm-Kp for patchwork-qemu-devel@patchwork.kernel.org; Sat, 26 Nov 2016 21:07:35 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43223) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cAoiT-0002Kg-Jp for qemu-devel@nongnu.org; Sat, 26 Nov 2016 20:57:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cAoiR-0006yv-AF for qemu-devel@nongnu.org; Sat, 26 Nov 2016 20:57:17 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50386) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cAoiM-0006xV-OW; Sat, 26 Nov 2016 20:57:10 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D7B93C04D304; Sun, 27 Nov 2016 01:57:09 +0000 (UTC) Received: from localhost (ovpn-116-37.phx2.redhat.com [10.3.116.37]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id uAR1v7LP024443 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 26 Nov 2016 20:57:09 -0500 From: Max Reitz To: qemu-block@nongnu.org Date: Sun, 27 Nov 2016 02:56:16 +0100 Message-Id: <20161127015622.24105-19-mreitz@redhat.com> In-Reply-To: <20161127015622.24105-1-mreitz@redhat.com> References: <20161127015622.24105-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Sun, 27 Nov 2016 01:57:09 +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 v2 18/24] block: Add sgfnt_runtime_opts to BlockDriver 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 This new field can be set by block drivers to list the runtime options they accept that may influence the contents of the respective BDS. As of a follow-up patch, this list will be used by the common bdrv_refresh_filename() implementation to decide which options to put into BDS.full_open_options (and consequently whether a JSON filename has to be created), thus freeing the drivers of having to implement that logic themselves. Additionally, this patch adds the field to all of the block drivers that need it and sets it accordingly. Signed-off-by: Max Reitz --- block/blkdebug.c | 6 ++++++ block/curl.c | 20 ++++++++++++++++++++ block/gluster.c | 19 +++++++++++++++++++ block/nbd.c | 8 ++++++++ block/nfs.c | 3 +++ block/null.c | 9 +++++++++ block/quorum.c | 8 ++++++++ block/rbd.c | 2 ++ block/vvfat.c | 4 ++++ include/block/block_int.h | 7 +++++++ 10 files changed, 86 insertions(+) diff --git a/block/blkdebug.c b/block/blkdebug.c index 4127571..5de6fad 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -762,6 +762,12 @@ static BlockDriver bdrv_blkdebug = { = blkdebug_debug_remove_breakpoint, .bdrv_debug_resume = blkdebug_debug_resume, .bdrv_debug_is_suspended = blkdebug_debug_is_suspended, + + .sgfnt_runtime_opts = (const char *const[]) { "config", + "inject-error.", + "set-state.", + "suspend.", + NULL }, }; static void bdrv_blkdebug_init(void) diff --git a/block/curl.c b/block/curl.c index 0404c1b..0777d5b 100644 --- a/block/curl.c +++ b/block/curl.c @@ -872,6 +872,18 @@ static int64_t curl_getlength(BlockDriverState *bs) return s->len; } +static const char *const curl_sgfnt_runtime_opts[] = { + CURL_BLOCK_OPT_URL, + CURL_BLOCK_OPT_SSLVERIFY, + CURL_BLOCK_OPT_COOKIE, + CURL_BLOCK_OPT_USERNAME, + CURL_BLOCK_OPT_PASSWORD_SECRET, + CURL_BLOCK_OPT_PROXY_USERNAME, + CURL_BLOCK_OPT_PROXY_PASSWORD_SECRET, + + NULL +}; + static BlockDriver bdrv_http = { .format_name = "http", .protocol_name = "http", @@ -886,6 +898,8 @@ static BlockDriver bdrv_http = { .bdrv_detach_aio_context = curl_detach_aio_context, .bdrv_attach_aio_context = curl_attach_aio_context, + + .sgfnt_runtime_opts = curl_sgfnt_runtime_opts, }; static BlockDriver bdrv_https = { @@ -902,6 +916,8 @@ static BlockDriver bdrv_https = { .bdrv_detach_aio_context = curl_detach_aio_context, .bdrv_attach_aio_context = curl_attach_aio_context, + + .sgfnt_runtime_opts = curl_sgfnt_runtime_opts, }; static BlockDriver bdrv_ftp = { @@ -918,6 +934,8 @@ static BlockDriver bdrv_ftp = { .bdrv_detach_aio_context = curl_detach_aio_context, .bdrv_attach_aio_context = curl_attach_aio_context, + + .sgfnt_runtime_opts = curl_sgfnt_runtime_opts, }; static BlockDriver bdrv_ftps = { @@ -934,6 +952,8 @@ static BlockDriver bdrv_ftps = { .bdrv_detach_aio_context = curl_detach_aio_context, .bdrv_attach_aio_context = curl_attach_aio_context, + + .sgfnt_runtime_opts = curl_sgfnt_runtime_opts, }; static void curl_block_init(void) diff --git a/block/gluster.c b/block/gluster.c index 891c13b..3b286c7 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -1402,6 +1402,21 @@ static int64_t coroutine_fn qemu_gluster_co_get_block_status( } +static const char *const gluster_sgfnt_open_opts[] = { + GLUSTER_OPT_VOLUME, + GLUSTER_OPT_PATH, + GLUSTER_OPT_TYPE, + GLUSTER_OPT_SERVER_PATTERN, + GLUSTER_OPT_HOST, + GLUSTER_OPT_PORT, + GLUSTER_OPT_TO, + GLUSTER_OPT_IPV4, + GLUSTER_OPT_IPV6, + GLUSTER_OPT_SOCKET, + + NULL +}; + static BlockDriver bdrv_gluster = { .format_name = "gluster", .protocol_name = "gluster", @@ -1428,6 +1443,7 @@ static BlockDriver bdrv_gluster = { #endif .bdrv_co_get_block_status = qemu_gluster_co_get_block_status, .create_opts = &qemu_gluster_create_opts, + .sgfnt_runtime_opts = gluster_sgfnt_open_opts, }; static BlockDriver bdrv_gluster_tcp = { @@ -1456,6 +1472,7 @@ static BlockDriver bdrv_gluster_tcp = { #endif .bdrv_co_get_block_status = qemu_gluster_co_get_block_status, .create_opts = &qemu_gluster_create_opts, + .sgfnt_runtime_opts = gluster_sgfnt_open_opts, }; static BlockDriver bdrv_gluster_unix = { @@ -1484,6 +1501,7 @@ static BlockDriver bdrv_gluster_unix = { #endif .bdrv_co_get_block_status = qemu_gluster_co_get_block_status, .create_opts = &qemu_gluster_create_opts, + .sgfnt_runtime_opts = gluster_sgfnt_open_opts, }; /* rdma is deprecated (actually never supported for volfile fetch). @@ -1518,6 +1536,7 @@ static BlockDriver bdrv_gluster_rdma = { #endif .bdrv_co_get_block_status = qemu_gluster_co_get_block_status, .create_opts = &qemu_gluster_create_opts, + .sgfnt_runtime_opts = gluster_sgfnt_open_opts, }; static void bdrv_gluster_init(void) diff --git a/block/nbd.c b/block/nbd.c index 42f0cd6..1307989 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -580,6 +580,11 @@ static char *nbd_dirname(BlockDriverState *bs, Error **errp) return NULL; } +static const char *const nbd_sgfnt_runtime_opts[] = { + "path", "host", "port", "export", "tls-creds", "server.", + NULL +}; + static BlockDriver bdrv_nbd = { .format_name = "nbd", .protocol_name = "nbd", @@ -598,6 +603,7 @@ static BlockDriver bdrv_nbd = { .bdrv_attach_aio_context = nbd_attach_aio_context, .bdrv_refresh_filename = nbd_refresh_filename, .bdrv_dirname = nbd_dirname, + .sgfnt_runtime_opts = nbd_sgfnt_runtime_opts, }; static BlockDriver bdrv_nbd_tcp = { @@ -618,6 +624,7 @@ static BlockDriver bdrv_nbd_tcp = { .bdrv_attach_aio_context = nbd_attach_aio_context, .bdrv_refresh_filename = nbd_refresh_filename, .bdrv_dirname = nbd_dirname, + .sgfnt_runtime_opts = nbd_sgfnt_runtime_opts, }; static BlockDriver bdrv_nbd_unix = { @@ -638,6 +645,7 @@ static BlockDriver bdrv_nbd_unix = { .bdrv_attach_aio_context = nbd_attach_aio_context, .bdrv_refresh_filename = nbd_refresh_filename, .bdrv_dirname = nbd_dirname, + .sgfnt_runtime_opts = nbd_sgfnt_runtime_opts, }; static void bdrv_nbd_init(void) diff --git a/block/nfs.c b/block/nfs.c index 81ce98a..6ffdede 100644 --- a/block/nfs.c +++ b/block/nfs.c @@ -876,6 +876,9 @@ static BlockDriver bdrv_nfs = { .bdrv_refresh_filename = nfs_refresh_filename, .bdrv_dirname = nfs_dirname, + .sgfnt_runtime_opts = (const char *const[]) { "path", "uid", + "gid", NULL }, + #ifdef LIBNFS_FEATURE_PAGECACHE .bdrv_invalidate_cache = nfs_invalidate_cache, #endif diff --git a/block/null.c b/block/null.c index b300390..16ef8b2 100644 --- a/block/null.c +++ b/block/null.c @@ -236,6 +236,13 @@ static void null_refresh_filename(BlockDriverState *bs, QDict *opts) bs->full_open_options = opts; } +static const char *const null_sgfnt_runtime_opts[] = { + BLOCK_OPT_SIZE, + NULL_OPT_ZEROES, + + NULL +}; + static BlockDriver bdrv_null_co = { .format_name = "null-co", .protocol_name = "null-co", @@ -253,6 +260,7 @@ static BlockDriver bdrv_null_co = { .bdrv_co_get_block_status = null_co_get_block_status, .bdrv_refresh_filename = null_refresh_filename, + .sgfnt_runtime_opts = null_sgfnt_runtime_opts, }; static BlockDriver bdrv_null_aio = { @@ -272,6 +280,7 @@ static BlockDriver bdrv_null_aio = { .bdrv_co_get_block_status = null_co_get_block_status, .bdrv_refresh_filename = null_refresh_filename, + .sgfnt_runtime_opts = null_sgfnt_runtime_opts, }; static void bdrv_null_init(void) diff --git a/block/quorum.c b/block/quorum.c index 07c943c..0fa803b 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -1116,6 +1116,14 @@ static BlockDriver bdrv_quorum = { .is_filter = true, .bdrv_recurse_is_first_non_filter = quorum_recurse_is_first_non_filter, + + .sgfnt_runtime_opts = (const char *const[]) { + QUORUM_OPT_VOTE_THRESHOLD, + QUORUM_OPT_BLKVERIFY, + QUORUM_OPT_REWRITE, + QUORUM_OPT_READ_PATTERN, + NULL + }, }; static void bdrv_quorum_init(void) diff --git a/block/rbd.c b/block/rbd.c index a57b3e3..b09a18f 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -1005,6 +1005,8 @@ static BlockDriver bdrv_rbd = { #ifdef LIBRBD_SUPPORTS_INVALIDATE .bdrv_invalidate_cache = qemu_rbd_invalidate_cache, #endif + + .sgfnt_runtime_opts = (const char *const[]) { "password-secret", NULL }, }; static void bdrv_rbd_init(void) diff --git a/block/vvfat.c b/block/vvfat.c index ded2109..94f2860 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -3077,6 +3077,10 @@ static BlockDriver bdrv_vvfat = { .bdrv_co_preadv = vvfat_co_preadv, .bdrv_co_pwritev = vvfat_co_pwritev, .bdrv_co_get_block_status = vvfat_co_get_block_status, + + .sgfnt_runtime_opts = (const char *const[]) { "dir", "fat-type", + "floppy", "label", "rw", + NULL }, }; static void bdrv_vvfat_init(void) diff --git a/include/block/block_int.h b/include/block/block_int.h index 7143737..5885d9f 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -322,6 +322,13 @@ struct BlockDriver { Error **errp); QLIST_ENTRY(BlockDriver) list; + + /* Pointer to a NULL-terminated array of names of significant options that + * can be specified for bdrv_open(). A significant option is one that + * changes the data of a BDS. + * If this pointer is NULL, the array is considered empty. + * "filename" and "driver" are always considered significant. */ + const char *const *sgfnt_runtime_opts; }; typedef struct BlockLimits {