From patchwork Fri Jan 26 03:08:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhoujian (jay)" X-Patchwork-Id: 10185037 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 95669602B7 for ; Fri, 26 Jan 2018 03:10:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7DDC02878C for ; Fri, 26 Jan 2018 03:10:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7239B28B5C; Fri, 26 Jan 2018 03:10:19 +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 C61662878C for ; Fri, 26 Jan 2018 03:10:18 +0000 (UTC) Received: from localhost ([::1]:54125 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eeuPB-0005YG-5m for patchwork-qemu-devel@patchwork.kernel.org; Thu, 25 Jan 2018 22:10:17 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41771) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eeuON-00058q-Qa for qemu-devel@nongnu.org; Thu, 25 Jan 2018 22:09:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eeuOK-0006vw-Jf for qemu-devel@nongnu.org; Thu, 25 Jan 2018 22:09:27 -0500 Received: from [45.249.212.32] (port=52547 helo=huawei.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eeuOK-0006qJ-72 for qemu-devel@nongnu.org; Thu, 25 Jan 2018 22:09:24 -0500 Received: from DGGEMS408-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id A24C8CE83E266; Fri, 26 Jan 2018 11:09:05 +0800 (CST) Received: from localhost (10.177.19.14) by DGGEMS408-HUB.china.huawei.com (10.3.19.208) with Microsoft SMTP Server id 14.3.361.1; Fri, 26 Jan 2018 11:09:00 +0800 From: Jay Zhou To: Date: Fri, 26 Jan 2018 11:08:16 +0800 Message-ID: <1516936096-48900-1-git-send-email-jianjay.zhou@huawei.com> X-Mailer: git-send-email 2.6.1.windows.1 MIME-Version: 1.0 X-Originating-IP: [10.177.19.14] X-CFilter-Loop: Reflected X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 45.249.212.32 Subject: [Qemu-devel] [PATCH v2] tap: close fd conditionally when error occured 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: weidong.huang@huawei.com, mst@redhat.com, jasowang@redhat.com, arei.gonglei@huawei.com, jianjay.zhou@huawei.com, imammedo@redhat.com, wangxinxin.wang@huawei.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP If netdev_add tap,id=net0,...,vhost=on failed in net_init_tap_one(), the followed up device_add virtio-net-pci,netdev=net0 will fail too, prints: TUNSETOFFLOAD ioctl() failed: Bad file descriptor TUNSETOFFLOAD ioctl() failed: Bad file descriptor The reason is that the fd of tap is closed when error occured after calling net_init_tap_one(). The fd should be closed when calling net_init_tap_one failed: - if tap_set_sndbuf() failed - if tap_set_sndbuf() succeeded but vhost failed to initialize with vhostforce flag on The fd should not be closed just because vhost failed to initialize but without vhostforce flag. So the followed up device_add can fall back to userspace virtio successfully. Suggested-by: Michael S. Tsirkin Suggested-by: Igor Mammedov Suggested-by: Jason Wang Signed-off-by: Jay Zhou --- net/tap.c | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/net/tap.c b/net/tap.c index 979e622..8042c7d 100644 --- a/net/tap.c +++ b/net/tap.c @@ -648,12 +648,6 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer, TAPState *s = net_tap_fd_init(peer, model, name, fd, vnet_hdr); int vhostfd; - tap_set_sndbuf(s->fd, tap, &err); - if (err) { - error_propagate(errp, err); - return; - } - if (tap->has_fd || tap->has_fds) { snprintf(s->nc.info_str, sizeof(s->nc.info_str), "fd=%d", fd); } else if (tap->has_helper) { @@ -781,6 +775,12 @@ int net_init_tap(const Netdev *netdev, const char *name, vnet_hdr = tap_probe_vnet_hdr(fd); + tap_set_sndbuf(fd, tap, &err); + if (err) { + error_propagate(errp, err); + return -1; + } + net_init_tap_one(tap, peer, "tap", name, NULL, script, downscript, vhostfdname, vnet_hdr, fd, &err); @@ -832,6 +832,12 @@ int net_init_tap(const Netdev *netdev, const char *name, goto free_fail; } + tap_set_sndbuf(fd, tap, &err); + if (err) { + error_propagate(errp, err); + goto free_fail; + } + net_init_tap_one(tap, peer, "tap", name, ifname, script, downscript, tap->has_vhostfds ? vhost_fds[i] : NULL, @@ -872,12 +878,21 @@ free_fail: fcntl(fd, F_SETFL, O_NONBLOCK); vnet_hdr = tap_probe_vnet_hdr(fd); + tap_set_sndbuf(fd, tap, &err); + if (err) { + error_propagate(errp, err); + close(fd); + return -1; + } + net_init_tap_one(tap, peer, "bridge", name, ifname, script, downscript, vhostfdname, vnet_hdr, fd, &err); if (err) { error_propagate(errp, err); - close(fd); + if (tap->has_vhostforce && tap->vhostforce) { + close(fd); + } return -1; } } else { @@ -910,13 +925,22 @@ free_fail: } } + tap_set_sndbuf(fd, tap, &err); + if (err) { + error_propagate(errp, err); + close(fd); + return -1; + } + net_init_tap_one(tap, peer, "tap", name, ifname, i >= 1 ? "no" : script, i >= 1 ? "no" : downscript, vhostfdname, vnet_hdr, fd, &err); if (err) { error_propagate(errp, err); - close(fd); + if (tap->has_vhostforce && tap->vhostforce) { + close(fd); + } return -1; } }