From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8E252C47404 for ; Fri, 11 Oct 2019 18:07:01 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 547FB20659 for ; Fri, 11 Oct 2019 18:07:01 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 547FB20659 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=virtuozzo.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:55142 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iIzJc-0001he-4g for qemu-devel@archiver.kernel.org; Fri, 11 Oct 2019 14:07:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37395) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iIxRP-000752-69 for qemu-devel@nongnu.org; Fri, 11 Oct 2019 12:06:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iIxRM-0004zc-Jg for qemu-devel@nongnu.org; Fri, 11 Oct 2019 12:06:54 -0400 Received: from relay.sw.ru ([185.231.240.75]:48602) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iIxRM-0004e1-BG; Fri, 11 Oct 2019 12:06:52 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92.2) (envelope-from ) id 1iIxR0-0003XG-2P; Fri, 11 Oct 2019 19:06:30 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org Subject: [RFC v5 099/126] nbd: introduce ERRP_AUTO_PROPAGATE Date: Fri, 11 Oct 2019 19:05:25 +0300 Message-Id: <20191011160552.22907-100-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191011160552.22907-1-vsementsov@virtuozzo.com> References: <20191011160552.22907-1-vsementsov@virtuozzo.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , vsementsov@virtuozzo.com, qemu-block@nongnu.org, armbru@redhat.com, Max Reitz , Greg Kurz Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" If we want to add some info to errp (by error_prepend() or error_append_hint()), we must use the ERRP_AUTO_PROPAGATE macro. Otherwise, this info will not be added when errp == &fatal_err (the program will exit prior to the error_append_hint() or error_prepend() call). Fix such cases. If we want to check error after errp-function call, we need to introduce local_err and than propagate it to errp. Instead, use ERRP_AUTO_PROPAGATE macro, benefits are: 1. No need of explicit error_propagate call 2. No need of explicit local_err variable: use errp directly 3. ERRP_AUTO_PROPAGATE leaves errp as is if it's not NULL or &error_fatel, this means that we don't break error_abort (we'll abort on error_set, not on error_propagate) This commit (together with its neighbors) was generated by for f in $(git grep -l errp \*.[ch]); do \ spatch --sp-file scripts/coccinelle/auto-propagated-errp.cocci \ --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff $f; \ done; then fix a bit of compilation problems: coccinelle for some reason leaves several f() { ... goto out; ... out: } patterns, with "out:" at function end. then ./python/commit-per-subsystem.py MAINTAINERS "$(< auto-msg)" (auto-msg was a file with this commit message) Still, for backporting it may be more comfortable to use only the first command and then do one huge commit. Reported-by: Kevin Wolf Reported-by: Greg Kurz Signed-off-by: Vladimir Sementsov-Ogievskiy --- include/block/nbd.h | 1 + block/nbd.c | 49 +++++++++++++++++++++------------------------ nbd/client.c | 5 +++++ nbd/server.c | 5 +++++ 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/include/block/nbd.h b/include/block/nbd.h index 316fd705a9..330f40142a 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -360,6 +360,7 @@ void nbd_server_start(SocketAddress *addr, const char *tls_creds, static inline int nbd_read(QIOChannel *ioc, void *buffer, size_t size, const char *desc, Error **errp) { + ERRP_AUTO_PROPAGATE(); int ret = qio_channel_read_all(ioc, buffer, size, errp) < 0 ? -EIO : 0; if (ret < 0) { diff --git a/block/nbd.c b/block/nbd.c index c66fdf54b9..2f8a924562 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -805,10 +805,10 @@ static int nbd_co_receive_cmdread_reply(BDRVNBDState *s, uint64_t handle, uint64_t offset, QEMUIOVector *qiov, int *request_ret, Error **errp) { + ERRP_AUTO_PROPAGATE(); NBDReplyChunkIter iter; NBDReply reply; void *payload = NULL; - Error *local_err = NULL; NBD_FOREACH_REPLY_CHUNK(s, iter, handle, s->info.structured_reply, qiov, &reply, &payload) @@ -827,20 +827,20 @@ static int nbd_co_receive_cmdread_reply(BDRVNBDState *s, uint64_t handle, break; case NBD_REPLY_TYPE_OFFSET_HOLE: ret = nbd_parse_offset_hole_payload(s, &reply.structured, payload, - offset, qiov, &local_err); + offset, qiov, errp); if (ret < 0) { nbd_channel_error(s, ret); - nbd_iter_channel_error(&iter, ret, &local_err); + nbd_iter_channel_error(&iter, ret, errp); } break; default: if (!nbd_reply_type_is_error(chunk->type)) { /* not allowed reply type */ nbd_channel_error(s, -EINVAL); - error_setg(&local_err, + error_setg(errp, "Unexpected reply type: %d (%s) for CMD_READ", chunk->type, nbd_reply_type_lookup(chunk->type)); - nbd_iter_channel_error(&iter, -EINVAL, &local_err); + nbd_iter_channel_error(&iter, -EINVAL, errp); } } @@ -858,10 +858,10 @@ static int nbd_co_receive_blockstatus_reply(BDRVNBDState *s, NBDExtent *extent, int *request_ret, Error **errp) { + ERRP_AUTO_PROPAGATE(); NBDReplyChunkIter iter; NBDReply reply; void *payload = NULL; - Error *local_err = NULL; bool received = false; assert(!extent->length); @@ -875,27 +875,27 @@ static int nbd_co_receive_blockstatus_reply(BDRVNBDState *s, case NBD_REPLY_TYPE_BLOCK_STATUS: if (received) { nbd_channel_error(s, -EINVAL); - error_setg(&local_err, "Several BLOCK_STATUS chunks in reply"); - nbd_iter_channel_error(&iter, -EINVAL, &local_err); + error_setg(errp, "Several BLOCK_STATUS chunks in reply"); + nbd_iter_channel_error(&iter, -EINVAL, errp); } received = true; ret = nbd_parse_blockstatus_payload(s, &reply.structured, payload, length, extent, - &local_err); + errp); if (ret < 0) { nbd_channel_error(s, ret); - nbd_iter_channel_error(&iter, ret, &local_err); + nbd_iter_channel_error(&iter, ret, errp); } break; default: if (!nbd_reply_type_is_error(chunk->type)) { nbd_channel_error(s, -EINVAL); - error_setg(&local_err, + error_setg(errp, "Unexpected reply type: %d (%s) " "for CMD_BLOCK_STATUS", chunk->type, nbd_reply_type_lookup(chunk->type)); - nbd_iter_channel_error(&iter, -EINVAL, &local_err); + nbd_iter_channel_error(&iter, -EINVAL, errp); } } @@ -904,8 +904,8 @@ static int nbd_co_receive_blockstatus_reply(BDRVNBDState *s, } if (!extent->length && !iter.request_ret) { - error_setg(&local_err, "Server did not reply with any status extents"); - nbd_iter_channel_error(&iter, -EIO, &local_err); + error_setg(errp, "Server did not reply with any status extents"); + nbd_iter_channel_error(&iter, -EIO, errp); } error_propagate(errp, iter.err); @@ -1173,16 +1173,15 @@ static void nbd_client_close(BlockDriverState *bs) static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr, Error **errp) { + ERRP_AUTO_PROPAGATE(); QIOChannelSocket *sioc; - Error *local_err = NULL; sioc = qio_channel_socket_new(); qio_channel_set_name(QIO_CHANNEL(sioc), "nbd-client"); - qio_channel_socket_connect_sync(sioc, saddr, &local_err); - if (local_err) { + qio_channel_socket_connect_sync(sioc, saddr, errp); + if (*errp) { object_unref(OBJECT(sioc)); - error_propagate(errp, local_err); return NULL; } @@ -1486,10 +1485,10 @@ static bool nbd_process_legacy_socket_options(QDict *output_options, static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options, Error **errp) { + ERRP_AUTO_PROPAGATE(); SocketAddress *saddr = NULL; QDict *addr = NULL; Visitor *iv = NULL; - Error *local_err = NULL; qdict_extract_subqdict(options, &addr, "server."); if (!qdict_size(addr)) { @@ -1502,9 +1501,8 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options, goto done; } - visit_type_SocketAddress(iv, NULL, &saddr, &local_err); - if (local_err) { - error_propagate(errp, local_err); + visit_type_SocketAddress(iv, NULL, &saddr, errp); + if (*errp) { goto done; } @@ -1597,15 +1595,14 @@ static QemuOptsList nbd_runtime_opts = { static int nbd_process_options(BlockDriverState *bs, QDict *options, Error **errp) { + ERRP_AUTO_PROPAGATE(); BDRVNBDState *s = bs->opaque; QemuOpts *opts; - Error *local_err = NULL; int ret = -EINVAL; opts = qemu_opts_create(&nbd_runtime_opts, NULL, 0, &error_abort); - qemu_opts_absorb_qdict(opts, options, &local_err); - if (local_err) { - error_propagate(errp, local_err); + qemu_opts_absorb_qdict(opts, options, errp); + if (*errp) { goto error; } diff --git a/nbd/client.c b/nbd/client.c index f6733962b4..6e510f4a14 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -68,6 +68,7 @@ static int nbd_send_option_request(QIOChannel *ioc, uint32_t opt, uint32_t len, const char *data, Error **errp) { + ERRP_AUTO_PROPAGATE(); NBDOption req; QEMU_BUILD_BUG_ON(sizeof(req) != 16); @@ -153,6 +154,7 @@ static int nbd_receive_option_reply(QIOChannel *ioc, uint32_t opt, static int nbd_handle_reply_err(QIOChannel *ioc, NBDOptionReply *reply, bool strict, Error **errp) { + ERRP_AUTO_PROPAGATE(); g_autofree char *msg = NULL; if (!(reply->type & (1 << 31))) { @@ -331,6 +333,7 @@ static int nbd_receive_list(QIOChannel *ioc, char **name, char **description, static int nbd_opt_info_or_go(QIOChannel *ioc, uint32_t opt, NBDExportInfo *info, Error **errp) { + ERRP_AUTO_PROPAGATE(); NBDOptionReply reply; uint32_t len = strlen(info->name); uint16_t type; @@ -870,6 +873,7 @@ static int nbd_start_negotiate(AioContext *aio_context, QIOChannel *ioc, bool structured_reply, bool *zeroes, Error **errp) { + ERRP_AUTO_PROPAGATE(); uint64_t magic; trace_nbd_start_negotiate(tlscreds, hostname ? hostname : ""); @@ -1005,6 +1009,7 @@ int nbd_receive_negotiate(AioContext *aio_context, QIOChannel *ioc, const char *hostname, QIOChannel **outioc, NBDExportInfo *info, Error **errp) { + ERRP_AUTO_PROPAGATE(); int result; bool zeroes; bool base_allocation = info->base_allocation; diff --git a/nbd/server.c b/nbd/server.c index d8d1e62455..fdb93aab3f 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -211,6 +211,7 @@ static int GCC_FMT_ATTR(4, 0) nbd_negotiate_send_rep_verr(NBDClient *client, uint32_t type, Error **errp, const char *fmt, va_list va) { + ERRP_AUTO_PROPAGATE(); g_autofree char *msg = NULL; int ret; size_t len; @@ -365,6 +366,7 @@ static int nbd_opt_read_name(NBDClient *client, char *name, uint32_t *length, static int nbd_negotiate_send_rep_list(NBDClient *client, NBDExport *exp, Error **errp) { + ERRP_AUTO_PROPAGATE(); size_t name_len, desc_len; uint32_t len; const char *name = exp->name ? exp->name : ""; @@ -427,6 +429,7 @@ static void nbd_check_meta_export(NBDClient *client) static int nbd_negotiate_handle_export_name(NBDClient *client, bool no_zeroes, Error **errp) { + ERRP_AUTO_PROPAGATE(); char name[NBD_MAX_NAME_SIZE + 1]; char buf[NBD_REPLY_EXPORT_NAME_SIZE] = ""; size_t len; @@ -1260,6 +1263,7 @@ static int nbd_negotiate_options(NBDClient *client, Error **errp) */ static coroutine_fn int nbd_negotiate(NBDClient *client, Error **errp) { + ERRP_AUTO_PROPAGATE(); char buf[NBD_OLDSTYLE_NEGOTIATE_SIZE] = ""; int ret; @@ -1631,6 +1635,7 @@ void nbd_export_close(NBDExport *exp) void nbd_export_remove(NBDExport *exp, NbdServerRemoveMode mode, Error **errp) { + ERRP_AUTO_PROPAGATE(); if (mode == NBD_SERVER_REMOVE_MODE_HARD || QTAILQ_EMPTY(&exp->clients)) { nbd_export_close(exp); return; -- 2.21.0