From patchwork Tue Mar 23 05:47:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nagendra Tomar X-Patchwork-Id: 12156941 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=-16.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 01A99C433C1 for ; Tue, 23 Mar 2021 05:48:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C510561983 for ; Tue, 23 Mar 2021 05:48:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229452AbhCWFrn (ORCPT ); Tue, 23 Mar 2021 01:47:43 -0400 Received: from mail-eopbgr1300125.outbound.protection.outlook.com ([40.107.130.125]:18976 "EHLO APC01-HK2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229728AbhCWFrN (ORCPT ); Tue, 23 Mar 2021 01:47:13 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IWIXltSf3YY6j4PDSXvzaFHDinagLppKvAP8hfgLjjKhOSlK6bt72+1dyJv7fh73AlGuAszMtNSlQepkT06N9TsMTC4N7nJxEs5v+rqXQoc83uQAWWyp1F/ngiaU6p0aHLPzFzj98JozvAAj2YH6ZbhBSw6lxtKbmjrjmV/PkZMYSK7E2L2SsLSi7bGdsCB5ul06QI0U7x6tGo/ezg95+d7thHy1DBOxrTpTsfKpHuD1BX2OzKuNZOnmEMUKiBRXfrBh9P1wQjOJzyvGPoVHQPyyVCStChksxtnYDB2MmXXKSJjw9MGTESaS2MJB9utXbHh8i9LjYqimg28I9EIYwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7ni3LKiJjZr3RHBnoH96R+0V9LlBJjfKyPKiVzr7CIQ=; b=a+DP/ss/oKwAErX/Od3Sy3d+3ZuweP2qNCFdowqn3u9rCEOgo6k7G2IgCL9mXlBSsI1LsJ2lsgoUIt4nEbtjbO1hf3ixxZFfbYUc1vyIuSxR+rxZeubDrIuQ2qZ0obCwBV8AcEAtH87us8xU3HA0u0Ewa40FP5Vkg4exsU7UpnZ4G8LiJkwbO5LEoJ3dgg3bVSpCI6OW8ylLqzzQGQ7Ur3qCdYjg8wQBynvB2aPKQ9q2gCcMFzvOphARCeye2uJupkCwfxRF3reNfKU85cTnVSgNo5CcGPdGuzuoauTxXa3Kbh8Z5/RosWAXbtNAvkcP4VCkjH6uCddlAHsgPyQyRQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microsoft.com; dmarc=pass action=none header.from=microsoft.com; dkim=pass header.d=microsoft.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7ni3LKiJjZr3RHBnoH96R+0V9LlBJjfKyPKiVzr7CIQ=; b=SKm/VdXOOHGCzv6qgJsiQH9BjswlgEYlGH1jBerXZaAcGw4yp6HqNM9QnFpTKhvKv3thl3x5/K4yvGcY6i5afbmDB6Gn5nNlXjZx7NPRR7FBJ0tdFzdebQhehtdBEidO9kkPBcmBhsmPrNSlozGppHbOPBJjHaj5z+B0BLbP778= Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM (2603:1096:0:4::11) by SG2P15301MB0064.APCP153.PROD.OUTLOOK.COM (2603:1096:3:10::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3999.6; Tue, 23 Mar 2021 05:47:10 +0000 Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488]) by SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488%5]) with mapi id 15.20.3999.008; Tue, 23 Mar 2021 05:47:10 +0000 From: Nagendra Tomar To: "linux-nfs@vger.kernel.org" CC: Trond Myklebust , "anna.schumaker@netapp.com" Subject: [PATCH 1/5] nfs: Add mount option for forcing RPC requests for one file over one connection Thread-Topic: [PATCH 1/5] nfs: Add mount option for forcing RPC requests for one file over one connection Thread-Index: Adcfp+U1aW330QBCRYC69f9ZVFWEig== Date: Tue, 23 Mar 2021 05:47:10 +0000 Message-ID: Accept-Language: en-IN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=microsoft.com; x-originating-ip: [122.172.188.128] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: b12506ab-7a8f-4ea5-6233-08d8edbf19fc x-ms-traffictypediagnostic: SG2P15301MB0064: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:5516; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: J5gUlV1+08mt8SLr7fzxIPSzyhkGyBMKQypOZSZMuPXYq6txwmvwMi97V4T9Kr28xHm/lQyw3EdvXwZdSG/L6Yv6YE/Epk/TGiLGycH3/yq+Si9xE/u+G2GQCTcrjuvhbOYjcHMcgbYwotgrO3rPu6/aq+ys2gFGPLvju9P+/alix5frqcH41z1kOB3+rjtbT1AO51N7SJ3neZlyvX2mtF6fNfZ/j00V0tBOaZupYDFGah4EtoAH0UWwbBi+NjObfL7pyfGe/z15PuC6Qk3H3hoLTbgw9mMmNrX/KVPkspFsHTRvoP6xiYiF550Y3W5XQA4Xxe3776J+C95NjCEFHsWYauqmrAQyAqRLdCQ1Pd6+BhDgmYgcdFMS7uMlvPVpwmh5bGxffjj7mVgxYJr5cYE4oL62F+/aa/+Z4ymwCUsmFYXyFaMin1mBC+ItLMzGsox5EoqdqRFW8GXu+hnQ9zYp2wnUaCLjgyCypr69wZ7KWrmCNGnyy+tm/MpmmlykcYOrOpECQHygynx4IyrNJqSn1ocw6SE1hEC9NE64fyEJ0VEx48MHZRCj/69XI0d6zxfFDa1OC2V5gbSyodGtolHPJLpya+QRNiJJf1onk5U2OUJmoKb3cW6kFcBKvT7969GdcDiRUa+Hsa5kYiQ7Z7VYmFgmKCawDDxoPxPNjD0= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SG2P153MB0361.APCP153.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(4636009)(376002)(39860400002)(136003)(366004)(396003)(346002)(5660300002)(316002)(52536014)(7696005)(54906003)(76116006)(33656002)(86362001)(8990500004)(10290500003)(186003)(66476007)(38100700001)(64756008)(66446008)(26005)(6506007)(6916009)(66556008)(66946007)(55236004)(71200400001)(82960400001)(2906002)(8676002)(8936002)(9686003)(55016002)(82950400001)(83380400001)(478600001)(4326008);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: 2i1jnqZvtQRbMngoC617v/m2z2h9j8GZnNtT+VKdHuEuu7KmkxIjt1Ov6he2eJLZS8pYRfLFXHZZmMq86WvaYqlURrLgkANrZKp67aU6jTcFVvo0YpHsNpB88W+67RBxgKrELxo3dd4mnySLq5G5/UypukU7Xym4VB1uTjNTOa5cU+iNoa7UIlFo5yugWurV8kdd3rEaThaE6+nmr90Rwy3ALhONwITjbqqiE/8CImpwCgJzQqBEY+5cfU+MiuFcG41u+fPRSKvEnUnm39ItlQ1rk/9SpEs7LcTbkmShqCiuvaiaQgZQ1Hr+BJFBpxHaCR3MdqDsKobvdnJf3mZIHeK55B1fD9dXvyC0XGXkCB99W/CE0KbFBdSBPBj9YDomZIHcVm+ep4AklT0Lg0Bj+ztN5CKq/YcfhYOR+c4fkwmSIRDsahtE7N/SChKKl2LdDEd+Qfyr105N0niWA8FGQ1/YEBAUdHZvZO+yeXTuRgISedG+Eqz0yGfxMJMxbxYswD0zRHePIrqnKzkcwWqqxUmXa5poeHhE+UxvWtiye7AUgkj8nqvbaes9NDTc9T+1c0YsPynbe+gnYx8ZJoGXFxful/gsqfShU5W7FbcvzNBMhXwS2k1IlMek+MxnQc5UX8u3AZQhT01GJQGB7o33ZyIfVcZyP5pgI+AMYmhL/WemsTNDz+KgoZKS2LtrcrLbUYdOHpDjcXeSr8HW0P5SfKk+bKJmsNhbTxUa0L7vIO+JS4Q7QI42DHFoFqdO7wvBez7+2UoMutUdwLpOBTfNiiSsGwgl2PCUpCGqFomQyJzLtfr0N4AaZ1Ap9YljqGWIsQWmKZvPxZYUrcLB3ExPrTEWE9o/wZGb8ypx6sxlHYUAPS/Nzvj80DFHuB/+e8CIXoxIb1LHRebXA8l+3k/lCqrh19+YMGy92u0487JP22BKza4qxVUxACL/BAuqsZlCOIlsmSO1LKqDqrRKDcJrs2dJHyDoR1i5L/wUTPYHmOQpr5ZQJy5E0v7XkQsK+a2KkNTzJSJDyW8NFEJruiZ08b9ozSNSYN1Cryf8KEbHjupJgoHZ0Y0w+IYTWnd+y//ujbZ+qKhuBW1zcUl7ryVdGHFH3JMd6AoLvl+tu4G68kldVYRz3m8b3TTjcy5Wm43kXPwHhphHHSm2thQhYLUuopBHApGBUly4Y70LD0NQCiYEFlpSOencgErzOJmx7AiUQFUBdzzWxac1AMSMCjzL6KUa1fB66v++V4T0OX4/gusVWzYoet5rK4uF3ufjB+nLgrnWV2rQzg1qN7Hq49Nfz8l+SCq8dCyxDjUjezsXL8q2AaZjXqIru9DcdwiDcyz6 x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SG2P153MB0361.APCP153.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: b12506ab-7a8f-4ea5-6233-08d8edbf19fc X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Mar 2021 05:47:10.0435 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: wpas75MtqADrZ2Bl+VA0JSKuQGSztYKuYOS3I8CsgfGH3u/NAE7xO64IfAis5rUHWA7UJsJlVr7DXrmkfC3l8w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2P15301MB0064 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Nagendra S Tomar Adds a new rpc_xprt_iter_ops which returns a xprt suitable for carrying an RPC based on an additional u32 hash parameter to identify the RPC target file. Other xprt policies, like roundrobin, which do not make use of the hash ignore it. Signed-off-by: Nagendra S Tomar --- net/sunrpc/clnt.c | 4 +- net/sunrpc/xprtmultipath.c | 91 ++++++++++++++++++++++++++++++++++-- 3 files changed, 95 insertions(+), 9 deletions(-) diff --git a/include/linux/sunrpc/xprtmultipath.h b/include/linux/sunrpc/xprtmultipath.h index c6cce3fbf29d..62caecfaa4f8 100644 --- a/include/linux/sunrpc/xprtmultipath.h +++ b/include/linux/sunrpc/xprtmultipath.h @@ -37,7 +37,11 @@ struct rpc_xprt_iter { struct rpc_xprt_iter_ops { void (*xpi_rewind)(struct rpc_xprt_iter *); struct rpc_xprt *(*xpi_xprt)(struct rpc_xprt_iter *); - struct rpc_xprt *(*xpi_next)(struct rpc_xprt_iter *); + /* + * 2nd parameter is a hash value identifying the RPC target file. + * A xprt policy may use it to affine RPCs for a file to a xprt. + */ + struct rpc_xprt *(*xpi_next)(struct rpc_xprt_iter *, u32); }; extern struct rpc_xprt_switch *xprt_switch_alloc(struct rpc_xprt *xprt, @@ -47,6 +51,7 @@ extern struct rpc_xprt_switch *xprt_switch_get(struct rpc_xprt_switch *xps); extern void xprt_switch_put(struct rpc_xprt_switch *xps); extern void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps); +extern void rpc_xprt_switch_set_hash(struct rpc_xprt_switch *xps); extern void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps, struct rpc_xprt *xprt); @@ -67,7 +72,7 @@ extern struct rpc_xprt_switch *xprt_iter_xchg_switch( extern struct rpc_xprt *xprt_iter_xprt(struct rpc_xprt_iter *xpi); extern struct rpc_xprt *xprt_iter_get_xprt(struct rpc_xprt_iter *xpi); -extern struct rpc_xprt *xprt_iter_get_next(struct rpc_xprt_iter *xpi); +extern struct rpc_xprt *xprt_iter_get_next(struct rpc_xprt_iter *xpi, u32 hash); extern bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps, const struct sockaddr *sap); diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 612f0a641f4c..1b2a02460601 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -809,7 +809,7 @@ int rpc_clnt_iterate_for_each_xprt(struct rpc_clnt *clnt, if (ret) return ret; for (;;) { - struct rpc_xprt *xprt = xprt_iter_get_next(&xpi); + struct rpc_xprt *xprt = xprt_iter_get_next(&xpi, 0); if (!xprt) break; @@ -1055,7 +1055,7 @@ rpc_task_get_first_xprt(struct rpc_clnt *clnt) static struct rpc_xprt * rpc_task_get_next_xprt(struct rpc_clnt *clnt) { - return rpc_task_get_xprt(clnt, xprt_iter_get_next(&clnt->cl_xpi)); + return rpc_task_get_xprt(clnt, xprt_iter_get_next(&clnt->cl_xpi, 0)); } static diff --git a/net/sunrpc/xprtmultipath.c b/net/sunrpc/xprtmultipath.c index 78c075a68c04..7901afa432f0 100644 --- a/net/sunrpc/xprtmultipath.c +++ b/net/sunrpc/xprtmultipath.c @@ -24,6 +24,7 @@ typedef struct rpc_xprt *(*xprt_switch_find_xprt_t)(struct rpc_xprt_switch *xps, static const struct rpc_xprt_iter_ops rpc_xprt_iter_singular; static const struct rpc_xprt_iter_ops rpc_xprt_iter_roundrobin; +static const struct rpc_xprt_iter_ops rpc_xprt_iter_hash; static const struct rpc_xprt_iter_ops rpc_xprt_iter_listall; static void xprt_switch_add_xprt_locked(struct rpc_xprt_switch *xps, @@ -176,6 +177,12 @@ void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps) WRITE_ONCE(xps->xps_iter_ops, &rpc_xprt_iter_roundrobin); } +void rpc_xprt_switch_set_hash(struct rpc_xprt_switch *xps) +{ + if (READ_ONCE(xps->xps_iter_ops) != &rpc_xprt_iter_hash) + WRITE_ONCE(xps->xps_iter_ops, &rpc_xprt_iter_hash); +} + static const struct rpc_xprt_iter_ops *xprt_iter_ops(const struct rpc_xprt_iter *xpi) { @@ -223,6 +230,13 @@ struct rpc_xprt *xprt_iter_first_entry(struct rpc_xprt_iter *xpi) return xprt_switch_find_first_entry(&xps->xps_xprt_list); } +static +struct rpc_xprt *xprt_iter_next_entry_singular(struct rpc_xprt_iter *xpi, + u32 hash) +{ + return xprt_iter_first_entry(xpi); +} + static struct rpc_xprt *xprt_switch_find_current_entry(struct list_head *head, const struct rpc_xprt *cur) @@ -352,12 +366,55 @@ struct rpc_xprt *xprt_switch_find_next_entry_roundrobin(struct rpc_xprt_switch * } static -struct rpc_xprt *xprt_iter_next_entry_roundrobin(struct rpc_xprt_iter *xpi) +struct rpc_xprt *xprt_iter_next_entry_roundrobin(struct rpc_xprt_iter *xpi, + u32 hash) { return xprt_iter_next_entry_multiple(xpi, xprt_switch_find_next_entry_roundrobin); } +struct rpc_xprt *__xprt_switch_find_next_entry_hash(struct rpc_xprt_switch *xps, + u32 hash) +{ + struct list_head *head = &xps->xps_xprt_list; + struct rpc_xprt *pos; + const u32 nactive = READ_ONCE(xps->xps_nactive); + const u32 xprt_idx = (hash % nactive); + u32 idx = 0; + + list_for_each_entry_rcu(pos, head, xprt_switch) { + if (xprt_idx > idx++) + continue; + if (xprt_is_active(pos)) + return pos; + } + return NULL; +} + +static +struct rpc_xprt *xprt_switch_find_next_entry_hash(struct rpc_xprt_switch *xps, + u32 hash) +{ + struct list_head *head = &xps->xps_xprt_list; + struct rpc_xprt *xprt; + + xprt = __xprt_switch_find_next_entry_hash(xps, hash); + if (xprt == NULL) + xprt = xprt_switch_find_first_entry(head); + return xprt; +} + +static +struct rpc_xprt *xprt_iter_next_entry_hash(struct rpc_xprt_iter *xpi, + u32 hash) +{ + struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); + + if (xps == NULL) + return NULL; + return xprt_switch_find_next_entry_hash(xps, hash); +} + static struct rpc_xprt *xprt_switch_find_next_entry_all(struct rpc_xprt_switch *xps, const struct rpc_xprt *cur) @@ -366,7 +423,7 @@ struct rpc_xprt *xprt_switch_find_next_entry_all(struct rpc_xprt_switch *xps, } static -struct rpc_xprt *xprt_iter_next_entry_all(struct rpc_xprt_iter *xpi) +struct rpc_xprt *xprt_iter_next_entry_all(struct rpc_xprt_iter *xpi, u32 hash) { return xprt_iter_next_entry_multiple(xpi, xprt_switch_find_next_entry_all); @@ -482,6 +539,22 @@ struct rpc_xprt *xprt_iter_get_helper(struct rpc_xprt_iter *xpi, return ret; } +static +struct rpc_xprt *xprt_iter_get_helper_1(struct rpc_xprt_iter *xpi, + struct rpc_xprt *(*fn)(struct rpc_xprt_iter *, u32), + u32 arg) +{ + struct rpc_xprt *ret; + + do { + ret = fn(xpi, arg); + if (ret == NULL) + break; + ret = xprt_get(ret); + } while (ret == NULL); + return ret; +} + /** * xprt_iter_get_xprt - Returns the rpc_xprt pointed to by the cursor * @xpi: pointer to rpc_xprt_iter @@ -506,12 +579,12 @@ struct rpc_xprt *xprt_iter_get_xprt(struct rpc_xprt_iter *xpi) * Returns a reference to the struct rpc_xprt that immediately follows the * entry pointed to by the cursor. */ -struct rpc_xprt *xprt_iter_get_next(struct rpc_xprt_iter *xpi) +struct rpc_xprt *xprt_iter_get_next(struct rpc_xprt_iter *xpi, u32 hash) { struct rpc_xprt *xprt; rcu_read_lock(); - xprt = xprt_iter_get_helper(xpi, xprt_iter_ops(xpi)->xpi_next); + xprt = xprt_iter_get_helper_1(xpi, xprt_iter_ops(xpi)->xpi_next, hash); rcu_read_unlock(); return xprt; } @@ -521,7 +594,7 @@ static const struct rpc_xprt_iter_ops rpc_xprt_iter_singular = { .xpi_rewind = xprt_iter_no_rewind, .xpi_xprt = xprt_iter_first_entry, - .xpi_next = xprt_iter_first_entry, + .xpi_next = xprt_iter_next_entry_singular, }; /* Policy for round-robin iteration of entries in the rpc_xprt_switch */ @@ -532,6 +605,14 @@ const struct rpc_xprt_iter_ops rpc_xprt_iter_roundrobin = { .xpi_next = xprt_iter_next_entry_roundrobin, }; +/* Policy for returning a hashed entry from the rpc_xprt_switch */ +static +const struct rpc_xprt_iter_ops rpc_xprt_iter_hash = { + .xpi_rewind = xprt_iter_default_rewind, + .xpi_xprt = xprt_iter_current_entry, + .xpi_next = xprt_iter_next_entry_hash, +}; + /* Policy for once-through iteration of entries in the rpc_xprt_switch */ static const struct rpc_xprt_iter_ops rpc_xprt_iter_listall = { From patchwork Tue Mar 23 05:48:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nagendra Tomar X-Patchwork-Id: 12156943 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=-16.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 3B2AAC433C1 for ; Tue, 23 Mar 2021 05:49:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 00D34619B3 for ; Tue, 23 Mar 2021 05:49:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229504AbhCWFst (ORCPT ); Tue, 23 Mar 2021 01:48:49 -0400 Received: from mail-eopbgr1300091.outbound.protection.outlook.com ([40.107.130.91]:23605 "EHLO APC01-HK2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229493AbhCWFsp (ORCPT ); Tue, 23 Mar 2021 01:48:45 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CYmYvrG56O4+k8x0fJWg1+Xgw8cTijnjJCwpiffYRy6NZKdxAepfmeXes78KZyV4E6ojQ0XN79u0Gk7Qvwl/q8yH+JPB0S0nCLK/l7NCJuUa1otDp6V3mE/eHg5KhCHG1DRp7QBZMA5AMF04NjMl/ExtJBoxO5RR/XZ07tFGxs0MxlBd+yW3/Cmij7zk2GyaegdObcv6rkt7//H8hwr/9yGNLseNQj72QvlCTgbMs68eV3C4IVZu6+59Uie2xrxLxLoiWLuf97e4SbgC4rQ09Amf4BA1Pju7ACXOX1zLFsqqSEAO3mxFPr8VAFcvMJHWZQtCjcjSmZCvdQKXfcuCow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=az0F+9NgWI5etWNnZzlE5W37eRI8bJWC0b0tB+5io14=; b=e9dn5zDe+CBVE7TF5zFbPz3T1yc7Ix23ma0dCZAUdCQC4WGGfykr07E0suXc5nuG35oRU+TergiYLcvGRnDJYcdp/HYernFxSpWDvbXiOeFKgatWu1R4N+Jj9e9I8HZCFr3MhhmIjFa9ruZ6v/6rKI6ZODfdxetKoV37EG2H/pGaEfV29qQwBq41tXXXpC/vJKDAiWt1CTzkWH93wP5T5TuKhrRdGjqTzA9OtadTITu6YDIRammcZsgbXtGwd0hJ2ZJB/qDFgIUB27QSEfymXh1608pgZY82J5n1AX9XKKuBkhzRhJyuqIWeDvVcApTqIW5b1humkLbkNtdnk5P49A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microsoft.com; dmarc=pass action=none header.from=microsoft.com; dkim=pass header.d=microsoft.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=az0F+9NgWI5etWNnZzlE5W37eRI8bJWC0b0tB+5io14=; b=ZSp52Hl4O/Nw7a8G0Y88DrzeoR00uOblI7f40sLLfA3xKaz2Xaakc006Pljnnx+RdQAhWkzYGdPLIFulqcT9Fg3WkXHBEtZEeeJlH2C/ZeyYigGY7iHHw1+zMas74Qw5KyzWXmZiMrR67TLud0RJ+gfv8DHotc1saNgRzz6COwg= Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM (2603:1096:0:4::11) by SG2P15301MB0064.APCP153.PROD.OUTLOOK.COM (2603:1096:3:10::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3999.6; Tue, 23 Mar 2021 05:48:42 +0000 Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488]) by SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488%5]) with mapi id 15.20.3999.008; Tue, 23 Mar 2021 05:48:42 +0000 From: Nagendra Tomar To: "linux-nfs@vger.kernel.org" CC: Trond Myklebust , "anna.schumaker@netapp.com" Subject: [PATCH 2/5] nfs: Add mount option for forcing RPC requests to one file over one connection Thread-Topic: [PATCH 2/5] nfs: Add mount option for forcing RPC requests to one file over one connection Thread-Index: AdcfqBhZ8OmTEm29SYee8i/OAvQvnQ== Date: Tue, 23 Mar 2021 05:48:42 +0000 Message-ID: Accept-Language: en-IN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=microsoft.com; x-originating-ip: [122.172.188.128] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: c75faff6-2539-4f57-c7b1-08d8edbf5118 x-ms-traffictypediagnostic: SG2P15301MB0064: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:3513; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: +Vr858O8bKyc0P5v8bsLA1zMU45APVRcRhT4FvY/EKVmLSF/LmoEnYbyY6r7v7/vsm/9iZIoQvFvem48K8aoDjJ8BMEJZhW++KrJrDL1HS4jwN8LmfPb1pmBC8azknr4RsHmKEvm883+W3tn2Z0GdbkxQCbrZuwaQCm5SrNH/Qj4CbXWGlCK3F/7m7V5mG5I72JOu2DG1VnvdRq7TnSjGpOvWnPp8c5gfoDMWAgPltksOu4/pY9zlJyTybVbffYOYzY5+Xo1ITtt3mzf6Jy3k/ACsDVjqsg2AELO+FNQ4GChmxJ/E8O42bH2Q7KFfVYPryqWtev2OEf81LziehLZrsEKXHiSvYjZYNsNlBAh/uFVL5l1sRJFVijbx9KJVOOaho9MgEWWbirvSIXPBDHyZY/wUYRkGe10w8PWYQVTf6ZY0dT8+xb1Vg6LlslU8l7QZx9pY25SLvk2HjWVWbotm/vzmt5Q2RYLGVKA3jOwjLcDR3R9vzxa+zZbcYJylM2QYva+qmLvl20aDrYrb+U3G1LdIGIy3/b3r9mMkopMtWbBFZKul112AJQ2xyHo8lY7wo6ktPoCzbyoVj1oW91I8nGWd7OmE02XfXC8kvE5bxmjfoVGeboPl6I/wXTvuAEzL/AqViqJKxJW2DHJjIcJ0VLADAfZRIeLHxBfDw343Qg= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SG2P153MB0361.APCP153.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(4636009)(376002)(39860400002)(136003)(366004)(396003)(346002)(5660300002)(316002)(52536014)(7696005)(54906003)(76116006)(33656002)(86362001)(8990500004)(10290500003)(186003)(66476007)(38100700001)(30864003)(64756008)(66446008)(26005)(6506007)(6916009)(66556008)(66946007)(55236004)(71200400001)(82960400001)(2906002)(8676002)(8936002)(9686003)(55016002)(82950400001)(83380400001)(478600001)(4326008);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: 7sdnCIw8SpyuJHLO9duT/xQIikyTACdcAXe4sYyecdOcPLLwYZxVwOiZT+KtjAwmC1MkeMj3APG3r/iTcX7StDhSM3ClEMyZZdlqruCELaBsGqbRiTwNOovBZfzrKkoF3ezYJ3VWne9kPYJLR2y0HujZwHvvpjHN5LCnHo3rqR65hZMlkC+K6G5G1rbAVd01xv6Mgy38MsPef2SVHcCULgKBipR4SmYv7CxMmjBYbMzvHuLgBwtSJltMuqTETeSzwiy/MeXbftJKgGuHIa6PZcQ4NsrvGeTaq02YgA/KXOzaTJDbLk8LLfELpUd/XEUJrL9eecdpKpUW6m0XvcSwW9i26/nWvBfN0PDFFRuAMUBxBvJ4MHU42CaKOyr7zlbGYV31SusaOUV1+caZ5udAQRmiXKjAe/hDGwMNK5sbgNi7WjWivG1w5ekE8NchRgnuzrR8p5CHj99EgAX85pfkP9JNzXKGFSemgyH+6avp/zKzgDx3pMx2pPPUQSDHOzWJh/rFwoTjz/UJEgpOZvnNS6OguS8YhKIo6vAk21XbbH6zG6zIXUCPev9ToZv7hBfil4bRxT6jP7ElorYFPIQU7R/2mW8FtAk05n+a0Sft533QxSb8JRdcKjSiI9VTBy5v2W532MIKN3BNBAaOEW/rM4uNezvhQm0GaxA9bz4VjJzMhMj5WiIg+IvsM3woFAFHJB56ccsB1pyGUvi6yaPoqPgqoJPC6y+eLGDKALFAX66Tb3xeRyQWvSZxCs/dHmpospARocRBl3rM6yIyC9N/pSQWah5UB9Irol+HVKL7637inObT2f1NYoUZcy9tL6izN9nB4eBFfdy7KIQEYJI+nNIMREX+QLxDEEK9Sa4SQ9gPFQBeHs7mGnvbHROhv1ni22q2d++O8IGlWFHEdBsD/EIBuMNCfzozS3I3k8jc73jE1p17kOF30SKYmMeixrmeFExWZIH2CmPhtO0A7odvk9Jj0gRlluT7kt+c70irKYHFy4bpyIuDZaLujwDnFHqO0WFyC27Sfxn4MNUaf6eWKC2NO8Nbe9yg6f1384qaM10Y1CGjNXHAycwgo2uMXUEDzi85e0muY67056TZvogLI1Rs94zU1rLMB/iegSRr+UDUTD77i/fLAyQWqDL7LwTMz86l1NqSsICbxUyuuGTzXzFN8zv/nyrIXtyAbccBQB5P+dLSueiNYPavKx0mEpyRuNoWV/wPYrJhgGOzTiYz8L+KIxs3H/f+pDLaIWaidfT8dLRz8I45K+m0HD82fJshsLieJpdM31zZFNDj2m0VT89udXwCGn+kkcp5iOf7T19r8eqqhJgU3XfsmH5oKpTt x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SG2P153MB0361.APCP153.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: c75faff6-2539-4f57-c7b1-08d8edbf5118 X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Mar 2021 05:48:42.5511 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Yd24qkTcjKOo+k7SSDM6/dovUfiIh1QYUfjXUysfdBm7CT1XtsufFFGgReXsNjPmdLTT8iv/4ULkN3OzjRT/lQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2P15301MB0064 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Nagendra S Tomar Adds a new mount option ncpolicy=roundrobin|hash which allows user to select the nconnect policy for the given mount. Defaults to roundrobin. We store the user selected policy inside the rpc_clnt structure and pass it down to the RPC client where the transport selection can be accordingly done. Also adds a new function pointer p_fhhash to struct rpc_procinfo. This can be supplied to find the target file's hash for the given RPC which will then be used to affine RPCs for a file to one xprt. Signed-off-by: Nagendra S Tomar --- fs/nfs/client.c | 3 +++ fs/nfs/fs_context.c | 26 ++++++++++++++++++++++++++ fs/nfs/internal.h | 2 ++ fs/nfs/nfs3client.c | 4 +++- fs/nfs/nfs4client.c | 14 +++++++++++--- fs/nfs/super.c | 7 ++++++- include/linux/nfs_fs_sb.h | 1 + include/linux/sunrpc/clnt.h | 15 +++++++++++++++ net/sunrpc/clnt.c | 34 ++++++++++++++++++++++++++++------ 9 files changed, 95 insertions(+), 11 deletions(-) diff --git a/fs/nfs/client.c b/fs/nfs/client.c index ff5c4d0d6d13..5c2809d8368a 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -179,6 +179,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init) clp->cl_proto = cl_init->proto; clp->cl_nconnect = cl_init->nconnect; + clp->cl_ncpolicy = cl_init->ncpolicy; clp->cl_net = get_net(cl_init->net); clp->cl_principal = "*"; @@ -506,6 +507,7 @@ int nfs_create_rpc_client(struct nfs_client *clp, .net = clp->cl_net, .protocol = clp->cl_proto, .nconnect = clp->cl_nconnect, + .ncpolicy = clp->cl_ncpolicy, .address = (struct sockaddr *)&clp->cl_addr, .addrsize = clp->cl_addrlen, .timeout = cl_init->timeparms, @@ -678,6 +680,7 @@ static int nfs_init_server(struct nfs_server *server, .timeparms = &timeparms, .cred = server->cred, .nconnect = ctx->nfs_server.nconnect, + .ncpolicy = ctx->nfs_server.ncpolicy, .init_flags = (1UL << NFS_CS_REUSEPORT), }; struct nfs_client *clp; diff --git a/fs/nfs/fs_context.c b/fs/nfs/fs_context.c index 971a9251c1d9..7bb8f1c8356f 100644 --- a/fs/nfs/fs_context.c +++ b/fs/nfs/fs_context.c @@ -60,6 +60,7 @@ enum nfs_param { Opt_mountvers, Opt_namelen, Opt_nconnect, + Opt_ncpolicy, Opt_port, Opt_posix, Opt_proto, @@ -127,6 +128,18 @@ static const struct constant_table nfs_param_enums_write[] = { {} }; +enum { + Opt_ncpolicy_roundrobin, + Opt_ncpolicy_hash, +}; + +static const struct constant_table nfs_param_enums_ncpolicy[] = { + { "hash", Opt_ncpolicy_hash }, + { "roundrobin", Opt_ncpolicy_roundrobin }, + { "rr", Opt_ncpolicy_roundrobin }, + {} +}; + static const struct fs_parameter_spec nfs_fs_parameters[] = { fsparam_flag_no("ac", Opt_ac), fsparam_u32 ("acdirmax", Opt_acdirmax), @@ -158,6 +171,7 @@ static const struct fs_parameter_spec nfs_fs_parameters[] = { fsparam_u32 ("mountvers", Opt_mountvers), fsparam_u32 ("namlen", Opt_namelen), fsparam_u32 ("nconnect", Opt_nconnect), + fsparam_enum ("ncpolicy", Opt_ncpolicy, nfs_param_enums_ncpolicy), fsparam_string("nfsvers", Opt_vers), fsparam_u32 ("port", Opt_port), fsparam_flag_no("posix", Opt_posix), @@ -749,6 +763,18 @@ static int nfs_fs_context_parse_param(struct fs_context *fc, goto out_of_bounds; ctx->nfs_server.nconnect = result.uint_32; break; + case Opt_ncpolicy: + switch (result.uint_32) { + case Opt_ncpolicy_roundrobin: + ctx->nfs_server.ncpolicy = ncpolicy_roundrobin; + break; + case Opt_ncpolicy_hash: + ctx->nfs_server.ncpolicy = ncpolicy_hash; + break; + default: + goto out_invalid_value; + } + break; case Opt_lookupcache: switch (result.uint_32) { case Opt_lookupcache_all: diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 7b644d6c09e4..e6ca664d7e91 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -67,6 +67,7 @@ struct nfs_client_initdata { int proto; u32 minorversion; unsigned int nconnect; + enum ncpolicy ncpolicy; struct net *net; const struct rpc_timeout *timeparms; const struct cred *cred; @@ -120,6 +121,7 @@ struct nfs_fs_context { int port; unsigned short protocol; unsigned short nconnect; + enum ncpolicy ncpolicy; unsigned short export_path_len; } nfs_server; diff --git a/fs/nfs/nfs3client.c b/fs/nfs/nfs3client.c index 5601e47360c2..f8a648f7492a 100644 --- a/fs/nfs/nfs3client.c +++ b/fs/nfs/nfs3client.c @@ -102,8 +102,10 @@ struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv, return ERR_PTR(-EINVAL); cl_init.hostname = buf; - if (mds_clp->cl_nconnect > 1 && ds_proto == XPRT_TRANSPORT_TCP) + if (mds_clp->cl_nconnect > 1 && ds_proto == XPRT_TRANSPORT_TCP) { cl_init.nconnect = mds_clp->cl_nconnect; + cl_init.ncpolicy = mds_clp->cl_ncpolicy; + } if (mds_srv->flags & NFS_MOUNT_NORESVPORT) __set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags); diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 889a9f4c0310..c967c214129a 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c @@ -863,6 +863,7 @@ static int nfs4_set_client(struct nfs_server *server, const char *ip_addr, int proto, const struct rpc_timeout *timeparms, u32 minorversion, unsigned int nconnect, + enum ncpolicy ncpolicy, struct net *net) { struct nfs_client_initdata cl_init = { @@ -881,8 +882,10 @@ static int nfs4_set_client(struct nfs_server *server, if (minorversion == 0) __set_bit(NFS_CS_REUSEPORT, &cl_init.init_flags); - if (proto == XPRT_TRANSPORT_TCP) + if (proto == XPRT_TRANSPORT_TCP) { cl_init.nconnect = nconnect; + cl_init.ncpolicy = ncpolicy; + } if (server->flags & NFS_MOUNT_NORESVPORT) __set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags); @@ -950,8 +953,10 @@ struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv, return ERR_PTR(-EINVAL); cl_init.hostname = buf; - if (mds_clp->cl_nconnect > 1 && ds_proto == XPRT_TRANSPORT_TCP) + if (mds_clp->cl_nconnect > 1 && ds_proto == XPRT_TRANSPORT_TCP) { cl_init.nconnect = mds_clp->cl_nconnect; + cl_init.ncpolicy = mds_clp->cl_ncpolicy; + } if (mds_srv->flags & NFS_MOUNT_NORESVPORT) __set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags); @@ -1120,6 +1125,7 @@ static int nfs4_init_server(struct nfs_server *server, struct fs_context *fc) &timeparms, ctx->minorversion, ctx->nfs_server.nconnect, + ctx->nfs_server.ncpolicy, fc->net_ns); if (error < 0) return error; @@ -1209,6 +1215,7 @@ struct nfs_server *nfs4_create_referral_server(struct fs_context *fc) parent_server->client->cl_timeout, parent_client->cl_mvops->minor_version, parent_client->cl_nconnect, + parent_client->cl_ncpolicy, parent_client->cl_net); if (!error) goto init_server; @@ -1224,6 +1231,7 @@ struct nfs_server *nfs4_create_referral_server(struct fs_context *fc) parent_server->client->cl_timeout, parent_client->cl_mvops->minor_version, parent_client->cl_nconnect, + parent_client->cl_ncpolicy, parent_client->cl_net); if (error < 0) goto error; @@ -1321,7 +1329,7 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname, error = nfs4_set_client(server, hostname, sap, salen, buf, clp->cl_proto, clnt->cl_timeout, clp->cl_minorversion, - clp->cl_nconnect, net); + clp->cl_nconnect, clp->cl_ncpolicy, net); clear_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status); if (error != 0) { nfs_server_insert_lists(server); diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 94885c6f8f54..8719be70051b 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -481,8 +481,13 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, seq_printf(m, ",proto=%s", rpc_peeraddr2str(nfss->client, RPC_DISPLAY_NETID)); rcu_read_unlock(); - if (clp->cl_nconnect > 0) + if (clp->cl_nconnect > 0) { seq_printf(m, ",nconnect=%u", clp->cl_nconnect); + if (clp->cl_ncpolicy == ncpolicy_roundrobin) + seq_puts(m, ",ncpolicy=roundrobin"); + else if (clp->cl_ncpolicy == ncpolicy_hash) + seq_puts(m, ",ncpolicy=hash"); + } if (version == 4) { if (nfss->port != NFS_PORT) seq_printf(m, ",port=%u", nfss->port); diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 6f76b32a0238..737f4d231e23 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -62,6 +62,7 @@ struct nfs_client { u32 cl_minorversion;/* NFSv4 minorversion */ unsigned int cl_nconnect; /* Number of connections */ + enum ncpolicy cl_ncpolicy; /* nconnect policy */ const char * cl_principal; /* used for machine cred */ #if IS_ENABLED(CONFIG_NFS_V4) diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 02e7a5863d28..aa1c1706f4d5 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h @@ -28,6 +28,15 @@ #include #include +/* + * Policies for controlling distribution of RPC requests over multiple + * nconnect connections. + */ +enum ncpolicy { + ncpolicy_roundrobin, // Select roundrobin. + ncpolicy_hash, // Select based on target filehandle hash. +}; + struct rpc_inode; /* @@ -40,6 +49,7 @@ struct rpc_clnt { struct list_head cl_tasks; /* List of tasks */ spinlock_t cl_lock; /* spinlock */ struct rpc_xprt __rcu * cl_xprt; /* transport */ + enum ncpolicy cl_ncpolicy; /* nconnect policy */ const struct rpc_procinfo *cl_procinfo; /* procedure info */ u32 cl_prog, /* RPC program number */ cl_vers, /* RPC version number */ @@ -101,6 +111,8 @@ struct rpc_version { unsigned int *counts; /* call counts */ }; +typedef u32 (*getfhhash_t)(const void *obj); + /* * Procedure information */ @@ -108,6 +120,7 @@ struct rpc_procinfo { u32 p_proc; /* RPC procedure number */ kxdreproc_t p_encode; /* XDR encode function */ kxdrdproc_t p_decode; /* XDR decode function */ + getfhhash_t p_fhhash; /* Returns target fh hash */ unsigned int p_arglen; /* argument hdr length (u32) */ unsigned int p_replen; /* reply hdr length (u32) */ unsigned int p_timer; /* Which RTT timer to use */ @@ -129,6 +142,7 @@ struct rpc_create_args { u32 version; rpc_authflavor_t authflavor; u32 nconnect; + enum ncpolicy ncpolicy; unsigned long flags; char *client_name; struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */ @@ -247,4 +261,5 @@ static inline void rpc_task_close_connection(struct rpc_task *task) if (task->tk_xprt) xprt_force_disconnect(task->tk_xprt); } + #endif /* _LINUX_SUNRPC_CLNT_H */ diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 1b2a02460601..ed470a75e91d 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -410,6 +410,7 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, } rpc_clnt_set_transport(clnt, xprt, timeout); + clnt->cl_ncpolicy = args->ncpolicy; xprt_iter_init(&clnt->cl_xpi, xps); xprt_switch_put(xps); @@ -640,6 +641,7 @@ static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args, new->cl_discrtry = clnt->cl_discrtry; new->cl_chatty = clnt->cl_chatty; new->cl_principal = clnt->cl_principal; + new->cl_ncpolicy = clnt->cl_ncpolicy; return new; out_err: @@ -1053,9 +1055,10 @@ rpc_task_get_first_xprt(struct rpc_clnt *clnt) } static struct rpc_xprt * -rpc_task_get_next_xprt(struct rpc_clnt *clnt) +rpc_task_get_next_xprt(struct rpc_clnt *clnt, u32 hash) { - return rpc_task_get_xprt(clnt, xprt_iter_get_next(&clnt->cl_xpi, 0)); + return rpc_task_get_xprt(clnt, + xprt_iter_get_next(&clnt->cl_xpi, hash)); } static @@ -1065,8 +1068,16 @@ void rpc_task_set_transport(struct rpc_task *task, struct rpc_clnt *clnt) return; if (task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) task->tk_xprt = rpc_task_get_first_xprt(clnt); - else - task->tk_xprt = rpc_task_get_next_xprt(clnt); + else { + u32 xprt_hint = 0; + + if (clnt->cl_ncpolicy == ncpolicy_hash && + task->tk_msg.rpc_proc->p_fhhash) { + xprt_hint = task->tk_msg.rpc_proc->p_fhhash( + task->tk_msg.rpc_argp); + } + task->tk_xprt = rpc_task_get_next_xprt(clnt, xprt_hint); + } } static @@ -1130,8 +1141,8 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data) if (!RPC_IS_ASYNC(task)) task->tk_flags |= RPC_TASK_CRED_NOREF; - rpc_task_set_client(task, task_setup_data->rpc_client); rpc_task_set_rpc_message(task, task_setup_data->rpc_message); + rpc_task_set_client(task, task_setup_data->rpc_client); if (task->tk_action == NULL) rpc_call_start(task); @@ -1636,6 +1647,7 @@ call_start(struct rpc_task *task) /* Increment call count (version might not be valid for ping) */ if (clnt->cl_program->version[clnt->cl_vers]) clnt->cl_program->version[clnt->cl_vers]->counts[idx]++; + clnt->cl_stats->rpccnt++; task->tk_action = call_reserve; rpc_task_set_transport(task, clnt); @@ -2888,7 +2900,17 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt, connect_timeout, reconnect_timeout); - rpc_xprt_switch_set_roundrobin(xps); + switch (clnt->cl_ncpolicy) { + case ncpolicy_roundrobin: + default: + WARN_ON(clnt->cl_ncpolicy != ncpolicy_roundrobin); + rpc_xprt_switch_set_roundrobin(xps); + break; + case ncpolicy_hash: + rpc_xprt_switch_set_hash(xps); + break; + } + if (setup) { ret = setup(clnt, xps, xprt, data); if (ret != 0) From patchwork Tue Mar 23 05:49:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nagendra Tomar X-Patchwork-Id: 12156945 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=-16.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 3A4F2C433C1 for ; Tue, 23 Mar 2021 05:50:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 11D0761983 for ; Tue, 23 Mar 2021 05:50:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229451AbhCWFty (ORCPT ); Tue, 23 Mar 2021 01:49:54 -0400 Received: from mail-eopbgr1300095.outbound.protection.outlook.com ([40.107.130.95]:17502 "EHLO APC01-HK2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229437AbhCWFtc (ORCPT ); Tue, 23 Mar 2021 01:49:32 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MQOnPkCMeqqKtkNcXZDzSOu9dz8wRGSVUM35POAkx/YTni28K5soa+c+3UgqA83ud6ID5be2HnVKNG725FVmiXROAdDns7JXijddEk4QPoe9H8K2mWqefglXlQceRaBl7TGvhbfl4Wv/AxCilZfFYOtc1bmngGpYctyuthmFj8XBJE0/uQ5a74UepB1MtGi7lD8lkD1rUq9jIOS638q4HXnJcrnYqwuXCLa7C8x1/aEd2PzkvD6KZpni1Hy3AoLpCZIogpWi24703fHtJ2j+YdDVdc+wwRLkN0ed0SkmCKwn3neW4x2Mnr/s5fxrYFMXR3G6mdBG9+fnyaVWjpJ3lA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=qKBFFqhU6lZOMeV5hdzRQrZs7jmh/GISxGtQjIYmKFc=; b=kKhv2bMZ8Zn3atLIuiw1SR7GLmarzX3qm81CteG661SIvqzikpecE3w3q1RzyLATf5TS1KdJujomKHwMZFT9lzYOAnMmzgqHyWvWAgy7I+dmFcPAhIrGV4MRVRXFapTqFoO7/DSyaxqX1EZUcNZ87mL4VhZk8FZI/7FTm1maIIkzHzGVPBA77NmnzWR9+dIcEeUoa62XDlvhs7B5Cu2bLFuyvHdsZE6XRorojc4WdR/L+uDgULsseO7Oj8cGeb/oJ+I5N+hI+1AZ2UpBTFKerCALOJS8AaCDfSrI6EkLNgCWVQSFc0czBF3SgnhDauG8B44u9R1gNTNMJzLHbhXrrw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microsoft.com; dmarc=pass action=none header.from=microsoft.com; dkim=pass header.d=microsoft.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=qKBFFqhU6lZOMeV5hdzRQrZs7jmh/GISxGtQjIYmKFc=; b=QaG7GACwU4DN/U4i4rn2TrWxy3e8RHbTR5FOMkmAA7/G4MOiFhlwo03K8CnM9QblZ/vJ4rTCIoBCwrJx32+U7w/aEaUz8YRXj08Il9ykUrDPqAUc5Un8Zp0UUYSK53CTxLoKbymAbTPOfdfH3RtgXIs4gS0/K0FhEeyhT/UaxJw= Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM (2603:1096:0:4::11) by SG2P15301MB0064.APCP153.PROD.OUTLOOK.COM (2603:1096:3:10::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3999.6; Tue, 23 Mar 2021 05:49:29 +0000 Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488]) by SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488%5]) with mapi id 15.20.3999.008; Tue, 23 Mar 2021 05:49:29 +0000 From: Nagendra Tomar To: "linux-nfs@vger.kernel.org" CC: Trond Myklebust , "anna.schumaker@netapp.com" Subject: [PATCH 3/5] nfs: Add mount option for forcing RPC requests to one file over one connection Thread-Topic: [PATCH 3/5] nfs: Add mount option for forcing RPC requests to one file over one connection Thread-Index: AdcfqDqoFcB9R6RLR4K5SOwpCsdSAA== Date: Tue, 23 Mar 2021 05:49:29 +0000 Message-ID: Accept-Language: en-IN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=microsoft.com; x-originating-ip: [122.172.188.128] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: 890139b5-2a9b-4e81-cd85-08d8edbf6cdf x-ms-traffictypediagnostic: SG2P15301MB0064: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:142; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: S/EY/CeZBDAVpu9K6kL5HWtT/JkomV6XMtMAZCEE1aeAQHjd+oyJWcevQVw5BDIAmgS7QWtgSuXplN953yolsYU8MFo2fhO9YQ7NfCPbO4ImOWTpFdpfzGdrbwFlxXbo0yn6FIyTe4qKGAr2RlyKCSDOTQzYWJR8aPbwEDn82xOntELJPHzYnHth1ciuZBkRnr/YSFvatq9Nt2mV9c3E0v506+ol6zZEurtT1NZRUe0Tzqdu82XMGorSaVaYHnY6jghqW6etaicneSyKRz35qwytqrPr/W6vfIlMrqHp0cp978FbiYmZ9cp6QuyesSM6HmS16h9zJfXW26uVUnP/EM+HMaRLNWMfCE4TJZrDN38i1OCwrKjtzNHQAHkbpe8FWCmzEE/tkuvm7/0cDkB8MQLEqb1RfpNdpwl59DeDQugz5//wjZE5/TJA8cUMAFh9yBPCNRYa4/xn1aOk8/GzQNuyTaEam/XrVjfVFp++hCg4Zd5yyNlCG7qspodk/wGIx2Wr4M+eHhqMqsrbedaEUpKWS7gj6Sf4EQvsoV+9rmr0/iVZ3Eez+RKTc/KiwCkDRqZ3zBgzqZ549GuSutw6JIpS2oirzjtgmDVkUpFJbCuzdTwSVD7ZcnZj2n2LA8JrdyyP8h/+OAPP//9QPe2d9g1jbnsFhJOnXJlR01thlaY= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SG2P153MB0361.APCP153.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(4636009)(376002)(39860400002)(136003)(366004)(396003)(346002)(5660300002)(316002)(52536014)(7696005)(54906003)(76116006)(33656002)(86362001)(8990500004)(10290500003)(186003)(66476007)(38100700001)(64756008)(66446008)(26005)(6506007)(6916009)(66556008)(66946007)(55236004)(71200400001)(82960400001)(2906002)(8676002)(8936002)(9686003)(55016002)(82950400001)(83380400001)(478600001)(4326008);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: YMguskSyQ0fu9i+GAF9jnmAVLVFFSOsE+hYTHBXWzfulwOKgZBc/A8tublf6EkkHAzw8leyq0uDGniA5CWTCTJFjYhtK8NXPEMBCEtH7vNgaR69zf3BgpZlD2r8NncUVPtXTh2v+o0uNMa9EBek2K7W8Ap+jgiYA/Kw8lS/cWuCCYSg1g5qvkTgsthlWknF+wH0ua6zIWSGBsy8Cm45xZb83rTEUGQfWFzQiA43vFx8Ney2ULCExGFjD3LYSlC7AHZ/lc37XBNRhDxjVxHbAIbIuEudSMSc+jozpmKFuwQkRtHDmGRWdeGthR6opGEjIlIZr53kRoQlSpiHOD0wIwXxfzcd86S6U7hNwJcbp3GIMNjEIFt/RapRUH+jPTeHrrzMzBmfPBIPRnG0e2Bl5J9rG4PCH92CfEeYlVciPSGUSWgVbmsoLVqZ0kPIs5k36AQuhwm9EnG+pzk+HfgmSDa2wgs9sOYCtD7ypXe+SEjv+mYNv9zO1JFfqaUv9yx8/AzGkvIrgpNetx2e4Cw+QM0+AcB3l7ud823G8ou4wS9LwDGdUjbkcoU9lG5wkweg1egKPciEH8N5Wpgu8SkqkVA0GXmFCVTlrgJW93OePu+rLMjl+91WSMLum+4dCfXiVSKn/woy0WO1b3ZjQcAXDnRCZIOCgEpNk6sc8V9tg83XIWp+/A3pSI6B6puDfJXeU9oEdW0YyQJ+dh1DPOGFK2uoK8DY8vxhb2RG2fXYT1u1XQtiHlLHtC/SQ29sxmjeE/ozsMFMr+KXNY8EmpgvstrOfk5PkEA041hkIPCJHvNz/NGmLaJs+AMvPV2RgSxZ7ezChqVNgtGMyKDSJM7tfHz3PHnKGoif0iu1yJ4hZ5XCX83IPy2nGkFDdL6sP0Yt74LcYHU2T1usOARtzalqJSIIxX1dXAiM9S9KjuJa0SH97eFiVQOA/2vJwXdqkDUBhORiKJ/l2SVZm8BqpNRX1MNatNgTdqZNNIHA3C9cVDhx03GdgCiTtz9FFdiGcqEElqShxQeTUd1EGzDybVOJ9xaJj7FdD58nk24jfVmSW4mmK0/MxED2JSE9PX/xrUbUaGxc1E8O+hdSzN4WvCOG0CfyhUWQt1sVs4eavW5MLEZs7Dw9Y/QXEzfXyQYS7r+DT5wfMV2qhQAtWL6HUFxXztEfcGEEbNou2k4OR7Q7ctGUqaJCfVM8gGboEbyxkAUvGDR1084LNncw9M2zvRgZp8/dRJt3Dfbet6XE78lxoeCIMyamNI+6o2PSFuScW5x57xhpFY3rRKJxBdYnk+63Y3QpBsNDuXhQo7i7gQG7nIb5pUzYMbWLyzK+vBx001XoI x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SG2P153MB0361.APCP153.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 890139b5-2a9b-4e81-cd85-08d8edbf6cdf X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Mar 2021 05:49:29.1947 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 3A/PGlAj0GoPFpW4uPCxvivNWCVGp5D9dT8Gjnu6fdqhLgCSVjz97JBfipDvKChEtS8zg5ltG/1r0aI5xuVrDg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2P15301MB0064 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Nagendra S Tomar Rename RPC_TASK_NO_ROUND_ROBIN to RPC_TASK_USE_MAIN_XPRT since we have more than just the roundrobin policy now. Signed-off-by: Nagendra S Tomar --- fs/nfs/nfs4proc.c | 18 +++++++++--------- include/linux/sunrpc/sched.h | 2 +- include/trace/events/sunrpc.h | 4 ++-- net/sunrpc/clnt.c | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index c65c4b41e2c1..9516c479ba46 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -6274,7 +6274,7 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, .rpc_message = &msg, .callback_ops = &nfs4_setclientid_ops, .callback_data = &setclientid, - .flags = RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN, + .flags = RPC_TASK_TIMEOUT | RPC_TASK_USE_MAIN_XPRT, }; unsigned long now = jiffies; int status; @@ -6341,7 +6341,7 @@ int nfs4_proc_setclientid_confirm(struct nfs_client *clp, clp->cl_rpcclient->cl_auth->au_ops->au_name, clp->cl_clientid); status = rpc_call_sync(clp->cl_rpcclient, &msg, - RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN); + RPC_TASK_TIMEOUT | RPC_TASK_USE_MAIN_XPRT); trace_nfs4_setclientid_confirm(clp, status); dprintk("NFS reply setclientid_confirm: %d\n", status); return status; @@ -8078,7 +8078,7 @@ static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct .rpc_message = &msg, .callback_ops = clp->cl_mvops->call_sync_ops, .callback_data = &data, - .flags = RPC_TASK_NO_ROUND_ROBIN, + .flags = RPC_TASK_USE_MAIN_XPRT, }; const struct cred *cred = NULL; @@ -8451,7 +8451,7 @@ nfs4_run_exchange_id(struct nfs_client *clp, const struct cred *cred, .rpc_client = clp->cl_rpcclient, .callback_ops = &nfs4_exchange_id_call_ops, .rpc_message = &msg, - .flags = RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN, + .flags = RPC_TASK_TIMEOUT | RPC_TASK_USE_MAIN_XPRT, }; struct nfs41_exchange_id_data *calldata; int status; @@ -8681,7 +8681,7 @@ static int _nfs4_proc_destroy_clientid(struct nfs_client *clp, int status; status = rpc_call_sync(clp->cl_rpcclient, &msg, - RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN); + RPC_TASK_TIMEOUT | RPC_TASK_USE_MAIN_XPRT); trace_nfs4_destroy_clientid(clp, status); if (status) dprintk("NFS: Got error %d from the server %s on " @@ -8959,7 +8959,7 @@ static int _nfs4_proc_create_session(struct nfs_client *clp, args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN); status = rpc_call_sync(session->clp->cl_rpcclient, &msg, - RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN); + RPC_TASK_TIMEOUT | RPC_TASK_USE_MAIN_XPRT); trace_nfs4_create_session(clp, status); switch (status) { @@ -9036,7 +9036,7 @@ int nfs4_proc_destroy_session(struct nfs4_session *session, return 0; status = rpc_call_sync(session->clp->cl_rpcclient, &msg, - RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN); + RPC_TASK_TIMEOUT | RPC_TASK_USE_MAIN_XPRT); trace_nfs4_destroy_session(session->clp, status); if (status) @@ -9287,7 +9287,7 @@ static int nfs41_proc_reclaim_complete(struct nfs_client *clp, .rpc_client = clp->cl_rpcclient, .rpc_message = &msg, .callback_ops = &nfs4_reclaim_complete_call_ops, - .flags = RPC_TASK_NO_ROUND_ROBIN, + .flags = RPC_TASK_USE_MAIN_XPRT, }; int status = -ENOMEM; @@ -9808,7 +9808,7 @@ _nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle, .rpc_message = &msg, .callback_ops = server->nfs_client->cl_mvops->call_sync_ops, .callback_data = &data, - .flags = RPC_TASK_NO_ROUND_ROBIN, + .flags = RPC_TASK_USE_MAIN_XPRT, }; const struct cred *cred = NULL; int status; diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index df696efdd675..4885ba352c6b 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h @@ -125,7 +125,7 @@ struct rpc_task_setup { #define RPC_CALL_MAJORSEEN 0x0020 /* major timeout seen */ #define RPC_TASK_ROOTCREDS 0x0040 /* force root creds */ #define RPC_TASK_DYNAMIC 0x0080 /* task was kmalloc'ed */ -#define RPC_TASK_NO_ROUND_ROBIN 0x0100 /* send requests on "main" xprt */ +#define RPC_TASK_USE_MAIN_XPRT 0x0100 /* send requests on "main" xprt */ #define RPC_TASK_SOFT 0x0200 /* Use soft timeouts */ #define RPC_TASK_SOFTCONN 0x0400 /* Fail if can't connect */ #define RPC_TASK_SENT 0x0800 /* message was sent */ diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h index 036eb1f5c133..9c1c0593d0e6 100644 --- a/include/trace/events/sunrpc.h +++ b/include/trace/events/sunrpc.h @@ -301,7 +301,7 @@ TRACE_DEFINE_ENUM(RPC_TASK_NULLCREDS); TRACE_DEFINE_ENUM(RPC_CALL_MAJORSEEN); TRACE_DEFINE_ENUM(RPC_TASK_ROOTCREDS); TRACE_DEFINE_ENUM(RPC_TASK_DYNAMIC); -TRACE_DEFINE_ENUM(RPC_TASK_NO_ROUND_ROBIN); +TRACE_DEFINE_ENUM(RPC_TASK_USE_MAIN_XPRT); TRACE_DEFINE_ENUM(RPC_TASK_SOFT); TRACE_DEFINE_ENUM(RPC_TASK_SOFTCONN); TRACE_DEFINE_ENUM(RPC_TASK_SENT); @@ -318,7 +318,7 @@ TRACE_DEFINE_ENUM(RPC_TASK_CRED_NOREF); { RPC_CALL_MAJORSEEN, "MAJORSEEN" }, \ { RPC_TASK_ROOTCREDS, "ROOTCREDS" }, \ { RPC_TASK_DYNAMIC, "DYNAMIC" }, \ - { RPC_TASK_NO_ROUND_ROBIN, "NO_ROUND_ROBIN" }, \ + { RPC_TASK_USE_MAIN_XPRT, "USE_MAIN_XPRT" }, \ { RPC_TASK_SOFT, "SOFT" }, \ { RPC_TASK_SOFTCONN, "SOFTCONN" }, \ { RPC_TASK_SENT, "SENT" }, \ diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index ed470a75e91d..f1fb2984e393 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -1066,7 +1066,7 @@ void rpc_task_set_transport(struct rpc_task *task, struct rpc_clnt *clnt) { if (task->tk_xprt) return; - if (task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) + if (task->tk_flags & RPC_TASK_USE_MAIN_XPRT) task->tk_xprt = rpc_task_get_first_xprt(clnt); else { u32 xprt_hint = 0; From patchwork Tue Mar 23 05:50:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nagendra Tomar X-Patchwork-Id: 12156947 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=-16.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 25341C433C1 for ; Tue, 23 Mar 2021 05:51:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E2A0361983 for ; Tue, 23 Mar 2021 05:51:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229493AbhCWFu2 (ORCPT ); Tue, 23 Mar 2021 01:50:28 -0400 Received: from mail-eopbgr1300123.outbound.protection.outlook.com ([40.107.130.123]:41984 "EHLO APC01-HK2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229464AbhCWFuN (ORCPT ); Tue, 23 Mar 2021 01:50:13 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=juc1LK5/yvEBecgl3L4TOwOlk6uprndPC/uJBtOCEQy53HUuOP/h8h3OhmoNN8EfNGmNpyY/w4HKSV5458YbNoznhciRGyfyp1QDnC/hpFgRpK//7x8hqSlfhs9Y3/K+vpPdv0KuVYPFVWRwJt3hBlsBZHYQpCIp1AJoqRZyapVcaKEYVRBuEA4HwHxwnGyo7yTy50RynX2gwcGhW0A9n+atSjA1zaD32CPmxiARg9QIAysRiXla9VAHX3q93MXT8btaNwjo2JZkIM+xiNNGOrvCGHX5mJq0zXuF7xUZ0P06T643LEI+P1OegnG85imXAmxOfUdJlScTzAMtGGqS7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/8LhEWBRosaBd6Enmw4UPcQDwVJ/DxtNO56iLhzpUAM=; b=BX4G4D6K9QdFnzMMmcp/cs80/y2gbrXOdtzQuqICUFzhIwGMap21f8srjQ2Dq9Xaj/lt1WnqDqxkXt2f0NaD6IKBEHFeRHvKWVm4L4JTfWssT4YBK6ohQutw+1oUZL6k2fk53OwgHesPsFghUWDR50L04AA+QjfwIVDUefh/tIZ0I8lV9I/lkSPIBEwZ4ErAJzL+IDKh8dOIH/Znik8b4lVrQqjIPqfx8mErvCpP4oa01ChxCcDsxhY+EOmfGCj8NcRcxHeQo2VycTmZInuzj+62suZ0muG7jByxtaaRuxFJKLdb+by6J4fsGgm5fVUqZaABWBabyWGsanO6KXbXcA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microsoft.com; dmarc=pass action=none header.from=microsoft.com; dkim=pass header.d=microsoft.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/8LhEWBRosaBd6Enmw4UPcQDwVJ/DxtNO56iLhzpUAM=; b=EZXLTsaJYyQ4+FO9BPuYGJ+IddiUbJL3mIOqRiiAZM5oG9/HT1cQd3qfAvReo8nIlTOqbz0z1ZZNSgIEu6imVbfsDXqPMvy++Tf2At4fWGQ3WCQM1JGpSyjoNV55kGlgpgcV+wUUeOlJEQO1UF2s9dhWovUYCsCYE3UcPaExNGc= Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM (2603:1096:0:4::11) by SG2P153MB0214.APCP153.PROD.OUTLOOK.COM (2603:1096:4:8c::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3999.2; Tue, 23 Mar 2021 05:50:09 +0000 Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488]) by SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488%5]) with mapi id 15.20.3999.008; Tue, 23 Mar 2021 05:50:09 +0000 From: Nagendra Tomar To: "linux-nfs@vger.kernel.org" CC: Trond Myklebust , "anna.schumaker@netapp.com" Subject: [PATCH 4/5] nfs: Add mount option for forcing RPC requests to one file over one connection Thread-Topic: [PATCH 4/5] nfs: Add mount option for forcing RPC requests to one file over one connection Thread-Index: AdcfqE88Ub7NiS+HTXGHJpvme+wyQQ== Date: Tue, 23 Mar 2021 05:50:09 +0000 Message-ID: Accept-Language: en-IN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=microsoft.com; x-originating-ip: [122.172.188.128] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: 5c9e8708-32de-4ce1-9d19-08d8edbf84cd x-ms-traffictypediagnostic: SG2P153MB0214: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:170; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 8R0f4K3rn4cQBV+jKqlH0ciyldi+cA+Ur0g3SVh3GerZvSGCPBhoAnlTuRD1xe8X0vMhNePVCsK+fIynrjyPSTpMADDdJuOaCp0p2WTcUZVsDomxljY/NeQUPs/Dk7+IUn6ZvKX9SWu9bwjgJuwChXbrSy3EIhrEJxpd+DXtg5+5rUREIkS22Py+b/ga7Jlm/mbWXe6te215IXzDKS/G4XqVa8ZUP+sY++rhrYZx984rCwVt9AeEZxQpVExp+V/cJrJPXe2ropjQBlSBmnXKuPoZb1ZxOhbNYCLwc2/R2FeIxcZtw9tmltfQnZAafSJ52Bj/IhwM3p7mV2PTZ1WnXGXBVFxzR98qPeYv5uN1vZhYQkrzY1PuuuCxYp9AlKdLOOhEboRkyHxX5JfxgTpZXAFG2UwQDENmB7XMWmXc6Pk7eBYpq73OKh4NTxgfza9vYwwCZ636MOiteKwSVAp8G9GjWmVmoMK8IBvgt4usvcJ5PoB1J+hTqhG6v2UDukvrmNz7RxDpfdOkQDqMvqOs7yabZsH1jsFY8w2S9TFy6vn+CuJuO431NVqgAwvkIg3VRwhWtIm7hIgtxguClzjMQ+G5CooN6Hkpc8bZAByWNk+rmcaJqRu+76XsjzjmVrMxl/DumBAQcF1bfGiNAXQaeTJqdBJEEzxi7XGPFx2cvkY= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SG2P153MB0361.APCP153.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(4636009)(39860400002)(376002)(346002)(396003)(366004)(136003)(316002)(71200400001)(33656002)(76116006)(478600001)(6506007)(8676002)(8936002)(6916009)(7696005)(55016002)(83380400001)(66946007)(52536014)(66446008)(8990500004)(9686003)(66476007)(26005)(54906003)(66556008)(64756008)(10290500003)(2906002)(38100700001)(4326008)(86362001)(5660300002)(82960400001)(55236004)(82950400001)(186003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: bIkR4Jz5gZEwHk6rsoWxgGNH/jLsvtsEXljGdS88GlIiy5J6Xr8W0v7kVVKdT44YVXvQgMZcsSs4VU4M5q5L3vpZlDnkUGjPOjbsSUnmtwdipIE9IFFCDRoVLC1d9YsiyFozCGGLu+32hfXrq3Q4mqN8Pj3UqmWc+nZP4ybSSZ188VZK7IB4YabPKEoinIamh+5hkTnHh92t18uLmOe4u3SIt32jycwrYcOrRE1q2OWeGMCVck+jqqWWHNG9T8OwR5WTiQM0u/VlPqK1aaRAqbu4pSgrKr4DoZbDc/rrTQxDX8EQOrNkA35FJC/FFK/amXSKeHWRh6kS2YTFDi3QguJ3ESNhaKG8bZhfvt9mCf/FF615DLIdZbt42z8R2tgTCnI4ZxQV5xlyPw+h69L3s5Gyyc0VOuPjAgmQsTNK3Vpe+I9tP/xUB36Iy59nWBTFhFdJaoykfXgvBinjtFAPKBQkU1IIH71TvFSxu3q6Mik0JJMXeENs0JozPq08T0ai9MuQUpag149SXo+fl5SWRFAg6Gc+xIanMu8/mHYm+KXdM4sRC1LXnaWSHEac8ETTfXz3Lqd4c0rGVvAdqSuaEAf2HS9DwqZEKC7jP3PaH55V25lfHo45M8uwHywZqECoU1mhm1pGp9PDwuz15sfbRNbfK67ZS6EpSkvaV5F7PzmVUYHw5x4DHex5Vd4g5p4umJh1qAdH5UjddrJhMMzKPIk2xcyfpTgYW3e4Y2oWzQFM3Af77e+brr5jMw0T4XmaLOZJR3C0/TOgVbRuIubN6ED/CFqY3O+Zs1mwtLOuhoqwW3h3O4SzRZ/IUTwabUmxr9ee8BWmUqStSIfVlQMznt5DiMc5p6t2fgZ23O9fc0+J1zCjW3EGFxZbNamrBpjJleFVd4iWeFXKwMcMutrqxnac2WtkDSlfcOZsiB+U5ySMVrv0zoyZoUm9PVyU3miUxzMqjtQagqtCemQ9s5tbXe026vNsi9ehWGh2wolPCXthmsi9ElHti97yzbonNDfx6tEtUeec822p27SRIKi4qJV22SESjRItOo2yjYBVFql4P6MW1FlK2hYiKpTviiq4Aau316MdcxxDvuOpuNK8XiLyeyyDrYkgYWm7UzS8j3nTUImBSwjkWJeTYGHZc+Op/Buic03UtlcjwD8EwvpX7hVqOgNbWNrf3R5rWVRovkkVtMBC0/YXdcalGTDvlcjMd/6tZ2CLbReMO24eSwXJI3T+eSyfjupItIzfZYDt/1CMEBoEcKvJ7oSxfiDYzcNewrVrVpp1wDWv3Bem7pwkOPaF5O6uEBgQL6jxFFR/T9k9n4x838G9HJ1QIO8bZi2e x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SG2P153MB0361.APCP153.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 5c9e8708-32de-4ce1-9d19-08d8edbf84cd X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Mar 2021 05:50:09.2562 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: vh2GNmSU71oXIV9A8qjqFENhmB/TYoPJ6W47WcC9qSKnbGvioSe9xtgAtsanTQ4BSQZz8y8W74hVakbhvDiQMg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2P153MB0214 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Nagendra S Tomar Functions for computing target filehandles' hash for NFSv3. Signed-off-by: Nagendra S Tomar --- fs/nfs/nfs3xdr.c | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c index ed1c83738c30..3d90686cd77d 100644 --- a/fs/nfs/nfs3xdr.c +++ b/fs/nfs/nfs3xdr.c @@ -817,6 +817,13 @@ static void nfs3_xdr_enc_getattr3args(struct rpc_rqst *req, encode_nfs_fh3(xdr, fh); } +static u32 nfs3_fh_hash_getattr(const void *data) +{ + const struct nfs_fh *fh = data; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.2 SETATTR3args * @@ -858,6 +865,14 @@ static void nfs3_xdr_enc_setattr3args(struct rpc_rqst *req, encode_sattrguard3(xdr, args); } +static u32 nfs3_fh_hash_setattr(const void *data) +{ + const struct nfs3_sattrargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.3 LOOKUP3args * @@ -874,6 +889,14 @@ static void nfs3_xdr_enc_lookup3args(struct rpc_rqst *req, encode_diropargs3(xdr, args->fh, args->name, args->len); } +static u32 nfs3_fh_hash_lookup(const void *data) +{ + const struct nfs3_diropargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.4 ACCESS3args * @@ -898,6 +921,14 @@ static void nfs3_xdr_enc_access3args(struct rpc_rqst *req, encode_access3args(xdr, args); } +static u32 nfs3_fh_hash_access(const void *data) +{ + const struct nfs3_accessargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.5 READLINK3args * @@ -916,6 +947,14 @@ static void nfs3_xdr_enc_readlink3args(struct rpc_rqst *req, NFS3_readlinkres_sz - NFS3_pagepad_sz); } +static u32 nfs3_fh_hash_readlink(const void *data) +{ + const struct nfs3_readlinkargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.6 READ3args * @@ -951,6 +990,14 @@ static void nfs3_xdr_enc_read3args(struct rpc_rqst *req, req->rq_rcv_buf.flags |= XDRBUF_READ; } +static u32 nfs3_fh_hash_read(const void *data) +{ + const struct nfs_pgio_args *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.7 WRITE3args * @@ -993,6 +1040,14 @@ static void nfs3_xdr_enc_write3args(struct rpc_rqst *req, xdr->buf->flags |= XDRBUF_WRITE; } +static u32 nfs3_fh_hash_write(const void *data) +{ + const struct nfs_pgio_args *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.8 CREATE3args * @@ -1043,6 +1098,14 @@ static void nfs3_xdr_enc_create3args(struct rpc_rqst *req, encode_createhow3(xdr, args, rpc_rqst_userns(req)); } +static u32 nfs3_fh_hash_create(const void *data) +{ + const struct nfs3_createargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.9 MKDIR3args * @@ -1061,6 +1124,14 @@ static void nfs3_xdr_enc_mkdir3args(struct rpc_rqst *req, encode_sattr3(xdr, args->sattr, rpc_rqst_userns(req)); } +static u32 nfs3_fh_hash_mkdir(const void *data) +{ + const struct nfs3_mkdirargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.10 SYMLINK3args * @@ -1095,6 +1166,14 @@ static void nfs3_xdr_enc_symlink3args(struct rpc_rqst *req, xdr->buf->flags |= XDRBUF_WRITE; } +static u32 nfs3_fh_hash_symlink(const void *data) +{ + const struct nfs3_symlinkargs *args = data; + const struct nfs_fh *fh = args->fromfh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.11 MKNOD3args * @@ -1159,6 +1238,14 @@ static void nfs3_xdr_enc_mknod3args(struct rpc_rqst *req, encode_mknoddata3(xdr, args, rpc_rqst_userns(req)); } +static u32 nfs3_fh_hash_mknod(const void *data) +{ + const struct nfs3_mknodargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.12 REMOVE3args * @@ -1175,6 +1262,14 @@ static void nfs3_xdr_enc_remove3args(struct rpc_rqst *req, encode_diropargs3(xdr, args->fh, args->name.name, args->name.len); } +static u32 nfs3_fh_hash_remove(const void *data) +{ + const struct nfs_removeargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.14 RENAME3args * @@ -1195,6 +1290,14 @@ static void nfs3_xdr_enc_rename3args(struct rpc_rqst *req, encode_diropargs3(xdr, args->new_dir, new->name, new->len); } +static u32 nfs3_fh_hash_rename(const void *data) +{ + const struct nfs_renameargs *args = data; + const struct nfs_fh *fh = args->old_dir; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.15 LINK3args * @@ -1213,6 +1316,14 @@ static void nfs3_xdr_enc_link3args(struct rpc_rqst *req, encode_diropargs3(xdr, args->tofh, args->toname, args->tolen); } +static u32 nfs3_fh_hash_link(const void *data) +{ + const struct nfs3_linkargs *args = data; + const struct nfs_fh *fh = args->tofh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.16 READDIR3args * @@ -1247,6 +1358,14 @@ static void nfs3_xdr_enc_readdir3args(struct rpc_rqst *req, NFS3_readdirres_sz - NFS3_pagepad_sz); } +static u32 nfs3_fh_hash_readdir(const void *data) +{ + const struct nfs3_readdirargs *args = data; + struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.17 READDIRPLUS3args * @@ -1289,6 +1408,14 @@ static void nfs3_xdr_enc_readdirplus3args(struct rpc_rqst *req, NFS3_readdirres_sz - NFS3_pagepad_sz); } +static u32 nfs3_fh_hash_readdirplus(const void *data) +{ + const struct nfs3_readdirargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * 3.3.21 COMMIT3args * @@ -1319,6 +1446,14 @@ static void nfs3_xdr_enc_commit3args(struct rpc_rqst *req, encode_commit3args(xdr, args); } +static u32 nfs3_fh_hash_commit(const void *data) +{ + const struct nfs_commitargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + #ifdef CONFIG_NFS_V3_ACL static void nfs3_xdr_enc_getacl3args(struct rpc_rqst *req, @@ -1337,6 +1472,14 @@ static void nfs3_xdr_enc_getacl3args(struct rpc_rqst *req, } } +static u32 nfs3_fh_hash_getacl(const void *data) +{ + const struct nfs3_getaclargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + static void nfs3_xdr_enc_setacl3args(struct rpc_rqst *req, struct xdr_stream *xdr, const void *data) @@ -1366,6 +1509,14 @@ static void nfs3_xdr_enc_setacl3args(struct rpc_rqst *req, BUG_ON(error < 0); } +static u32 nfs3_fh_hash_setacl(const void *data) +{ + const struct nfs3_setaclargs *args = data; + const struct nfs_fh *fh = NFS_FH(args->inode); + + return jhash(fh->data, fh->size, 0); +} + #endif /* CONFIG_NFS_V3_ACL */ /* @@ -2517,6 +2668,7 @@ static int nfs3_stat_to_errno(enum nfs_stat status) .p_proc = NFS3PROC_##proc, \ .p_encode = nfs3_xdr_enc_##argtype##3args, \ .p_decode = nfs3_xdr_dec_##restype##3res, \ + .p_fhhash = nfs3_fh_hash_##argtype, \ .p_arglen = NFS3_##argtype##args_sz, \ .p_replen = NFS3_##restype##res_sz, \ .p_timer = timer, \ @@ -2562,6 +2714,7 @@ static const struct rpc_procinfo nfs3_acl_procedures[] = { .p_proc = ACLPROC3_GETACL, .p_encode = nfs3_xdr_enc_getacl3args, .p_decode = nfs3_xdr_dec_getacl3res, + .p_fhhash = nfs3_fh_hash_getacl, .p_arglen = ACL3_getaclargs_sz, .p_replen = ACL3_getaclres_sz, .p_timer = 1, @@ -2571,6 +2724,7 @@ static const struct rpc_procinfo nfs3_acl_procedures[] = { .p_proc = ACLPROC3_SETACL, .p_encode = nfs3_xdr_enc_setacl3args, .p_decode = nfs3_xdr_dec_setacl3res, + .p_fhhash = nfs3_fh_hash_setacl, .p_arglen = ACL3_setaclargs_sz, .p_replen = ACL3_setaclres_sz, .p_timer = 0, From patchwork Tue Mar 23 05:50:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nagendra Tomar X-Patchwork-Id: 12156949 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=-16.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 A4207C433C1 for ; Tue, 23 Mar 2021 05:51:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6F1D0619B2 for ; Tue, 23 Mar 2021 05:51:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229451AbhCWFvL (ORCPT ); Tue, 23 Mar 2021 01:51:11 -0400 Received: from mail-eopbgr1300099.outbound.protection.outlook.com ([40.107.130.99]:36960 "EHLO APC01-HK2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229437AbhCWFu4 (ORCPT ); Tue, 23 Mar 2021 01:50:56 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=C6mUmuZdvM3rRX7hpR4lw2ZC6cEzSBkojM1e8WiRUfE6gCcGCOaw1ZQEvnTGXyjG1P1CxbalNVBZTpTfH8tOEblQbr7Vj6JaVWWjm6CdopblUkPNivlpZ/xWk+lVLHJ5xKGzYnOI6CjtGXLgAShn9jpJ/Qxeid5Dt1y3W/moAvCEphxfIQ/4vPR19kwWkF8GkeWBUkEpChHa3ZUiyV+aKxf7aRqPWvD8I2LhbZvP8qDsj96cxAkkhgV5l56AovlLty4R5+IzIfU8D8JlZ012rqUGnRtVF95OL7Om7JKOz02VUNq4ZOXoAIFHCL6HFFMHq/Q5I24/o621nMHsZhM2ng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vpnXlBdV6iGr7tGSetGZ8Fsm8pjYmK0e9IGAZTKz+OI=; b=kBqE+VaFbHrN6joEhJxSf8PYka9kRfl5GfkEQ7sY9qfT8tFKwafegddUgeE94Pf/732+Bdzz5hZhkjIeQehsAHN2RsEHXIRGyVh6R4iIoBT0T5OjqDNmDGcGDd+S99Vkj2psnhhRwF6E/FWvKvd4xq19cwn8Jzm8c2L9+rrR+OfN5b0vPEaHbsp+jA5j9M9Ubc5smoo6sPc0OlgkbdL8IXWJzAzMVCuA+62ZP9+7YcQob4YzW6Wkw9H6j3EWZ25kKNQLEcOR9QzrMRA8WQqhQLZRfqMY6tGWNgWq8T7T5AfjqG2pNV5bU8bAvdcxvx7nlC+C7Vlw+DMG4UVSfY/kRA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microsoft.com; dmarc=pass action=none header.from=microsoft.com; dkim=pass header.d=microsoft.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vpnXlBdV6iGr7tGSetGZ8Fsm8pjYmK0e9IGAZTKz+OI=; b=SjStkD6WEWrIO/s35AWc7XiQIgCOfdu1b/2sMO6ZRIxYj3IMMnha90V7WEaklqMEei4zw0UrCO4BmrU/ShvTyBZStV231P7JrojrY06IdIBr1ziNm48cgTsbvS/fOk2DO953GmGnWNeqjB6sptnlSwT0SFHNKf8iS4QAyK7QXKc= Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM (2603:1096:0:4::11) by SG2P153MB0214.APCP153.PROD.OUTLOOK.COM (2603:1096:4:8c::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3999.2; Tue, 23 Mar 2021 05:50:53 +0000 Received: from SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488]) by SG2P153MB0361.APCP153.PROD.OUTLOOK.COM ([fe80::cd6e:9dc1:85ac:f488%5]) with mapi id 15.20.3999.008; Tue, 23 Mar 2021 05:50:53 +0000 From: Nagendra Tomar To: "linux-nfs@vger.kernel.org" CC: Trond Myklebust , "anna.schumaker@netapp.com" Subject: [PATCH 5/5] nfs: Add mount option for forcing RPC requests to one file over one connection Thread-Topic: [PATCH 5/5] nfs: Add mount option for forcing RPC requests to one file over one connection Thread-Index: AdcfqGipFyIum9yvQ0a745ORygpMdQ== Date: Tue, 23 Mar 2021 05:50:52 +0000 Message-ID: Accept-Language: en-IN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=microsoft.com; x-originating-ip: [122.172.188.128] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: 1d9e8c4e-d712-4c58-d55a-08d8edbf9ebd x-ms-traffictypediagnostic: SG2P153MB0214: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:173; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: sTbsiDyq3ZwOf4ePfqKgyt6V3m0uKGw4RQManozmYGUK9ki09touX58f9sE21zeYOrgmQ0NkCIa0hU24D4+LKCfmWJnmW7MWmk0JSIL1C5WPcwnm2PaoqS0zoIWuzjd2iwTRcOQJhPdWFHk2+8RcMf/bmvihbFXcMC1KJ1FkZB2nRaVN2BvizbjaKhxSJ5SA56b7V6l2l51v+TBdQUVK7MQ132pCDIQ1UlEMcuAmkojNr7ND0J5Hx2gylOpI7y8lPM5NkuhurxRXAojmSkqOkDHDRulg4fh3hLvr4VazEuZLIJussc/g0YslGgXf3SQnUK+oNP2t+CkKqzNXd2E2uhvcbG+0kYtNmtaQr1yxNYMniwQCRjsPUAPIn/EIzpZExXhZ3Yr0Ht1zde8Nmj50HqNoyKWwT1z0e3HZ6a9cIFZwrc10nXUS6qwp2JyjSLqE72Gp5RGcvfACsayUzYO1/yheSF89LU6YcvaGqTDrXHL4hv5jlmS+LqnsvFTUMbnVMC4LFNZI5FX4OA7BaI/kHHg35oYdn6J/gFEfK0o9z1mYYHOj4eI4aMGBM3mvm54x0tc6XpYSKCeEfPVY/hZYM0VwX9PhZhIeRlYI73bJXyxBKcVy7QJoGDBv7ZwWpaBjs6ahvElFy36gUerq9RAX685sot3FOU5GLjgszVFM5PM= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SG2P153MB0361.APCP153.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(4636009)(39860400002)(376002)(346002)(396003)(366004)(136003)(316002)(71200400001)(33656002)(76116006)(478600001)(6506007)(8676002)(8936002)(6916009)(7696005)(55016002)(83380400001)(66946007)(30864003)(52536014)(66446008)(8990500004)(9686003)(66476007)(26005)(54906003)(66556008)(64756008)(10290500003)(2906002)(38100700001)(4326008)(86362001)(5660300002)(82960400001)(55236004)(82950400001)(186003)(559001)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: s3XMPiI/pajpr6MeeXp/nVOU/kDvtUGO7Sq1eYaP18Q2h3BABWWye6uoIwRLZ5Kf7n/YczJa5tl91vECgL4eSQ3vflgf48DlMAwh/x9HGFbpW9OEBgmfjQf4J2Sh5oRFMJRsG3NJwy1Xv87r7WOd9equ/74ZeyxwmwJl6dtMT8W2PxLAYxTi46dNwrc7+Au0rn/izm86Kxai85v/0HAMtTTsmxpa9kk6xWQ2GNpTMp4W1AqD4heOhLkj9zKdi1I+6AWvA/mLWndLt7bktySlo2nvJJtI4b/8d++T0Pl2yErbmaowILErX1ZTQD0AF7q6i2PKh5acjFroMphDLUfFRHtCYU1GZpwUKhWMTli0vZ7PIf9N8LcPNSpLukgRcC9b+Ufb/x5rsaiNIHHH54mXkuIbaZ9EfuZ9VwlEnQLVmnvBpB4SsdyUDCTwF94ELxZ0s6vgbFVUnqCLZDUFciEIBYb610Y6IKLSuWBnk5oJoqRzwo9FoI4lbL703qKHoQTRxzcwI36fvBDozK1bwBvDz54wBEEcMwXqexqmhEPhW6LH1ggFmC0EgVuTpfYzJD+b5s9v4CS7hoh+o6ZuG833L0tGTcstTWMZGEcLFQoinrzez1b6QVGYtBnAmrMpxDLo5YIWpIWtAu8JQAMx49w0+SflCf6KbKi2+lTuB92BEXE5EpET589WM3+pNhOSxyRf7HNntYun5/jQxoOGtBsfB0Y0iW8+xsij1XWeh4Ec60Zq9HxyOwN0zVdXf3dtqTVnfxZOAUqbBll/Te1WMW1GGjFsHYSdyF5yTD0V5L/AkXP3M34m1JZK2667E1Ss2CvBTF8c2soOWRbeQqZCF65CesgyRpoCOdduAy+kttRJBzDVTnBsJN18I+oUjHLNfEF0rBzmQXoKh3Fwy48uMAZt1/gZXGQIk8wt2cX5TQkG2TAD6mNjjjEFHLgKWfybQuKg3wg0Tmi7aDZ9LV+ftTuUzdjOL/J3rkmRDSnWkna0rGMwdb5Z+aBS2dHs9uHDWY8vg0vZNkaz1eDsUU5h5LeEXdoXYKkQTgtNoloCqs8BqYsyKVjnE2OH1mUClXtUW/QsMMeXDydjNfCyB2cY+0nc9ZdYT5tQ3GmgL30jnApolDB6S4U4w/8nzlPgbelVqzjcEu8syHgx8z+rPEHRq8N2hPpCP7YjQJijklji6wlQOteKD4jUJPrsctdAJelWtqzPYrPB0QtPHWot1VWqtjGDysZwAPYZllZlF+usg6WbiI16J+UnhinOcoRGz1PXr3ZPat+oGT6hw7TDYApKdb03LkoD+Uh/OvAXMaTqqaXO4Dfb7CNFNJRl6Wa2RV03xtQf x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SG2P153MB0361.APCP153.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 1d9e8c4e-d712-4c58-d55a-08d8edbf9ebd X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Mar 2021 05:50:52.8233 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: LPz1gMdq2hD5/gkUBWvQ3C0w2vJGyXxopxSS74v7534c5mA6a8wEzFd5tuqtjJSyDFkPbtPXV6ilVZbDmzgTmw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2P153MB0214 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Nagendra S Tomar Functions for computing target filehandles' hash for NFSv4/41/42. RPCs which are not targeted to a specific file return a hash of 0 and they will map to the first available xprt. Signed-off-by: Nagendra S Tomar --- fs/nfs/nfs42xdr.c | 112 ++++++++++++ fs/nfs/nfs4xdr.c | 516 ++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 557 insertions(+), 71 deletions(-) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index c8bad735e4c1..c1a9d80dc85a 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -662,6 +662,14 @@ static void nfs4_xdr_enc_allocate(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_allocate(const void *data) +{ + const struct nfs42_falloc_args *args = data; + const struct nfs_fh *fh = args->falloc_fh; + + return jhash(fh->data, fh->size, 0); +} + static void encode_copy_commit(struct xdr_stream *xdr, const struct nfs42_copy_args *args, struct compound_hdr *hdr) @@ -697,6 +705,14 @@ static void nfs4_xdr_enc_copy(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_copy(const void *data) +{ + const struct nfs42_copy_args *args = data; + const struct nfs_fh *fh = args->dst_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode OFFLOAD_CANEL request */ @@ -716,6 +732,14 @@ static void nfs4_xdr_enc_offload_cancel(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_offload_cancel(const void *data) +{ + const struct nfs42_offload_status_args *args = data; + const struct nfs_fh *fh = args->osa_src_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode COPY_NOTIFY request */ @@ -735,6 +759,14 @@ static void nfs4_xdr_enc_copy_notify(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_copy_notify(const void *data) +{ + const struct nfs42_copy_notify_args *args = data; + const struct nfs_fh *fh = args->cna_src_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode DEALLOCATE request */ @@ -755,6 +787,14 @@ static void nfs4_xdr_enc_deallocate(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_deallocate(const void *data) +{ + const struct nfs42_falloc_args *args = data; + const struct nfs_fh *fh = args->falloc_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode READ_PLUS request */ @@ -777,6 +817,14 @@ static void nfs4_xdr_enc_read_plus(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_read_plus(const void *data) +{ + const struct nfs_pgio_args *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode SEEK request */ @@ -796,6 +844,14 @@ static void nfs4_xdr_enc_seek(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_seek(const void *data) +{ + const struct nfs42_seek_args *args = data; + const struct nfs_fh *fh = args->sa_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode LAYOUTSTATS request */ @@ -819,6 +875,14 @@ static void nfs4_xdr_enc_layoutstats(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_layoutstats(const void *data) +{ + const struct nfs42_layoutstat_args *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode CLONE request */ @@ -841,6 +905,14 @@ static void nfs4_xdr_enc_clone(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_clone(const void *data) +{ + const struct nfs42_clone_args *args = data; + const struct nfs_fh *fh = args->dst_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode LAYOUTERROR request */ @@ -862,6 +934,14 @@ static void nfs4_xdr_enc_layouterror(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_layouterror(const void *data) +{ + const struct nfs42_layouterror_args *args = data; + const struct nfs_fh *fh = NFS_FH(args->inode); + + return jhash(fh->data, fh->size, 0); +} + static int decode_allocate(struct xdr_stream *xdr, struct nfs42_falloc_res *res) { return decode_op_hdr(xdr, OP_ALLOCATE); @@ -1483,6 +1563,14 @@ static void nfs4_xdr_enc_setxattr(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_setxattr(const void *data) +{ + const struct nfs42_setxattrargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + static int nfs4_xdr_dec_setxattr(struct rpc_rqst *req, struct xdr_stream *xdr, void *data) { @@ -1526,6 +1614,14 @@ static void nfs4_xdr_enc_getxattr(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_getxattr(const void *data) +{ + const struct nfs42_getxattrargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + static int nfs4_xdr_dec_getxattr(struct rpc_rqst *rqstp, struct xdr_stream *xdr, void *data) { @@ -1567,6 +1663,14 @@ static void nfs4_xdr_enc_listxattrs(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_listxattrs(const void *data) +{ + const struct nfs42_listxattrsargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + static int nfs4_xdr_dec_listxattrs(struct rpc_rqst *rqstp, struct xdr_stream *xdr, void *data) { @@ -1605,6 +1709,14 @@ static void nfs4_xdr_enc_removexattr(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_removexattr(const void *data) +{ + const struct nfs42_removexattrargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + static int nfs4_xdr_dec_removexattr(struct rpc_rqst *req, struct xdr_stream *xdr, void *data) { diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index ac6b79ee9355..49ced4762ab5 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -2130,6 +2130,14 @@ static void nfs4_xdr_enc_access(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_access(const void *data) +{ + const struct nfs4_accessargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode LOOKUP request */ @@ -2150,6 +2158,14 @@ static void nfs4_xdr_enc_lookup(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_lookup(const void *data) +{ + const struct nfs4_lookup_arg *args = data; + const struct nfs_fh *fh = args->dir_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode LOOKUPP request */ @@ -2170,6 +2186,14 @@ static void nfs4_xdr_enc_lookupp(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_lookupp(const void *data) +{ + const struct nfs4_lookupp_arg *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode LOOKUP_ROOT request */ @@ -2190,6 +2214,11 @@ static void nfs4_xdr_enc_lookup_root(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_lookup_root(const void *data) +{ + return 0; +} + /* * Encode REMOVE request */ @@ -2208,6 +2237,14 @@ static void nfs4_xdr_enc_remove(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_remove(const void *data) +{ + const struct nfs_removeargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode RENAME request */ @@ -2228,6 +2265,14 @@ static void nfs4_xdr_enc_rename(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_rename(const void *data) +{ + const struct nfs_renameargs *args = data; + const struct nfs_fh *fh = args->old_dir; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode LINK request */ @@ -2250,6 +2295,14 @@ static void nfs4_xdr_enc_link(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_link(const void *data) +{ + const struct nfs4_link_arg *args = data; + const struct nfs_fh *fh = args->dir_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode CREATE request */ @@ -2270,6 +2323,14 @@ static void nfs4_xdr_enc_create(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_create(const void *data) +{ + const struct nfs4_create_arg *args = data; + const struct nfs_fh *fh = args->dir_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode SYMLINK request */ @@ -2281,6 +2342,14 @@ static void nfs4_xdr_enc_symlink(struct rpc_rqst *req, struct xdr_stream *xdr, nfs4_xdr_enc_create(req, xdr, args); } +static u32 nfs4_fh_hash_symlink(const void *data) +{ + const struct nfs4_create_arg *args = data; + const struct nfs_fh *fh = args->dir_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode GETATTR request */ @@ -2299,6 +2368,14 @@ static void nfs4_xdr_enc_getattr(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_getattr(const void *data) +{ + const struct nfs4_getattr_arg *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode a CLOSE request */ @@ -2321,6 +2398,14 @@ static void nfs4_xdr_enc_close(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_close(const void *data) +{ + const struct nfs_closeargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode an OPEN request */ @@ -2349,6 +2434,14 @@ static void nfs4_xdr_enc_open(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_open(const void *data) +{ + const struct nfs_openargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode an OPEN_CONFIRM request */ @@ -2367,6 +2460,14 @@ static void nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_open_confirm(const void *data) +{ + const struct nfs_open_confirmargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode an OPEN request with no attributes. */ @@ -2395,6 +2496,14 @@ static void nfs4_xdr_enc_open_noattr(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_open_noattr(const void *data) +{ + const struct nfs_openargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode an OPEN_DOWNGRADE request */ @@ -2416,6 +2525,14 @@ static void nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_open_downgrade(const void *data) +{ + const struct nfs_closeargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode a LOCK request */ @@ -2434,6 +2551,14 @@ static void nfs4_xdr_enc_lock(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_lock(const void *data) +{ + const struct nfs_lock_args *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode a LOCKT request */ @@ -2452,6 +2577,14 @@ static void nfs4_xdr_enc_lockt(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_lockt(const void *data) +{ + const struct nfs_lockt_args *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode a LOCKU request */ @@ -2470,6 +2603,14 @@ static void nfs4_xdr_enc_locku(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_locku(const void *data) +{ + const struct nfs_locku_args *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + static void nfs4_xdr_enc_release_lockowner(struct rpc_rqst *req, struct xdr_stream *xdr, const void *data) @@ -2484,6 +2625,11 @@ static void nfs4_xdr_enc_release_lockowner(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_release_lockowner(const void *data) +{ + return 0; +} + /* * Encode a READLINK request */ @@ -2505,6 +2651,14 @@ static void nfs4_xdr_enc_readlink(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_readlink(const void *data) +{ + const struct nfs4_readlink *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode a READDIR request */ @@ -2526,6 +2680,14 @@ static void nfs4_xdr_enc_readdir(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_readdir(const void *data) +{ + const struct nfs4_readdir_arg *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode a READ request */ @@ -2548,6 +2710,14 @@ static void nfs4_xdr_enc_read(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_read(const void *data) +{ + const struct nfs_pgio_args *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode an SETATTR request */ @@ -2567,6 +2737,14 @@ static void nfs4_xdr_enc_setattr(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_setattr(const void *data) +{ + const struct nfs_setattrargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode a GETACL request */ @@ -2594,6 +2772,14 @@ static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_getacl(const void *data) +{ + const struct nfs_getaclargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode a WRITE request */ @@ -2615,6 +2801,14 @@ static void nfs4_xdr_enc_write(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_write(const void *data) +{ + const struct nfs_pgio_args *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * a COMMIT request */ @@ -2633,6 +2827,14 @@ static void nfs4_xdr_enc_commit(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_commit(const void *data) +{ + const struct nfs_commitargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * FSINFO request */ @@ -2651,6 +2853,14 @@ static void nfs4_xdr_enc_fsinfo(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_fsinfo(const void *data) +{ + const struct nfs4_fsinfo_arg *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * a PATHCONF request */ @@ -2670,6 +2880,14 @@ static void nfs4_xdr_enc_pathconf(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_pathconf(const void *data) +{ + const struct nfs4_pathconf_arg *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * a STATFS request */ @@ -2689,6 +2907,14 @@ static void nfs4_xdr_enc_statfs(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_statfs(const void *data) +{ + const struct nfs4_statfs_arg *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * GETATTR_BITMAP request */ @@ -2709,6 +2935,14 @@ static void nfs4_xdr_enc_server_caps(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_server_caps(const void *data) +{ + const struct nfs4_server_caps_arg *args = data; + const struct nfs_fh *fh = args->fhandle; + + return jhash(fh->data, fh->size, 0); +} + /* * a RENEW request */ @@ -2726,6 +2960,11 @@ static void nfs4_xdr_enc_renew(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_renew(const void *data) +{ + return 0; +} + /* * a SETCLIENTID request */ @@ -2743,6 +2982,11 @@ static void nfs4_xdr_enc_setclientid(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_setclientid(const void *data) +{ + return 0; +} + /* * a SETCLIENTID_CONFIRM request */ @@ -2760,6 +3004,11 @@ static void nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_setclientid_confirm(const void *data) +{ + return 0; +} + /* * DELEGRETURN request */ @@ -2783,6 +3032,14 @@ static void nfs4_xdr_enc_delegreturn(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_delegreturn(const void *data) +{ + const struct nfs4_delegreturnargs *args = data; + const struct nfs_fh *fh = args->fhandle; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode FS_LOCATIONS request */ @@ -2816,6 +3073,14 @@ static void nfs4_xdr_enc_fs_locations(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_fs_locations(const void *data) +{ + const struct nfs4_fs_locations_arg *args = data; + const struct nfs_fh *fh = args->migration ? args->fh : args->dir_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode SECINFO request */ @@ -2835,6 +3100,14 @@ static void nfs4_xdr_enc_secinfo(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_secinfo(const void *data) +{ + const struct nfs4_secinfo_arg *args = data; + const struct nfs_fh *fh = args->dir_fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Encode FSID_PRESENT request */ @@ -2856,6 +3129,14 @@ static void nfs4_xdr_enc_fsid_present(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_fsid_present(const void *data) +{ + const struct nfs4_fsid_present_arg *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + #if defined(CONFIG_NFS_V4_1) /* * BIND_CONN_TO_SESSION request @@ -2874,6 +3155,11 @@ static void nfs4_xdr_enc_bind_conn_to_session(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_bind_conn_to_session(const void *data) +{ + return 0; +} + /* * EXCHANGE_ID request */ @@ -2891,6 +3177,11 @@ static void nfs4_xdr_enc_exchange_id(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_exchange_id(const void *data) +{ + return 0; +} + /* * a CREATE_SESSION request */ @@ -2908,6 +3199,11 @@ static void nfs4_xdr_enc_create_session(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_create_session(const void *data) +{ + return 0; +} + /* * a DESTROY_SESSION request */ @@ -2925,6 +3221,11 @@ static void nfs4_xdr_enc_destroy_session(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_destroy_session(const void *data) +{ + return 0; +} + /* * a DESTROY_CLIENTID request */ @@ -2942,6 +3243,11 @@ static void nfs4_xdr_enc_destroy_clientid(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_destroy_clientid(const void *data) +{ + return 0; +} + /* * a SEQUENCE request */ @@ -2958,6 +3264,11 @@ static void nfs4_xdr_enc_sequence(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_sequence(const void *data) +{ + return 0; +} + #endif /* @@ -2980,6 +3291,11 @@ static void nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_get_lease_time(const void *data) +{ + return 0; +} + #ifdef CONFIG_NFS_V4_1 /* @@ -3000,6 +3316,11 @@ static void nfs4_xdr_enc_reclaim_complete(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_reclaim_complete(const void *data) +{ + return 0; +} + /* * Encode GETDEVICEINFO request */ @@ -3027,6 +3348,11 @@ static void nfs4_xdr_enc_getdeviceinfo(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_getdeviceinfo(const void *data) +{ + return 0; +} + /* * Encode LAYOUTGET request */ @@ -3049,6 +3375,14 @@ static void nfs4_xdr_enc_layoutget(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_layoutget(const void *data) +{ + const struct nfs4_layoutget_args *args = data; + const struct nfs_fh *fh = NFS_FH(args->inode); + + return jhash(fh->data, fh->size, 0); +} + /* * Encode LAYOUTCOMMIT request */ @@ -3071,6 +3405,14 @@ static void nfs4_xdr_enc_layoutcommit(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_layoutcommit(const void *priv) +{ + const struct nfs4_layoutcommit_args *args = priv; + const struct nfs_fh *fh = NFS_FH(args->inode); + + return jhash(fh->data, fh->size, 0); +} + /* * Encode LAYOUTRETURN request */ @@ -3090,6 +3432,14 @@ static void nfs4_xdr_enc_layoutreturn(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_layoutreturn(const void *data) +{ + const struct nfs4_layoutreturn_args *args = data; + const struct nfs_fh *fh = NFS_FH(args->inode); + + return jhash(fh->data, fh->size, 0); +} + /* * Encode SECINFO_NO_NAME request */ @@ -3109,6 +3459,11 @@ static void nfs4_xdr_enc_secinfo_no_name(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_secinfo_no_name(const void *data) +{ + return 0; +} + /* * Encode TEST_STATEID request */ @@ -3127,6 +3482,11 @@ static void nfs4_xdr_enc_test_stateid(struct rpc_rqst *req, encode_nops(&hdr); } +static u32 nfs4_fh_hash_test_stateid(const void *data) +{ + return 0; +} + /* * Encode FREE_STATEID request */ @@ -3144,6 +3504,11 @@ static void nfs4_xdr_enc_free_stateid(struct rpc_rqst *req, encode_free_stateid(xdr, args, &hdr); encode_nops(&hdr); } + +static u32 nfs4_fh_hash_free_stateid(const void *data) +{ + return 0; +} #endif /* CONFIG_NFS_V4_1 */ static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char **string) @@ -6373,6 +6738,14 @@ static void nfs4_xdr_enc_setacl(struct rpc_rqst *req, struct xdr_stream *xdr, encode_nops(&hdr); } +static u32 nfs4_fh_hash_setacl(const void *data) +{ + const struct nfs_setaclargs *args = data; + const struct nfs_fh *fh = args->fh; + + return jhash(fh->data, fh->size, 0); +} + /* * Decode SETACL response */ @@ -7521,10 +7894,11 @@ nfs4_stat_to_errno(int stat) #define PROC(proc, argtype, restype) \ [NFSPROC4_CLNT_##proc] = { \ .p_proc = NFSPROC4_COMPOUND, \ - .p_encode = nfs4_xdr_##argtype, \ - .p_decode = nfs4_xdr_##restype, \ - .p_arglen = NFS4_##argtype##_sz, \ - .p_replen = NFS4_##restype##_sz, \ + .p_encode = nfs4_xdr_enc_##argtype, \ + .p_decode = nfs4_xdr_dec_##restype, \ + .p_fhhash = nfs4_fh_hash_##argtype, \ + .p_arglen = NFS4_enc_##argtype##_sz, \ + .p_replen = NFS4_dec_##restype##_sz, \ .p_statidx = NFSPROC4_CLNT_##proc, \ .p_name = #proc, \ } @@ -7551,75 +7925,75 @@ nfs4_stat_to_errno(int stat) #endif const struct rpc_procinfo nfs4_procedures[] = { - PROC(READ, enc_read, dec_read), - PROC(WRITE, enc_write, dec_write), - PROC(COMMIT, enc_commit, dec_commit), - PROC(OPEN, enc_open, dec_open), - PROC(OPEN_CONFIRM, enc_open_confirm, dec_open_confirm), - PROC(OPEN_NOATTR, enc_open_noattr, dec_open_noattr), - PROC(OPEN_DOWNGRADE, enc_open_downgrade, dec_open_downgrade), - PROC(CLOSE, enc_close, dec_close), - PROC(SETATTR, enc_setattr, dec_setattr), - PROC(FSINFO, enc_fsinfo, dec_fsinfo), - PROC(RENEW, enc_renew, dec_renew), - PROC(SETCLIENTID, enc_setclientid, dec_setclientid), - PROC(SETCLIENTID_CONFIRM, enc_setclientid_confirm, dec_setclientid_confirm), - PROC(LOCK, enc_lock, dec_lock), - PROC(LOCKT, enc_lockt, dec_lockt), - PROC(LOCKU, enc_locku, dec_locku), - PROC(ACCESS, enc_access, dec_access), - PROC(GETATTR, enc_getattr, dec_getattr), - PROC(LOOKUP, enc_lookup, dec_lookup), - PROC(LOOKUP_ROOT, enc_lookup_root, dec_lookup_root), - PROC(REMOVE, enc_remove, dec_remove), - PROC(RENAME, enc_rename, dec_rename), - PROC(LINK, enc_link, dec_link), - PROC(SYMLINK, enc_symlink, dec_symlink), - PROC(CREATE, enc_create, dec_create), - PROC(PATHCONF, enc_pathconf, dec_pathconf), - PROC(STATFS, enc_statfs, dec_statfs), - PROC(READLINK, enc_readlink, dec_readlink), - PROC(READDIR, enc_readdir, dec_readdir), - PROC(SERVER_CAPS, enc_server_caps, dec_server_caps), - PROC(DELEGRETURN, enc_delegreturn, dec_delegreturn), - PROC(GETACL, enc_getacl, dec_getacl), - PROC(SETACL, enc_setacl, dec_setacl), - PROC(FS_LOCATIONS, enc_fs_locations, dec_fs_locations), - PROC(RELEASE_LOCKOWNER, enc_release_lockowner, dec_release_lockowner), - PROC(SECINFO, enc_secinfo, dec_secinfo), - PROC(FSID_PRESENT, enc_fsid_present, dec_fsid_present), - PROC41(EXCHANGE_ID, enc_exchange_id, dec_exchange_id), - PROC41(CREATE_SESSION, enc_create_session, dec_create_session), - PROC41(DESTROY_SESSION, enc_destroy_session, dec_destroy_session), - PROC41(SEQUENCE, enc_sequence, dec_sequence), - PROC(GET_LEASE_TIME, enc_get_lease_time, dec_get_lease_time), - PROC41(RECLAIM_COMPLETE,enc_reclaim_complete, dec_reclaim_complete), - PROC41(GETDEVICEINFO, enc_getdeviceinfo, dec_getdeviceinfo), - PROC41(LAYOUTGET, enc_layoutget, dec_layoutget), - PROC41(LAYOUTCOMMIT, enc_layoutcommit, dec_layoutcommit), - PROC41(LAYOUTRETURN, enc_layoutreturn, dec_layoutreturn), - PROC41(SECINFO_NO_NAME, enc_secinfo_no_name, dec_secinfo_no_name), - PROC41(TEST_STATEID, enc_test_stateid, dec_test_stateid), - PROC41(FREE_STATEID, enc_free_stateid, dec_free_stateid), + PROC(READ, read, read), + PROC(WRITE, write, write), + PROC(COMMIT, commit, commit), + PROC(OPEN, open, open), + PROC(OPEN_CONFIRM, open_confirm, open_confirm), + PROC(OPEN_NOATTR, open_noattr, open_noattr), + PROC(OPEN_DOWNGRADE, open_downgrade, open_downgrade), + PROC(CLOSE, close, close), + PROC(SETATTR, setattr, setattr), + PROC(FSINFO, fsinfo, fsinfo), + PROC(RENEW, renew, renew), + PROC(SETCLIENTID, setclientid, setclientid), + PROC(SETCLIENTID_CONFIRM, setclientid_confirm, setclientid_confirm), + PROC(LOCK, lock, lock), + PROC(LOCKT, lockt, lockt), + PROC(LOCKU, locku, locku), + PROC(ACCESS, access, access), + PROC(GETATTR, getattr, getattr), + PROC(LOOKUP, lookup, lookup), + PROC(LOOKUP_ROOT, lookup_root, lookup_root), + PROC(REMOVE, remove, remove), + PROC(RENAME, rename, rename), + PROC(LINK, link, link), + PROC(SYMLINK, symlink, symlink), + PROC(CREATE, create, create), + PROC(PATHCONF, pathconf, pathconf), + PROC(STATFS, statfs, statfs), + PROC(READLINK, readlink, readlink), + PROC(READDIR, readdir, readdir), + PROC(SERVER_CAPS, server_caps, server_caps), + PROC(DELEGRETURN, delegreturn, delegreturn), + PROC(GETACL, getacl, getacl), + PROC(SETACL, setacl, setacl), + PROC(FS_LOCATIONS, fs_locations, fs_locations), + PROC(RELEASE_LOCKOWNER, release_lockowner, release_lockowner), + PROC(SECINFO, secinfo, secinfo), + PROC(FSID_PRESENT, fsid_present, fsid_present), + PROC41(EXCHANGE_ID, exchange_id, exchange_id), + PROC41(CREATE_SESSION, create_session, create_session), + PROC41(DESTROY_SESSION, destroy_session, destroy_session), + PROC41(SEQUENCE, sequence, sequence), + PROC(GET_LEASE_TIME, get_lease_time, get_lease_time), + PROC41(RECLAIM_COMPLETE, reclaim_complete, reclaim_complete), + PROC41(GETDEVICEINFO, getdeviceinfo, getdeviceinfo), + PROC41(LAYOUTGET, layoutget, layoutget), + PROC41(LAYOUTCOMMIT, layoutcommit, layoutcommit), + PROC41(LAYOUTRETURN, layoutreturn, layoutreturn), + PROC41(SECINFO_NO_NAME, secinfo_no_name, secinfo_no_name), + PROC41(TEST_STATEID, test_stateid, test_stateid), + PROC41(FREE_STATEID, free_stateid, free_stateid), STUB(GETDEVICELIST), PROC41(BIND_CONN_TO_SESSION, - enc_bind_conn_to_session, dec_bind_conn_to_session), - PROC41(DESTROY_CLIENTID,enc_destroy_clientid, dec_destroy_clientid), - PROC42(SEEK, enc_seek, dec_seek), - PROC42(ALLOCATE, enc_allocate, dec_allocate), - PROC42(DEALLOCATE, enc_deallocate, dec_deallocate), - PROC42(LAYOUTSTATS, enc_layoutstats, dec_layoutstats), - PROC42(CLONE, enc_clone, dec_clone), - PROC42(COPY, enc_copy, dec_copy), - PROC42(OFFLOAD_CANCEL, enc_offload_cancel, dec_offload_cancel), - PROC42(COPY_NOTIFY, enc_copy_notify, dec_copy_notify), - PROC(LOOKUPP, enc_lookupp, dec_lookupp), - PROC42(LAYOUTERROR, enc_layouterror, dec_layouterror), - PROC42(GETXATTR, enc_getxattr, dec_getxattr), - PROC42(SETXATTR, enc_setxattr, dec_setxattr), - PROC42(LISTXATTRS, enc_listxattrs, dec_listxattrs), - PROC42(REMOVEXATTR, enc_removexattr, dec_removexattr), - PROC42(READ_PLUS, enc_read_plus, dec_read_plus), + bind_conn_to_session, bind_conn_to_session), + PROC41(DESTROY_CLIENTID, destroy_clientid, destroy_clientid), + PROC42(SEEK, seek, seek), + PROC42(ALLOCATE, allocate, allocate), + PROC42(DEALLOCATE, deallocate, deallocate), + PROC42(LAYOUTSTATS, layoutstats, layoutstats), + PROC42(CLONE, clone, clone), + PROC42(COPY, copy, copy), + PROC42(OFFLOAD_CANCEL, offload_cancel, offload_cancel), + PROC42(COPY_NOTIFY, copy_notify, copy_notify), + PROC(LOOKUPP, lookupp, lookupp), + PROC42(LAYOUTERROR, layouterror, layouterror), + PROC42(GETXATTR, getxattr, getxattr), + PROC42(SETXATTR, setxattr, setxattr), + PROC42(LISTXATTRS, listxattrs, listxattrs), + PROC42(REMOVEXATTR, removexattr, removexattr), + PROC42(READ_PLUS, read_plus, read_plus), }; static unsigned int nfs_version4_counts[ARRAY_SIZE(nfs4_procedures)];