Skip to content

Commit f34b580

Browse files
committed
Merge tag 'nfsd-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux
Pull nfsd updates from Chuck Lever: "Jeff Layton contributed an implementation of NFSv4.2+ attribute delegation, as described here: https://www.ietf.org/archive/id/draft-ietf-nfsv4-delstid-08.html This interoperates with similar functionality introduced into the Linux NFS client in v6.11. An attribute delegation permits an NFS client to manage a file's mtime, rather than flushing dirty data to the NFS server so that the file's mtime reflects the last write, which is considerably slower. Neil Brown contributed dynamic NFSv4.1 session slot table resizing. This facility enables NFSD to increase or decrease the number of slots per NFS session depending on server memory availability. More session slots means greater parallelism. Chuck Lever fixed a long-standing latent bug where NFSv4 COMPOUND encoding screws up when crossing a page boundary in the encoding buffer. This is a zero-day bug, but hitting it is rare and depends on the NFS client implementation. The Linux NFS client does not happen to trigger this issue. A variety of bug fixes and other incremental improvements fill out the list of commits in this release. Great thanks to all contributors, reviewers, testers, and bug reporters who participated during this development cycle" * tag 'nfsd-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux: (42 commits) sunrpc: Remove gss_{de,en}crypt_xdr_buf deadcode sunrpc: Remove gss_generic_token deadcode sunrpc: Remove unused xprt_iter_get_xprt Revert "SUNRPC: Reduce thread wake-up rate when receiving large RPC messages" nfsd: implement OPEN_ARGS_SHARE_ACCESS_WANT_OPEN_XOR_DELEGATION nfsd: handle delegated timestamps in SETATTR nfsd: add support for delegated timestamps nfsd: rework NFS4_SHARE_WANT_* flag handling nfsd: add support for FATTR4_OPEN_ARGUMENTS nfsd: prepare delegation code for handing out *_ATTRS_DELEG delegations nfsd: rename NFS4_SHARE_WANT_* constants to OPEN4_SHARE_ACCESS_WANT_* nfsd: switch to autogenerated definitions for open_delegation_type4 nfs_common: make include/linux/nfs4.h include generated nfs4_1.h nfsd: fix handling of delegated change attr in CB_GETATTR SUNRPC: Document validity guarantees of the pointer returned by reserve_space NFSD: Insulate nfsd4_encode_fattr4() from page boundaries in the encode buffer NFSD: Insulate nfsd4_encode_secinfo() from page boundaries in the encode buffer NFSD: Refactor nfsd4_do_encode_secinfo() again NFSD: Insulate nfsd4_encode_readlink() from page boundaries in the encode buffer NFSD: Insulate nfsd4_encode_read_plus_data() from page boundaries in the encode buffer ...
2 parents 7d6e5b5 + c92066e commit f34b580

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1464
-887
lines changed

