From patchwork Wed Nov 5 20:22:56 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bodo Stroesser X-Patchwork-Id: 5237911 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id D3070C11AC for ; Wed, 5 Nov 2014 20:23:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 486E62015E for ; Wed, 5 Nov 2014 20:23:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8BC5A2012F for ; Wed, 5 Nov 2014 20:23:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751643AbaKEUXc (ORCPT ); Wed, 5 Nov 2014 15:23:32 -0500 Received: from dgate20.ts.fujitsu.com ([80.70.172.51]:64200 "EHLO dgate20.ts.fujitsu.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751565AbaKEUW6 (ORCPT ); Wed, 5 Nov 2014 15:22:58 -0500 DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns; h=Message-Id:Date:X-SBRSScore:X-IronPort-AV:Received: X-IronPort-AV:Received:From:To:Cc:Subject:Content-Type: Content-Transfer-Encoding; b=pDLc3fd6WiGBpfFjkUk1ffjZZKAi4TK2DxuA1FaedyiW9tWX0Ou/q8uf QJCfbAUAdhxy/1KjDuBy+IGlaPk2D2X60y4ks8PJXeg63Afb4lylX7eeQ 8Gi3Qa1PaHl61WypJ001pX+r/+yoW5fLLm1Dk7zztW/RUyjHMwAn935ZP WdDhfa12HYN0aU3yq8BdJPkFQwfmlAbHSl6+LWHIas+DixU/N9R1kVej+ Vwoo3aZpTVXPkKsyWtCzQhWpCTcaZ; DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=ts.fujitsu.com; i=@ts.fujitsu.com; q=dns/txt; s=s1536b; t=1415218977; x=1446754977; h=from:to:cc:subject:content-transfer-encoding:message-id: date; bh=CB0lcIb7t/6mO/MI85pQwfboNfMtpdekHH8X9zCSvW8=; b=P8SsxaVq6baxXjP6IPdg3C+odUiqWbfalal6i1DuWJdwbxP3uPyCS3e4 350Kjm1djxWw7hMW2eLT1sFnHSJLCa0LUNxMoo2qJlzynnTye+pmx01N6 8fRWnf88Fab7TkGQ7ccRYmWIt19ihF05s/P5Qc48lBfLaaDWtqxTp/tn4 QQ1OpZWRYpD3g7vxbAK0vBSQOOyoxiUFm6BnLxRqZzruh8ytGsKnILrNA JySxJZDgQenaYUrVWyn6uYBedNJjv; Message-Id: <61eb00$5diu09@dgate20u.abg.fsc.net> Date: 05 Nov 2014 21:22:56 +0100 X-SBRSScore: None X-IronPort-AV: E=Sophos;i="5.07,321,1413237600"; d="scan'208";a="182024201" Received: from unknown (HELO abgdate50u.abg.fsc.net) ([172.25.138.66]) by dgate20u.abg.fsc.net with ESMTP; 05 Nov 2014 21:22:56 +0100 X-IronPort-AV: E=Sophos;i="5.07,321,1413237600"; d="scan'208";a="53679424" Received: from unknown (HELO BridgeHost.test.fsc.net) ([172.17.68.112]) by abgdate50u.abg.fsc.net with SMTP; 05 Nov 2014 21:22:56 +0100 From: bstroesser@ts.fujitsu.com To: neilb@suse.de, linux-nfs@vger.kernel.org Cc: bfields@fieldses.org, bstroesser@ts.fujitsu.com Subject: [nfs-utils] [PATCH 1/3] rpc.mountd: set nonblocking mode if no libtirpc Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Spam-Status: No, score=-5.6 required=5.0 tests=BAYES_00,DKIM_SIGNED, MIME_BASE64_BLANKS, MIME_BASE64_TEXT, MSGID_FROM_MTA_HEADER, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Bodo Stroesser Date: Thu, 09 Oct 2014 13:06:19 +0200 Subject: [nfs-utils] [PATCH 1/3] rpc.mountd: set nonblocking mode if no libtirpc If mountd is built without libtirpc and it is started using "-p XXX" option, the tcp listeners and the sockets waiting for UDP messages are not in non-blocking mode. Thus if running with multiple threads (-t XX), all threads will wake up from select on a connection request or a UDP message, but only one thread will succeed. All others will wait on accept() or read() for the next event. Signed-off-by: Bodo Stroesser --- nfs-utils-1.3.1/support/include/nfslib.h 2014-10-09 12:52:30.000000000 +0200 +++ nfs-utils-1.3.1/support/include/nfslib.h 2014-10-09 12:53:37.000000000 +0200 @@ -174,6 +174,7 @@ void closeall(int min); int svctcp_socket (u_long __number, int __reuse); int svcudp_socket (u_long __number); +int svcsock_nonblock (int __sock); /* Misc shared code prototypes */ size_t strlcat(char *, const char *, size_t); --- nfs-utils-1.3.1/support/nfs/svc_socket.c 2014-10-09 12:56:14.000000000 +0200 +++ nfs-utils-1.3.1/support/nfs/svc_socket.c 2014-10-09 13:10:44.000000000 +0200 @@ -76,6 +76,39 @@ int getservport(u_long number, const cha return 0; } +int +svcsock_nonblock(int sock) +{ + int flags; + + if (sock < 0) + return sock; + + /* This socket might be shared among multiple processes + * if mountd is run multi-threaded. So it is safest to + * make it non-blocking, else all threads might wake + * one will get the data, and the others will block + * indefinitely. + * In all cases, transaction on this socket are atomic + * (accept for TCP, packet-read and packet-write for UDP) + * so O_NONBLOCK will not confuse unprepared code causing + * it to corrupt messages. + * It generally safest to have O_NONBLOCK when doing an accept + * as if we get a RST after the SYN and before accept runs, + * we can block despite being told there was an acceptable + * connection. + */ + if ((flags = fcntl(sock, F_GETFL)) < 0) + perror(_("svc_socket: can't get socket flags")); + else if (fcntl(sock, F_SETFL, flags|O_NONBLOCK) < 0) + perror(_("svc_socket: can't set socket flags")); + else + return sock; + + (void) __close(sock); + return -1; +} + static int svc_socket (u_long number, int type, int protocol, int reuse) { @@ -113,38 +146,7 @@ svc_socket (u_long number, int type, int sock = -1; } - if (sock >= 0) - { - /* This socket might be shared among multiple processes - * if mountd is run multi-threaded. So it is safest to - * make it non-blocking, else all threads might wake - * one will get the data, and the others will block - * indefinitely. - * In all cases, transaction on this socket are atomic - * (accept for TCP, packet-read and packet-write for UDP) - * so O_NONBLOCK will not confuse unprepared code causing - * it to corrupt messages. - * It generally safest to have O_NONBLOCK when doing an accept - * as if we get a RST after the SYN and before accept runs, - * we can block despite being told there was an acceptable - * connection. - */ - int flags; - if ((flags = fcntl(sock, F_GETFL)) < 0) - { - perror (_("svc_socket: can't get socket flags")); - (void) __close (sock); - sock = -1; - } - else if (fcntl(sock, F_SETFL, flags|O_NONBLOCK) < 0) - { - perror (_("svc_socket: can't set socket flags")); - (void) __close (sock); - sock = -1; - } - } - - return sock; + return svcsock_nonblock(sock); } /* --- nfs-utils-1.3.1/support/nfs/rpcmisc.c 2014-10-08 21:22:04.000000000 +0200 +++ nfs-utils-1.3.1/support/nfs/rpcmisc.c 2014-10-08 21:22:36.000000000 +0200 @@ -104,7 +104,7 @@ makesock(int port, int proto) return -1; } - return sock; + return svcsock_nonblock(sock); } void