Documentation/sunrpc/xdr/nfs4_1.x

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
/*
2+
* Copyright (c) 2010 IETF Trust and the persons identified
3+
* as the document authors. All rights reserved.
4+
*
5+
* The document authors are identified in RFC 3530 and
6+
* RFC 5661.
7+
*
8+
* Redistribution and use in source and binary forms, with
9+
* or without modification, are permitted provided that the
10+
* following conditions are met:
11+
*
12+
* - Redistributions of source code must retain the above
13+
* copyright notice, this list of conditions and the
14+
* following disclaimer.
15+
*
16+
* - Redistributions in binary form must reproduce the above
17+
* copyright notice, this list of conditions and the
18+
* following disclaimer in the documentation and/or other
19+
* materials provided with the distribution.
20+
*
21+
* - Neither the name of Internet Society, IETF or IETF
22+
* Trust, nor the names of specific contributors, may be
23+
* used to endorse or promote products derived from this
24+
* software without specific prior written permission.
25+
*
26+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
27+
* AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
28+
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
30+
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
31+
* EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
32+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
33+
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
34+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
36+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
37+
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
38+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
39+
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
40+
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41+
*/
42+
43+
pragma header nfs4;
44+
45+
/*
46+
* Basic typedefs for RFC 1832 data type definitions
47+
*/
48+
typedef hyper int64_t;
49+
typedef unsigned int uint32_t;
50+
51+
/*
52+
* Basic data types
53+
*/
54+
typedef uint32_t bitmap4<>;
55+
56+
/*
57+
* Timeval
58+
*/
59+
struct nfstime4 {
60+
int64_t seconds;
61+
uint32_t nseconds;
62+
};
63+
64+
65+
/*
66+
* The following content was extracted from draft-ietf-nfsv4-delstid
67+
*/
68+
69+
typedef bool fattr4_offline;
70+
71+
72+
const FATTR4_OFFLINE = 83;
73+
74+
75+
struct open_arguments4 {
76+
bitmap4 oa_share_access;
77+
bitmap4 oa_share_deny;
78+
bitmap4 oa_share_access_want;
79+
bitmap4 oa_open_claim;
80+
bitmap4 oa_create_mode;
81+
};
82+
83+
84+
enum open_args_share_access4 {
85+
OPEN_ARGS_SHARE_ACCESS_READ = 1,
86+
OPEN_ARGS_SHARE_ACCESS_WRITE = 2,
87+
OPEN_ARGS_SHARE_ACCESS_BOTH = 3
88+
};
89+
90+
91+
enum open_args_share_deny4 {
92+
OPEN_ARGS_SHARE_DENY_NONE = 0,
93+
OPEN_ARGS_SHARE_DENY_READ = 1,
94+
OPEN_ARGS_SHARE_DENY_WRITE = 2,
95+
OPEN_ARGS_SHARE_DENY_BOTH = 3
96+
};
97+
98+
99+
enum open_args_share_access_want4 {
100+
OPEN_ARGS_SHARE_ACCESS_WANT_ANY_DELEG = 3,
101+
OPEN_ARGS_SHARE_ACCESS_WANT_NO_DELEG = 4,
102+
OPEN_ARGS_SHARE_ACCESS_WANT_CANCEL = 5,
103+
OPEN_ARGS_SHARE_ACCESS_WANT_SIGNAL_DELEG_WHEN_RESRC_AVAIL
104+
= 17,
105+
OPEN_ARGS_SHARE_ACCESS_WANT_PUSH_DELEG_WHEN_UNCONTENDED
106+
= 18,
107+
OPEN_ARGS_SHARE_ACCESS_WANT_DELEG_TIMESTAMPS = 20,
108+
OPEN_ARGS_SHARE_ACCESS_WANT_OPEN_XOR_DELEGATION = 21
109+
};
110+
111+
112+
enum open_args_open_claim4 {
113+
OPEN_ARGS_OPEN_CLAIM_NULL = 0,
114+
OPEN_ARGS_OPEN_CLAIM_PREVIOUS = 1,
115+
OPEN_ARGS_OPEN_CLAIM_DELEGATE_CUR = 2,
116+
OPEN_ARGS_OPEN_CLAIM_DELEGATE_PREV = 3,
117+
OPEN_ARGS_OPEN_CLAIM_FH = 4,
118+
OPEN_ARGS_OPEN_CLAIM_DELEG_CUR_FH = 5,
119+
OPEN_ARGS_OPEN_CLAIM_DELEG_PREV_FH = 6
120+
};
121+
122+
123+
enum open_args_createmode4 {
124+
OPEN_ARGS_CREATEMODE_UNCHECKED4 = 0,
125+
OPEN_ARGS_CREATE_MODE_GUARDED = 1,
126+
OPEN_ARGS_CREATEMODE_EXCLUSIVE4 = 2,
127+
OPEN_ARGS_CREATE_MODE_EXCLUSIVE4_1 = 3
128+
};
129+
130+
131+
typedef open_arguments4 fattr4_open_arguments;
132+
pragma public fattr4_open_arguments;
133+
134+
135+
%/*
136+
% * Determine what OPEN supports.
137+
% */
138+
const FATTR4_OPEN_ARGUMENTS = 86;
139+
140+
141+
142+
143+
const OPEN4_RESULT_NO_OPEN_STATEID = 0x00000010;
144+
145+
146+
/*
147+
* attributes for the delegation times being
148+
* cached and served by the "client"
149+
*/
150+
typedef nfstime4 fattr4_time_deleg_access;
151+
typedef nfstime4 fattr4_time_deleg_modify;
152+
pragma public fattr4_time_deleg_access;
153+
pragma public fattr4_time_deleg_modify;
154+
155+
156+
%/*
157+
% * New RECOMMENDED Attribute for
158+
% * delegation caching of times
159+
% */
160+
const FATTR4_TIME_DELEG_ACCESS = 84;
161+
const FATTR4_TIME_DELEG_MODIFY = 85;
162+
163+
164+
165+
/* new flags for share_access field of OPEN4args */
166+
const OPEN4_SHARE_ACCESS_WANT_DELEG_MASK = 0xFF00;
167+
const OPEN4_SHARE_ACCESS_WANT_NO_PREFERENCE = 0x0000;
168+
const OPEN4_SHARE_ACCESS_WANT_READ_DELEG = 0x0100;
169+
const OPEN4_SHARE_ACCESS_WANT_WRITE_DELEG = 0x0200;
170+
const OPEN4_SHARE_ACCESS_WANT_ANY_DELEG = 0x0300;
171+
const OPEN4_SHARE_ACCESS_WANT_NO_DELEG = 0x0400;
172+
const OPEN4_SHARE_ACCESS_WANT_CANCEL = 0x0500;
173+
174+
const OPEN4_SHARE_ACCESS_WANT_SIGNAL_DELEG_WHEN_RESRC_AVAIL = 0x10000;
175+
const OPEN4_SHARE_ACCESS_WANT_PUSH_DELEG_WHEN_UNCONTENDED = 0x20000;
176+
const OPEN4_SHARE_ACCESS_WANT_DELEG_TIMESTAMPS = 0x100000;
177+
const OPEN4_SHARE_ACCESS_WANT_OPEN_XOR_DELEGATION = 0x200000;
178+
179+
enum open_delegation_type4 {
180+
OPEN_DELEGATE_NONE = 0,
181+
OPEN_DELEGATE_READ = 1,
182+
OPEN_DELEGATE_WRITE = 2,
183+
OPEN_DELEGATE_NONE_EXT = 3, /* new to v4.1 */
184+
OPEN_DELEGATE_READ_ATTRS_DELEG = 4,
185+
OPEN_DELEGATE_WRITE_ATTRS_DELEG = 5
186+
};

fs/lockd/svc.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,6 @@ static unsigned long nlm_grace_period;
7070
unsigned long nlm_timeout = LOCKD_DFLT_TIMEO;
7171
static int nlm_udpport, nlm_tcpport;
7272

73-
/* RLIM_NOFILE defaults to 1024. That seems like a reasonable default here. */
74-
static unsigned int nlm_max_connections = 1024;
75-
7673
/*
7774
* Constants needed for the sysctl interface.
7875
*/
@@ -136,9 +133,6 @@ lockd(void *vrqstp)
136133
* NFS mount or NFS daemon has gone away.
137134
*/
138135
while (!svc_thread_should_stop(rqstp)) {
139-
/* update sv_maxconn if it has changed */
140-
rqstp->rq_server->sv_maxconn = nlm_max_connections;
141-
142136
nlmsvc_retry_blocked(rqstp);
143137
svc_recv(rqstp);
144138
}
@@ -340,7 +334,6 @@ static int lockd_get(void)
340334
return -ENOMEM;
341335
}
342336

343-
serv->sv_maxconn = nlm_max_connections;
344337
error = svc_set_num_threads(serv, NULL, 1);
345338
if (error < 0) {
346339
svc_destroy(&serv);
@@ -542,7 +535,6 @@ module_param_call(nlm_udpport, param_set_port, param_get_int,
542535
module_param_call(nlm_tcpport, param_set_port, param_get_int,
543536
&nlm_tcpport, 0644);
544537
module_param(nsm_use_hostnames, bool, 0644);
545-
module_param(nlm_max_connections, uint, 0644);
546538

547539
static int lockd_init_net(struct net *net)
548540
{

fs/nfs/callback.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,6 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)
211211
return ERR_PTR(-ENOMEM);
212212
}
213213
cb_info->serv = serv;
214-
/* As there is only one thread we need to over-ride the
215-
* default maximum of 80 connections
216-
*/
217-
serv->sv_maxconn = 1024;
218214
dprintk("nfs_callback_create_svc: service created\n");
219215
return serv;
220216
}

fs/nfs/callback_xdr.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,7 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp)
984984
nfs_put_client(cps.clp);
985985
goto out_invalidcred;
986986
}
987+
svc_xprt_set_valid(rqstp->rq_xprt);
987988
}
988989

989990
cps.minorversion = hdr_arg.minorversion;

fs/nfsd/Makefile

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,23 @@ nfsd-$(CONFIG_NFSD_V2) += nfsproc.o nfsxdr.o
1818
nfsd-$(CONFIG_NFSD_V2_ACL) += nfs2acl.o
1919
nfsd-$(CONFIG_NFSD_V3_ACL) += nfs3acl.o
2020
nfsd-$(CONFIG_NFSD_V4) += nfs4proc.o nfs4xdr.o nfs4state.o nfs4idmap.o \
21-
nfs4acl.o nfs4callback.o nfs4recover.o
21+
nfs4acl.o nfs4callback.o nfs4recover.o nfs4xdr_gen.o
2222
nfsd-$(CONFIG_NFSD_PNFS) += nfs4layouts.o
2323
nfsd-$(CONFIG_NFSD_BLOCKLAYOUT) += blocklayout.o blocklayoutxdr.o
2424
nfsd-$(CONFIG_NFSD_SCSILAYOUT) += blocklayout.o blocklayoutxdr.o
2525
nfsd-$(CONFIG_NFSD_FLEXFILELAYOUT) += flexfilelayout.o flexfilelayoutxdr.o
2626
nfsd-$(CONFIG_NFS_LOCALIO) += localio.o
27+
28+
29+
.PHONY: xdrgen
30+
31+
xdrgen: ../../include/linux/sunrpc/xdrgen/nfs4_1.h nfs4xdr_gen.h nfs4xdr_gen.c
32+
33+
../../include/linux/sunrpc/xdrgen/nfs4_1.h: ../../Documentation/sunrpc/xdr/nfs4_1.x
34+
../../tools/net/sunrpc/xdrgen/xdrgen definitions $< > $@
35+
36+
nfs4xdr_gen.h: ../../Documentation/sunrpc/xdr/nfs4_1.x
37+
../../tools/net/sunrpc/xdrgen/xdrgen declarations $< > $@
38+
39+
nfs4xdr_gen.c: ../../Documentation/sunrpc/xdr/nfs4_1.x
40+
../../tools/net/sunrpc/xdrgen/xdrgen source $< > $@

fs/nfsd/export.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -355,16 +355,25 @@ static void export_stats_destroy(struct export_stats *stats)
355355
EXP_STATS_COUNTERS_NUM);
356356
}
357357

358-
static void svc_export_put(struct kref *ref)
358+
static void svc_export_release(struct rcu_head *rcu_head)
359359
{
360-
struct svc_export *exp = container_of(ref, struct svc_export, h.ref);
361-
path_put(&exp->ex_path);
362-
auth_domain_put(exp->ex_client);
360+
struct svc_export *exp = container_of(rcu_head, struct svc_export,
361+
ex_rcu);
362+
363363
nfsd4_fslocs_free(&exp->ex_fslocs);
364364
export_stats_destroy(exp->ex_stats);
365365
kfree(exp->ex_stats);
366366
kfree(exp->ex_uuid);
367-
kfree_rcu(exp, ex_rcu);
367+
kfree(exp);
368+
}
369+
370+
static void svc_export_put(struct kref *ref)
371+
{
372+
struct svc_export *exp = container_of(ref, struct svc_export, h.ref);
373+
374+
path_put(&exp->ex_path);
375+
auth_domain_put(exp->ex_client);
376+
call_rcu(&exp->ex_rcu, svc_export_release);
368377
}
369378

370379
static int svc_export_upcall(struct cache_detail *cd, struct cache_head *h)
@@ -1425,13 +1434,9 @@ static int e_show(struct seq_file *m, void *p)
14251434
return 0;
14261435
}
14271436

1428-
if (!cache_get_rcu(&exp->h))
1429-
return 0;
1430-
1431-
if (cache_check(cd, &exp->h, NULL))
1437+
if (cache_check_rcu(cd, &exp->h, NULL))
14321438
return 0;
14331439

1434-
exp_put(exp);
14351440
return svc_export_show(m, cd, cp);
14361441
}
14371442

fs/nfsd/netns.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,6 @@ struct nfsd_net {
128128
seqlock_t writeverf_lock;
129129
unsigned char writeverf[8];
130130

131-
/*
132-
* Max number of connections this nfsd container will allow. Defaults
133-
* to '0' which is means that it bases this on the number of threads.
134-
*/
135-
unsigned int max_connections;
136-
137131
u32 clientid_base;
138132
u32 clientid_counter;
139133
u32 clverifier_counter;

0 commit comments

Comments
 (0)