]> git.ipfire.org Git - thirdparty/kernel/stable.git/log
thirdparty/kernel/stable.git
16 months agonfsd: rename lookup_clientid->set_client
J. Bruce Fields [Thu, 21 Jan 2021 22:57:40 +0000 (17:57 -0500)] 
nfsd: rename lookup_clientid->set_client

[ Upstream commit 460d27091ae2c23e7ac959a61cd481c58832db58 ]

I think this is a better name, and I'm going to reuse elsewhere the code
that does the lookup itself.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: simplify nfsd_renew
J. Bruce Fields [Thu, 21 Jan 2021 22:57:39 +0000 (17:57 -0500)] 
nfsd: simplify nfsd_renew

[ Upstream commit b4587eb2cf4b6271f67fb93b75f7de2a2026e853 ]

You can take the single-exit thing too far, I think.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: simplify process_lock
J. Bruce Fields [Thu, 21 Jan 2021 22:57:38 +0000 (17:57 -0500)] 
nfsd: simplify process_lock

[ Upstream commit a9d53a75cf574d6aa41f3cb4968fffe4f64e0fad ]

Similarly, this STALE_CLIENTID check is already handled by:

nfs4_preprocess_confirmed_seqid_op()->
        nfs4_preprocess_seqid_op()->
                nfsd4_lookup_stateid()->
                        set_client()->
                                STALE_CLIENTID()

(This may cause it to return a different error in some cases where
there are multiple things wrong; pynfs test SEQ10 regressed on this
commit because of that, but I think that's the test's fault, and I've
fixed it separately.)

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd4: simplify process_lookup1
J. Bruce Fields [Thu, 21 Jan 2021 22:57:37 +0000 (17:57 -0500)] 
nfsd4: simplify process_lookup1

[ Upstream commit 33311873adb0d55c287b164117b5b4bb7b1bdc40 ]

This STALE_CLIENTID check is redundant with the one in
lookup_clientid().

There's a difference in behavior is in case of memory allocation
failure, which I think isn't a big deal.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: report per-export stats
Amir Goldstein [Wed, 6 Jan 2021 07:52:36 +0000 (09:52 +0200)] 
nfsd: report per-export stats

[ Upstream commit 20ad856e47323e208ae8d6a9ecfe5bf0be6f505e ]

Collect some nfsd stats per export in addition to the global stats.

A new nfsdfs export_stats file is created.  It uses the same ops as the
exports file to iterate the export entries and we use the file's name to
determine the reported info per export.  For example:

 $ cat /proc/fs/nfsd/export_stats
 # Version 1.1
 # Path Client Start-time
 # Stats
 /test localhost 92
fh_stale: 0
io_read: 9
io_write: 1

Every export entry reports the start time when stats collection
started, so stats collecting scripts can know if stats where reset
between samples.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: protect concurrent access to nfsd stats counters
Amir Goldstein [Wed, 6 Jan 2021 07:52:35 +0000 (09:52 +0200)] 
nfsd: protect concurrent access to nfsd stats counters

[ Upstream commit e567b98ce9a4b35b63c364d24828a9e5cd7a8179 ]

nfsd stats counters can be updated by concurrent nfsd threads without any
protection.

Convert some nfsd_stats and nfsd_net struct members to use percpu counters.

The longest_chain* members of struct nfsd_net remain unprotected.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: remove unused stats counters
Amir Goldstein [Wed, 6 Jan 2021 07:52:34 +0000 (09:52 +0200)] 
nfsd: remove unused stats counters

[ Upstream commit 1b76d1df1a3683b6b23cd1c813d13c5e6a9d35e5 ]

Commit 501cb1849f86 ("nfsd: rip out the raparms cache") removed the
code that updates read-ahead cache stats counters,
commit 8bbfa9f3889b ("knfsd: remove the nfsd thread busy histogram")
removed code that updates the thread busy stats counters back in 2009
and code that updated filehandle cache stats was removed back in 2002.

Remove the unused stats counters from nfsd_stats struct and print
hardcoded zeros in /proc/net/rpc/nfsd.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Clean up after updating NFSv3 ACL decoders
Chuck Lever [Tue, 20 Oct 2020 13:56:52 +0000 (09:56 -0400)] 
NFSD: Clean up after updating NFSv3 ACL decoders

[ Upstream commit 9cee763ee654ce8622d673b8e32687d738e24ace ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 SETACL argument decoder to use struct xdr_stream
Chuck Lever [Tue, 17 Nov 2020 16:56:26 +0000 (11:56 -0500)] 
NFSD: Update the NFSv2 SETACL argument decoder to use struct xdr_stream

[ Upstream commit 68519ff2a1c72c67fcdc4b81671acda59f420af9 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv3 GETACL argument decoder to use struct xdr_stream
Chuck Lever [Tue, 17 Nov 2020 16:52:04 +0000 (11:52 -0500)] 
NFSD: Update the NFSv3 GETACL argument decoder to use struct xdr_stream

[ Upstream commit 05027eafc266487c6e056d10ab352861df95b5d4 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Clean up after updating NFSv2 ACL decoders
Chuck Lever [Mon, 19 Oct 2020 21:49:16 +0000 (17:49 -0400)] 
NFSD: Clean up after updating NFSv2 ACL decoders

[ Upstream commit baadce65d6ee3032b921d9c043ba808bc69d6b13 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 ACL ACCESS argument decoder to use struct xdr_stream
Chuck Lever [Tue, 17 Nov 2020 16:49:29 +0000 (11:49 -0500)] 
NFSD: Update the NFSv2 ACL ACCESS argument decoder to use struct xdr_stream

[ Upstream commit 64063892efc1daa3a48882673811ff327ba75ed5 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 ACL GETATTR argument decoder to use struct xdr_stream
Chuck Lever [Tue, 17 Nov 2020 16:46:50 +0000 (11:46 -0500)] 
NFSD: Update the NFSv2 ACL GETATTR argument decoder to use struct xdr_stream

[ Upstream commit 571d31f37a57729c9d3463b5a692a84e619b408a ]

Since the ACL GETATTR procedure is the same as the normal GETATTR
procedure, simply re-use nfssvc_decode_fhandleargs.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 SETACL argument decoder to use struct xdr_stream
Chuck Lever [Tue, 17 Nov 2020 16:37:35 +0000 (11:37 -0500)] 
NFSD: Update the NFSv2 SETACL argument decoder to use struct xdr_stream

[ Upstream commit 427eab3ba22891845265f9a3846de6ac152ec836 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Add an xdr_stream-based decoder for NFSv2/3 ACLs
Chuck Lever [Tue, 17 Nov 2020 15:38:46 +0000 (10:38 -0500)] 
NFSD: Add an xdr_stream-based decoder for NFSv2/3 ACLs

[ Upstream commit 6bb844b4eb6e3b109a2fdaffb60e6da722dc4356 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 GETACL argument decoder to use struct xdr_stream
Chuck Lever [Tue, 17 Nov 2020 16:32:04 +0000 (11:32 -0500)] 
NFSD: Update the NFSv2 GETACL argument decoder to use struct xdr_stream

[ Upstream commit 635a45d34706400c59c3b18ca9fccba195147bda ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Remove argument length checking in nfsd_dispatch()
Chuck Lever [Tue, 20 Oct 2020 14:08:19 +0000 (10:08 -0400)] 
NFSD: Remove argument length checking in nfsd_dispatch()

[ Upstream commit 5650682e16f41722f735b7beeb2dbc3411dfbeb6 ]

Now that the argument decoders for NFSv2 and NFSv3 use the
xdr_stream mechanism, the version-specific length checking logic in
nfsd_dispatch() is no longer necessary.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 SYMLINK argument decoder to use struct xdr_stream
Chuck Lever [Wed, 21 Oct 2020 16:46:03 +0000 (12:46 -0400)] 
NFSD: Update the NFSv2 SYMLINK argument decoder to use struct xdr_stream

[ Upstream commit 09f75a5375ac61f4adb94da0accc1cfc60eb4f2b ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 CREATE argument decoder to use struct xdr_stream
Chuck Lever [Wed, 21 Oct 2020 16:43:58 +0000 (12:43 -0400)] 
NFSD: Update the NFSv2 CREATE argument decoder to use struct xdr_stream

[ Upstream commit 7dcf65b91ecaf60ce593e7859ae2b29b7c46ccbd ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 SETATTR argument decoder to use struct xdr_stream
Chuck Lever [Wed, 21 Oct 2020 16:39:06 +0000 (12:39 -0400)] 
NFSD: Update the NFSv2 SETATTR argument decoder to use struct xdr_stream

[ Upstream commit 2fdd6bd293b9e7dda61220538b2759fbf06f5af0 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 LINK argument decoder to use struct xdr_stream
Chuck Lever [Wed, 21 Oct 2020 16:34:24 +0000 (12:34 -0400)] 
NFSD: Update the NFSv2 LINK argument decoder to use struct xdr_stream

[ Upstream commit 77edcdf91f6245a9881b84e4e101738148bd039a ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 RENAME argument decoder to use struct xdr_stream
Chuck Lever [Wed, 21 Oct 2020 16:35:41 +0000 (12:35 -0400)] 
NFSD: Update the NFSv2 RENAME argument decoder to use struct xdr_stream

[ Upstream commit 62aa557efb81ea3339fabe7f5b1a343e742bbbdf ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update NFSv2 diropargs decoding to use struct xdr_stream
Chuck Lever [Mon, 19 Oct 2020 18:33:24 +0000 (14:33 -0400)] 
NFSD: Update NFSv2 diropargs decoding to use struct xdr_stream

[ Upstream commit 6d742c1864c18f143ea2031f1ed66bcd8f4812de ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 READDIR argument decoder to use struct xdr_stream
Chuck Lever [Mon, 19 Oct 2020 18:15:51 +0000 (14:15 -0400)] 
NFSD: Update the NFSv2 READDIR argument decoder to use struct xdr_stream

[ Upstream commit 8688361ae2edb8f7e61d926dc5000c9a44f29370 ]

As an additional clean up, move code not related to XDR decoding
into readdir's .pc_func call out.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Add helper to set up the pages where the dirlist is encoded
Chuck Lever [Fri, 13 Nov 2020 22:03:49 +0000 (17:03 -0500)] 
NFSD: Add helper to set up the pages where the dirlist is encoded

[ Upstream commit 788cd46ecf83ee2d561cb4e754e276dc8089b787 ]

Add a helper similar to nfsd3_init_dirlist_pages().

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 READLINK argument decoder to use struct xdr_stream
Chuck Lever [Wed, 21 Oct 2020 16:21:25 +0000 (12:21 -0400)] 
NFSD: Update the NFSv2 READLINK argument decoder to use struct xdr_stream

[ Upstream commit 1fcbd1c9456ba129d38420e345e91c4b6363db47 ]

If the code that sets up the sink buffer for nfsd_readlink() is
moved adjacent to the nfsd_readlink() call site that uses it, then
the only argument is a file handle, and the fhandle decoder can be
used instead.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 WRITE argument decoder to use struct xdr_stream
Chuck Lever [Wed, 21 Oct 2020 16:18:36 +0000 (12:18 -0400)] 
NFSD: Update the NFSv2 WRITE argument decoder to use struct xdr_stream

[ Upstream commit a51b5b737a0be93fae6ea2a18df03ab2359a3f4b ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 READ argument decoder to use struct xdr_stream
Chuck Lever [Wed, 21 Oct 2020 16:15:51 +0000 (12:15 -0400)] 
NFSD: Update the NFSv2 READ argument decoder to use struct xdr_stream

[ Upstream commit 8c293ef993c8df0b1bea9ecb0de6eb96dec3ac9d ]

The code that sets up rq_vec is refactored so that it is now
adjacent to the nfsd_read() call site where it is used.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv2 GETATTR argument decoder to use struct xdr_stream
Chuck Lever [Wed, 21 Oct 2020 16:14:23 +0000 (12:14 -0400)] 
NFSD: Update the NFSv2 GETATTR argument decoder to use struct xdr_stream

[ Upstream commit ebcd8e8b28535b643a4c06685bd363b3b73a96af ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the MKNOD3args decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 21:04:03 +0000 (17:04 -0400)] 
NFSD: Update the MKNOD3args decoder to use struct xdr_stream

[ Upstream commit f8a38e2d6c885f9d7cd03febc515d36293de4a5b ]

This commit removes the last usage of the original decode_sattr3(),
so it is removed as a clean-up.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the SYMLINK3args decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 20:01:16 +0000 (16:01 -0400)] 
NFSD: Update the SYMLINK3args decoder to use struct xdr_stream

[ Upstream commit da39201637297460c13134c29286a00f3a1c92fe ]

Similar to the WRITE decoder, code that checks the sanity of the
payload size is re-wired to work with xdr_stream infrastructure.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the MKDIR3args decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 21:02:16 +0000 (17:02 -0400)] 
NFSD: Update the MKDIR3args decoder to use struct xdr_stream

[ Upstream commit 83374c278db193f3e8b2608b45da1132b867a760 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the CREATE3args decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 19:56:11 +0000 (15:56 -0400)] 
NFSD: Update the CREATE3args decoder to use struct xdr_stream

[ Upstream commit 6b3a11960d898b25a30103cc6a2ff0b24b90a83b ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the SETATTR3args decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 19:48:22 +0000 (15:48 -0400)] 
NFSD: Update the SETATTR3args decoder to use struct xdr_stream

[ Upstream commit 9cde9360d18d8b352b737d10f90f2aecccf93dbe ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the LINK3args decoder to use struct xdr_stream
Chuck Lever [Mon, 19 Oct 2020 17:26:32 +0000 (13:26 -0400)] 
NFSD: Update the LINK3args decoder to use struct xdr_stream

[ Upstream commit efaa1e7c2c7475f0a9bbeb904d9aba09b73dd52a ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the RENAME3args decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 19:44:12 +0000 (15:44 -0400)] 
NFSD: Update the RENAME3args decoder to use struct xdr_stream

[ Upstream commit d181e0a4bef36ee74d1338e5b5c2561d7463a5d0 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update the NFSv3 DIROPargs decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 19:42:33 +0000 (15:42 -0400)] 
NFSD: Update the NFSv3 DIROPargs decoder to use struct xdr_stream

[ Upstream commit 54d1d43dc709f58be38d278bfc38e9bfb38d35fc ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update COMMIT3arg decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 18:41:56 +0000 (14:41 -0400)] 
NFSD: Update COMMIT3arg decoder to use struct xdr_stream

[ Upstream commit c8d26a0acfe77f0880e0acfe77e4209cf8f3a38b ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update READDIR3args decoders to use struct xdr_stream
Chuck Lever [Mon, 19 Oct 2020 17:23:52 +0000 (13:23 -0400)] 
NFSD: Update READDIR3args decoders to use struct xdr_stream

[ Upstream commit 9cedc2e64c296efb3bebe93a0ceeb5e71e8d722d ]

As an additional clean up, neither nfsd3_proc_readdir() nor
nfsd3_proc_readdirplus() make use of the dircount argument, so
remove it from struct nfsd3_readdirargs.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Add helper to set up the pages where the dirlist is encoded
Chuck Lever [Tue, 17 Nov 2020 14:50:23 +0000 (09:50 -0500)] 
NFSD: Add helper to set up the pages where the dirlist is encoded

[ Upstream commit 40116ebd0934cca7e46423bdb3397d3d27eb9fb9 ]

De-duplicate some code that is used by both READDIR and READDIRPLUS
to build the dirlist in the Reply. Because this code is not related
to decoding READ arguments, it is moved to a more appropriate spot.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Fix returned READDIR offset cookie
Chuck Lever [Tue, 10 Nov 2020 15:24:39 +0000 (10:24 -0500)] 
NFSD: Fix returned READDIR offset cookie

[ Upstream commit 0a8f37fb34a96267c656f7254e69bb9a2fc89fe4 ]

Code inspection shows that the server's NFSv3 READDIR implementation
handles offset cookies slightly differently than the NFSv2 READDIR,
NFSv3 READDIRPLUS, and NFSv4 READDIR implementations,
and there doesn't seem to be any need for this difference.

As a clean up, I copied the logic from nfsd3_proc_readdirplus().

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update READLINK3arg decoder to use struct xdr_stream
Chuck Lever [Sat, 24 Oct 2020 16:51:18 +0000 (12:51 -0400)] 
NFSD: Update READLINK3arg decoder to use struct xdr_stream

[ Upstream commit 224c1c894e48cd72e4dd9fb6311be80cbe1369b0 ]

The NFSv3 READLINK request takes a single filehandle, so it can
re-use GETATTR's decoder.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update WRITE3arg decoder to use struct xdr_stream
Chuck Lever [Thu, 22 Oct 2020 15:14:55 +0000 (11:14 -0400)] 
NFSD: Update WRITE3arg decoder to use struct xdr_stream

[ Upstream commit c43b2f229a01969a7ccf94b033c5085e0ec2040c ]

As part of the update, open code that sanity-checks the size of the
data payload against the length of the RPC Call message has to be
re-implemented to use xdr_stream infrastructure.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update READ3arg decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 18:34:40 +0000 (14:34 -0400)] 
NFSD: Update READ3arg decoder to use struct xdr_stream

[ Upstream commit be63bd2ac6bbf8c065a0ef6dfbea76934326c352 ]

The code that sets up rq_vec is refactored so that it is now
adjacent to the nfsd_read() call site where it is used.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update ACCESS3arg decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 18:32:04 +0000 (14:32 -0400)] 
NFSD: Update ACCESS3arg decoder to use struct xdr_stream

[ Upstream commit 3b921a2b14251e9e203f1e8af76e8ade79f50e50 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Update GETATTR3args decoder to use struct xdr_stream
Chuck Lever [Tue, 20 Oct 2020 18:30:02 +0000 (14:30 -0400)] 
NFSD: Update GETATTR3args decoder to use struct xdr_stream

[ Upstream commit 9575363a9e4c8d7e2f9ba5e79884d623fff0be6f ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoSUNRPC: Move definition of XDR_UNIT
Chuck Lever [Fri, 27 Nov 2020 22:37:02 +0000 (17:37 -0500)] 
SUNRPC: Move definition of XDR_UNIT

[ Upstream commit 81d217474326b25d7f14274b02fe3da1e85ad934 ]

Clean up: The unit of XDR alignment is defined by RFC 4506,
not as part of the RPC message header. Thus it belongs in
include/linux/sunrpc/xdr.h.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoSUNRPC: Display RPC procedure names instead of proc numbers
Chuck Lever [Thu, 3 Dec 2020 15:22:09 +0000 (10:22 -0500)] 
SUNRPC: Display RPC procedure names instead of proc numbers

[ Upstream commit 89ff87494c6e4b32ea7960d0c644efdbb2fe6ef5 ]

Make the sunrpc trace subsystem trace events easier to use.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoSUNRPC: Make trace_svc_process() display the RPC procedure symbolically
Chuck Lever [Thu, 17 Sep 2020 21:22:49 +0000 (17:22 -0400)] 
SUNRPC: Make trace_svc_process() display the RPC procedure symbolically

[ Upstream commit 2289e87b5951f97783f07fc895e6c5e804b53668 ]

The next few patches will employ these strings to help make server-
side trace logs more human-readable. A similar technique is already
in use in kernel RPC client code.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Restore NFSv4 decoding's SAVEMEM functionality
Chuck Lever [Fri, 18 Dec 2020 17:28:58 +0000 (12:28 -0500)] 
NFSD: Restore NFSv4 decoding's SAVEMEM functionality

[ Upstream commit 7b723008f9c95624c848fad661c01b06e47b20da ]

While converting the NFSv4 decoder to use xdr_stream-based XDR
processing, I removed the old SAVEMEM() macro. This macro wrapped
a bit of logic that avoided a memory allocation by recognizing when
the decoded item resides in a linear section of the Receive buffer.
In that case, it returned a pointer into that buffer instead of
allocating a bounce buffer.

The bounce buffer is necessary only when xdr_inline_decode() has
placed the decoded item in the xdr_stream's scratch buffer, which
disappears the next time xdr_inline_decode() is called with that
xdr_stream. That happens only if the data item crosses a page
boundary in the receive buffer, an exceedingly rare occurrence.

Allocating a bounce buffer every time results in a minor performance
regression that was introduced by the recent NFSv4 decoder overhaul.
Let's restore the previous behavior. On average, it saves about 1.5
kmalloc() calls per COMPOUND.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Fix sparse warning in nfssvc.c
Chuck Lever [Fri, 18 Dec 2020 17:28:23 +0000 (12:28 -0500)] 
NFSD: Fix sparse warning in nfssvc.c

[ Upstream commit d6c9e4368cc6a61bf25c9c72437ced509c854563 ]

fs/nfsd/nfssvc.c:36:6: warning: symbol 'inter_copy_offload_enable' was not declared. Should it be static?

The parameter was added by commit ce0887ac96d3 ("NFSD add nfs4 inter
ssc to nfsd4_copy"). Relocate it into the source file that uses it,
and make it static. This approach is similar to the
nfs4_disable_idmapping, cltrack_prog, and cltrack_legacy_disable
module parameters.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofs/lockd: convert comma to semicolon
Zheng Yongjun [Fri, 11 Dec 2020 08:41:58 +0000 (16:41 +0800)] 
fs/lockd: convert comma to semicolon

[ Upstream commit 3316fb80a0b4c1fef03a3eb1a7f0651e2133c429 ]

Replace a comma between expression statements by a semicolon.

Signed-off-by: Zheng Yongjun <zhengyongjun3@huawei.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoinotify: Increase default inotify.max_user_watches limit to 1048576
Waiman Long [Mon, 9 Nov 2020 03:59:31 +0000 (22:59 -0500)] 
inotify: Increase default inotify.max_user_watches limit to 1048576

[ Upstream commit 92890123749bafc317bbfacbe0a62ce08d78efb7 ]

The default value of inotify.max_user_watches sysctl parameter was set
to 8192 since the introduction of the inotify feature in 2005 by
commit 0eeca28300df ("[PATCH] inotify"). Today this value is just too
small for many modern usage. As a result, users have to explicitly set
it to a larger value to make it work.

After some searching around the web, these are the
inotify.max_user_watches values used by some projects:
 - vscode:  524288
 - dropbox support: 100000
 - users on stackexchange: 12228
 - lsyncd user: 2000000
 - code42 support: 1048576
 - monodevelop: 16384
 - tectonic: 524288
 - openshift origin: 65536

Each watch point adds an inotify_inode_mark structure to an inode to
be watched. It also pins the watched inode.

Modeled after the epoll.max_user_watches behavior to adjust the default
value according to the amount of addressable memory available, make
inotify.max_user_watches behave in a similar way to make it use no more
than 1% of addressable memory within the range [8192, 1048576].

We estimate the amount of memory used by inotify mark to size of
inotify_inode_mark plus two times the size of struct inode (we double
the inode size to cover the additional filesystem private inode part).
That means that a 64-bit system with 128GB or more memory will likely
have the maximum value of 1048576 for inotify.max_user_watches. This
default should be big enough for most use cases.

Link: https://lore.kernel.org/r/20201109035931.4740-1-longman@redhat.com
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Replace ksys_close with close_fd
Eric W. Biederman [Fri, 20 Nov 2020 23:14:39 +0000 (17:14 -0600)] 
file: Replace ksys_close with close_fd

[ Upstream commit 1572bfdf21d4d50e51941498ffe0b56c2289f783 ]

Now that ksys_close is exactly identical to close_fd replace
the one caller of ksys_close with close_fd.

[1] https://lkml.kernel.org/r/20200818112020.GA17080@infradead.org
Suggested-by: Christoph Hellwig <hch@infradead.org>
Link: https://lkml.kernel.org/r/20201120231441.29911-22-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Rename __close_fd to close_fd and remove the files parameter
Eric W. Biederman [Fri, 20 Nov 2020 23:14:38 +0000 (17:14 -0600)] 
file: Rename __close_fd to close_fd and remove the files parameter

[ Upstream commit 8760c909f54a82aaa6e76da19afe798a0c77c3c3 ]

The function __close_fd was added to support binder[1].  Now that
binder has been fixed to no longer need __close_fd[2] all calls
to __close_fd pass current->files.

Therefore transform the files parameter into a local variable
initialized to current->files, and rename __close_fd to close_fd to
reflect this change, and keep it in sync with the similar changes to
__alloc_fd, and __fd_install.

This removes the need for callers to care about the extra care that
needs to be take if anything except current->files is passed, by
limiting the callers to only operation on current->files.

[1] 483ce1d4b8c3 ("take descriptor-related part of close() to file.c")
[2] 44d8047f1d87 ("binder: use standard functions to allocate fds")
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-17-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-21-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Merge __alloc_fd into alloc_fd
Eric W. Biederman [Fri, 20 Nov 2020 23:14:37 +0000 (17:14 -0600)] 
file: Merge __alloc_fd into alloc_fd

[ Upstream commit aa384d10f3d06d4b85597ff5df41551262220e16 ]

The function __alloc_fd was added to support binder[1].  With binder
fixed[2] there are no more users.

As alloc_fd just calls __alloc_fd with "files=current->files",
merge them together by transforming the files parameter into a
local variable initialized to current->files.

[1] dcfadfa4ec5a ("new helper: __alloc_fd()")
[2] 44d8047f1d87 ("binder: use standard functions to allocate fds")
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-16-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-20-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: In f_dupfd read RLIMIT_NOFILE once.
Eric W. Biederman [Fri, 20 Nov 2020 23:14:36 +0000 (17:14 -0600)] 
file: In f_dupfd read RLIMIT_NOFILE once.

Simplify the code, and remove the chance of races by reading
RLIMIT_NOFILE only once in f_dupfd.

Pass the read value of RLIMIT_NOFILE into alloc_fd which is the other
location the rlimit was read in f_dupfd.  As f_dupfd is the only
caller of alloc_fd this changing alloc_fd is trivially safe.

Further this causes alloc_fd to take all of the same arguments as
__alloc_fd except for the files_struct argument.

Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-15-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-19-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Merge __fd_install into fd_install
Eric W. Biederman [Fri, 20 Nov 2020 23:14:35 +0000 (17:14 -0600)] 
file: Merge __fd_install into fd_install

[ Upstream commit d74ba04d919ebe30bf47406819c18c6b50003d92 ]

The function __fd_install was added to support binder[1].  With binder
fixed[2] there are no more users.

As fd_install just calls __fd_install with "files=current->files",
merge them together by transforming the files parameter into a
local variable initialized to current->files.

[1] f869e8a7f753 ("expose a low-level variant of fd_install() for binder")
[2] 44d8047f1d87 ("binder: use standard functions to allocate fds")
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-14-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-18-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoproc/fd: In fdinfo seq_show don't use get_files_struct
Eric W. Biederman [Fri, 20 Nov 2020 23:14:34 +0000 (17:14 -0600)] 
proc/fd: In fdinfo seq_show don't use get_files_struct

[ Upstream commit 775e0656b27210ae668e33af00bece858f44576f ]

When discussing[1] exec and posix file locks it was realized that none
of the callers of get_files_struct fundamentally needed to call
get_files_struct, and that by switching them to helper functions
instead it will both simplify their code and remove unnecessary
increments of files_struct.count.  Those unnecessary increments can
result in exec unnecessarily unsharing files_struct which breaking
posix locks, and it can result in fget_light having to fallback to
fget reducing system performance.

Instead hold task_lock for the duration that task->files needs to be
stable in seq_show.  The task_lock was already taken in
get_files_struct, and so skipping get_files_struct performs less work
overall, and avoids the problems with the files_struct reference
count.

[1] https://lkml.kernel.org/r/20180915160423.GA31461@redhat.com
Suggested-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-12-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-17-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoproc/fd: In proc_readfd_common use task_lookup_next_fd_rcu
Eric W. Biederman [Fri, 20 Nov 2020 23:14:32 +0000 (17:14 -0600)] 
proc/fd: In proc_readfd_common use task_lookup_next_fd_rcu

[ Upstream commit 5b17b61870e2f4b0a4fdc5c6039fbdb4ffb796df ]

When discussing[1] exec and posix file locks it was realized that none
of the callers of get_files_struct fundamentally needed to call
get_files_struct, and that by switching them to helper functions
instead it will both simplify their code and remove unnecessary
increments of files_struct.count.  Those unnecessary increments can
result in exec unnecessarily unsharing files_struct which breaking
posix locks, and it can result in fget_light having to fallback to
fget reducing system performance.

Using task_lookup_next_fd_rcu simplifies proc_readfd_common, by moving
the checking for the maximum file descritor into the generic code, and
by remvoing the need for capturing and releasing a reference on
files_struct.

As task_lookup_fd_rcu may update the fd ctx->pos has been changed
to be the fd +2 after task_lookup_fd_rcu returns.

[1] https://lkml.kernel.org/r/20180915160423.GA31461@redhat.com
Suggested-by: Oleg Nesterov <oleg@redhat.com>
Tested-by: Andy Lavr <andy.lavr@gmail.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-10-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-15-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Implement task_lookup_next_fd_rcu
Eric W. Biederman [Fri, 20 Nov 2020 23:14:31 +0000 (17:14 -0600)] 
file: Implement task_lookup_next_fd_rcu

[ Upstream commit e9a53aeb5e0a838f10fcea74235664e7ad5e6e1a ]

As a companion to fget_task and task_lookup_fd_rcu implement
task_lookup_next_fd_rcu that will return the struct file for the first
file descriptor number that is equal or greater than the fd argument
value, or NULL if there is no such struct file.

This allows file descriptors of foreign processes to be iterated
through safely, without needed to increment the count on files_struct.

Some concern[1] has been expressed that this function takes the task_lock
for each iteration and thus for each file descriptor.  This place
where this function will be called in a commonly used code path is for
listing /proc/<pid>/fd.  I did some small benchmarks and did not see
any measurable performance differences.  For ordinary users ls is
likely to stat each of the directory entries and tid_fd_mode called
from tid_fd_revalidae has always taken the task lock for each file
descriptor.  So this does not look like it will be a big change in
practice.

At some point is will probably be worth changing put_files_struct to
free files_struct after an rcu grace period so that task_lock won't be
needed at all.

[1] https://lkml.kernel.org/r/20200817220425.9389-10-ebiederm@xmission.com
v1: https://lkml.kernel.org/r/20200817220425.9389-9-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-14-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agokcmp: In get_file_raw_ptr use task_lookup_fd_rcu
Eric W. Biederman [Fri, 20 Nov 2020 23:14:30 +0000 (17:14 -0600)] 
kcmp: In get_file_raw_ptr use task_lookup_fd_rcu

[ Upstream commit ed77e80e14a3cd55c73848b9e8043020e717ce12 ]

Modify get_file_raw_ptr to use task_lookup_fd_rcu.  The helper
task_lookup_fd_rcu does the work of taking the task lock and verifying
that task->files != NULL and then calls files_lookup_fd_rcu.  So let
use the helper to make a simpler implementation of get_file_raw_ptr.

Acked-by: Cyrill Gorcunov <gorcunov@gmail.com>
Link: https://lkml.kernel.org/r/20201120231441.29911-13-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoproc/fd: In tid_fd_mode use task_lookup_fd_rcu
Eric W. Biederman [Fri, 20 Nov 2020 23:14:29 +0000 (17:14 -0600)] 
proc/fd: In tid_fd_mode use task_lookup_fd_rcu

[ Upstream commit 64eb661fda0269276b4c46965832938e3f268268 ]

When discussing[1] exec and posix file locks it was realized that none
of the callers of get_files_struct fundamentally needed to call
get_files_struct, and that by switching them to helper functions
instead it will both simplify their code and remove unnecessary
increments of files_struct.count.  Those unnecessary increments can
result in exec unnecessarily unsharing files_struct which breaking
posix locks, and it can result in fget_light having to fallback to
fget reducing system performance.

Instead of manually coding finding the files struct for a task and
then calling files_lookup_fd_rcu, use the helper task_lookup_fd_rcu
that combines those to steps.   Making the code simpler and removing
the need to get a reference on a files_struct.

[1] https://lkml.kernel.org/r/20180915160423.GA31461@redhat.com
Suggested-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-7-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-12-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Implement task_lookup_fd_rcu
Eric W. Biederman [Fri, 20 Nov 2020 23:14:28 +0000 (17:14 -0600)] 
file: Implement task_lookup_fd_rcu

[ Upstream commit 3a879fb38082125cc0d8aa89b70c7f3a7cdf584b ]

As a companion to lookup_fd_rcu implement task_lookup_fd_rcu for
querying an arbitrary process about a specific file.

Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200818103713.aw46m7vprsy4vlve@wittgenstein
Link: https://lkml.kernel.org/r/20201120231441.29911-11-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Rename fcheck lookup_fd_rcu
Eric W. Biederman [Fri, 20 Nov 2020 23:14:27 +0000 (17:14 -0600)] 
file: Rename fcheck lookup_fd_rcu

[ Upstream commit 460b4f812a9d473d4b39d87d37844f9fc30a9eb3 ]

Also remove the confusing comment about checking if a fd exists.  I
could not find one instance in the entire kernel that still matches
the description or the reason for the name fcheck.

The need for better names became apparent in the last round of
discussion of this set of changes[1].

[1] https://lkml.kernel.org/r/CAHk-=wj8BQbgJFLa+J0e=iT-1qpmCRTbPAJ8gd6MJQ=kbRPqyQ@mail.gmail.com
Link: https://lkml.kernel.org/r/20201120231441.29911-10-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Replace fcheck_files with files_lookup_fd_rcu
Eric W. Biederman [Fri, 20 Nov 2020 23:14:26 +0000 (17:14 -0600)] 
file: Replace fcheck_files with files_lookup_fd_rcu

[ Upstream commit f36c2943274199cb8aef32ac96531ffb7c4b43d0 ]

This change renames fcheck_files to files_lookup_fd_rcu.  All of the
remaining callers take the rcu_read_lock before calling this function
so the _rcu suffix is appropriate.  This change also tightens up the
debug check to verify that all callers hold the rcu_read_lock.

All callers that used to call files_check with the files->file_lock
held have now been changed to call files_lookup_fd_locked.

This change of name has helped remind me of which locks and which
guarantees are in place helping me to catch bugs later in the
patchset.

The need for better names became apparent in the last round of
discussion of this set of changes[1].

[1] https://lkml.kernel.org/r/CAHk-=wj8BQbgJFLa+J0e=iT-1qpmCRTbPAJ8gd6MJQ=kbRPqyQ@mail.gmail.com
Link: https://lkml.kernel.org/r/20201120231441.29911-9-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Factor files_lookup_fd_locked out of fcheck_files
Eric W. Biederman [Fri, 20 Nov 2020 23:14:25 +0000 (17:14 -0600)] 
file: Factor files_lookup_fd_locked out of fcheck_files

[ Upstream commit 120ce2b0cd52abe73e8b16c23461eb14df5a87d8 ]

To make it easy to tell where files->file_lock protection is being
used when looking up a file create files_lookup_fd_locked.  Only allow
this function to be called with the file_lock held.

Update the callers of fcheck and fcheck_files that are called with the
files->file_lock held to call files_lookup_fd_locked instead.

Hopefully this makes it easier to quickly understand what is going on.

The need for better names became apparent in the last round of
discussion of this set of changes[1].

[1] https://lkml.kernel.org/r/CAHk-=wj8BQbgJFLa+J0e=iT-1qpmCRTbPAJ8gd6MJQ=kbRPqyQ@mail.gmail.com
Link: https://lkml.kernel.org/r/20201120231441.29911-8-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agofile: Rename __fcheck_files to files_lookup_fd_raw
Eric W. Biederman [Thu, 10 Dec 2020 18:39:54 +0000 (12:39 -0600)] 
file: Rename __fcheck_files to files_lookup_fd_raw

[ Upstream commit bebf684bf330915e6c96313ad7db89a5480fc9c2 ]

The function fcheck despite it's comment is poorly named
as it has no callers that only check it's return value.
All of fcheck's callers use the returned file descriptor.
The same is true for fcheck_files and __fcheck_files.

A new less confusing name is needed.  In addition the names
of these functions are confusing as they do not report
the kind of locks that are needed to be held when these
functions are called making error prone to use them.

To remedy this I am making the base functio name lookup_fd
and will and prefixes and sufficies to indicate the rest
of the context.

Name the function (previously called __fcheck_files) that proceeds
from a struct files_struct, looks up the struct file of a file
descriptor, and requires it's callers to verify all of the appropriate
locks are held files_lookup_fd_raw.

The need for better names became apparent in the last round of
discussion of this set of changes[1].

[1] https://lkml.kernel.org/r/CAHk-=wj8BQbgJFLa+J0e=iT-1qpmCRTbPAJ8gd6MJQ=kbRPqyQ@mail.gmail.com
Link: https://lkml.kernel.org/r/20201120231441.29911-7-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
[ cel: adjusted to apply to v5.10.y ]
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoRevert "fget: clarify and improve __fget_files() implementation"
Chuck Lever [Thu, 29 Feb 2024 23:19:36 +0000 (18:19 -0500)] 
Revert "fget: clarify and improve __fget_files() implementation"

Temporarily revert commit 0849f83e4782 ("fget: clarify and improve
__fget_files() implementation") to enable subsequent upstream
commits to apply and build cleanly.

Stable-dep-of: bebf684bf330 ("file: Rename __fcheck_files to files_lookup_fd_raw")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoproc/fd: In proc_fd_link use fget_task
Eric W. Biederman [Fri, 20 Nov 2020 23:14:23 +0000 (17:14 -0600)] 
proc/fd: In proc_fd_link use fget_task

[ Upstream commit 439be32656035d3239fd56f9b83353ec06cb3b45 ]

When discussing[1] exec and posix file locks it was realized that none
of the callers of get_files_struct fundamentally needed to call
get_files_struct, and that by switching them to helper functions
instead it will both simplify their code and remove unnecessary
increments of files_struct.count.  Those unnecessary increments can
result in exec unnecessarily unsharing files_struct which breaking
posix locks, and it can result in fget_light having to fallback to
fget reducing system performance.

Simplifying proc_fd_link is a little bit tricky.  It is necessary to
know that there is a reference to fd_f  ile while path_get is running.
This reference can either be guaranteed to exist either by locking the
fdtable as the code currently does or by taking a reference on the
file in question.

Use fget_task to remove the need for get_files_struct and
to take a reference to file in question.

[1] https://lkml.kernel.org/r/20180915160423.GA31461@redhat.com
Suggested-by: Oleg Nesterov <oleg@redhat.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-8-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-6-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agobpf: In bpf_task_fd_query use fget_task
Eric W. Biederman [Fri, 20 Nov 2020 23:14:22 +0000 (17:14 -0600)] 
bpf: In bpf_task_fd_query use fget_task

[ Upstream commit b48845af0152d790a54b8ab78cc2b7c07485fc98 ]

Use the helper fget_task to simplify bpf_task_fd_query.

As well as simplifying the code this removes one unnecessary increment of
struct files_struct.  This unnecessary increment of files_struct.count can
result in exec unnecessarily unsharing files_struct and breaking posix
locks, and it can result in fget_light having to fallback to fget reducing
performance.

This simplification comes from the observation that none of the
callers of get_files_struct actually need to call get_files_struct
that was made when discussing[1] exec and posix file locks.

[1] https://lkml.kernel.org/r/20180915160423.GA31461@redhat.com
Suggested-by: Oleg Nesterov <oleg@redhat.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-5-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-5-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agokcmp: In kcmp_epoll_target use fget_task
Eric W. Biederman [Fri, 20 Nov 2020 23:14:21 +0000 (17:14 -0600)] 
kcmp: In kcmp_epoll_target use fget_task

[ Upstream commit f43c283a89a7dc531a47d4b1e001503cf3dc3234 ]

Use the helper fget_task and simplify the code.

As well as simplifying the code this removes one unnecessary increment of
struct files_struct.  This unnecessary increment of files_struct.count can
result in exec unnecessarily unsharing files_struct and breaking posix
locks, and it can result in fget_light having to fallback to fget reducing
performance.

Suggested-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Cyrill Gorcunov <gorcunov@gmail.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-4-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-4-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoexec: Remove reset_files_struct
Eric W. Biederman [Fri, 20 Nov 2020 23:14:20 +0000 (17:14 -0600)] 
exec: Remove reset_files_struct

[ Upstream commit 950db38ff2c01b7aabbd7ab4a50b7992750fa63d ]

Now that exec no longer needs to restore the previous value of current->files
on error there are no more callers of reset_files_struct so remove it.

Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-3-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-3-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoexec: Simplify unshare_files
Eric W. Biederman [Fri, 20 Nov 2020 23:14:19 +0000 (17:14 -0600)] 
exec: Simplify unshare_files

[ Upstream commit 1f702603e7125a390b5cdf5ce00539781cfcc86a ]

Now that exec no longer needs to return the unshared files to their
previous value there is no reason to return displaced.

Instead when unshare_fd creates a copy of the file table, call
put_files_struct before returning from unshare_files.

Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-2-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-2-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoexec: Move unshare_files to fix posix file locking during exec
Eric W. Biederman [Fri, 20 Nov 2020 23:14:18 +0000 (17:14 -0600)] 
exec: Move unshare_files to fix posix file locking during exec

[ Upstream commit b6043501289ebf169ae19b810a882d517377302f ]

Many moons ago the binfmts were doing some very questionable things
with file descriptors and an unsharing of the file descriptor table
was added to make things better[1][2].  The helper steal_lockss was
added to avoid breaking the userspace programs[3][4][6].

Unfortunately it turned out that steal_locks did not work for network
file systems[5], so it was removed to see if anyone would
complain[7][8].  It was thought at the time that NPTL would not be
affected as the unshare_files happened after the other threads were
killed[8].  Unfortunately because there was an unshare_files in
binfmt_elf.c before the threads were killed this analysis was
incorrect.

This unshare_files in binfmt_elf.c resulted in the unshares_files
happening whenever threads were present.  Which led to unshare_files
being moved to the start of do_execve[9].

Later the problems were rediscovered and the suggested approach was to
readd steal_locks under a different name[10].  I happened to be
reviewing patches and I noticed that this approach was a step
backwards[11].

I proposed simply moving unshare_files[12] and it was pointed
out that moving unshare_files without auditing the code was
also unsafe[13].

There were then several attempts to solve this[14][15][16] and I even
posted this set of changes[17].  Unfortunately because auditing all of
execve is time consuming this change did not make it in at the time.

Well now that I am cleaning up exec I have made the time to read
through all of the binfmts and the only playing with file descriptors
is either the security modules closing them in
security_bprm_committing_creds or is in the generic code in fs/exec.c.
None of it happens before begin_new_exec is called.

So move unshare_files into begin_new_exec, after the point of no
return.  If memory is very very very low and the application calling
exec is sharing file descriptor tables between processes we might fail
past the point of no return.  Which is unfortunate but no different
than any of the other places where we allocate memory after the point
of no return.

This movement allows another process that shares the file table, or
another thread of the same process and that closes files or changes
their close on exec behavior and races with execve to cause some
unexpected things to happen.  There is only one time of check to time
of use race and it is just there so that execve fails instead of
an interpreter failing when it tries to open the file it is supposed
to be interpreting.   Failing later if userspace is being silly is
not a problem.

With this change it the following discription from the removal
of steal_locks[8] finally becomes true.

    Apps using NPTL are not affected, since all other threads are killed before
    execve.

    Apps using LinuxThreads are only affected if they

      - have multiple threads during exec (LinuxThreads doesn't kill other
        threads, the app may do it with pthread_kill_other_threads_np())
      - rely on POSIX locks being inherited across exec

    Both conditions are documented, but not their interaction.

    Apps using clone() natively are affected if they

      - use clone(CLONE_FILES)
      - rely on POSIX locks being inherited across exec

I have investigated some paths to make it possible to solve this
without moving unshare_files but they all look more complicated[18].

Reported-by: Daniel P. Berrangé <berrange@redhat.com>
Reported-by: Jeff Layton <jlayton@redhat.com>
History-tree: git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
[1] 02cda956de0b ("[PATCH] unshare_files"
[2] 04e9bcb4d106 ("[PATCH] use new unshare_files helper")
[3] 088f5d7244de ("[PATCH] add steal_locks helper")
[4] 02c541ec8ffa ("[PATCH] use new steal_locks helper")
[5] https://lkml.kernel.org/r/E1FLIlF-0007zR-00@dorka.pomaz.szeredi.hu
[6] https://lkml.kernel.org/r/0060321191605.GB15997@sorel.sous-sol.org
[7] https://lkml.kernel.org/r/E1FLwjC-0000kJ-00@dorka.pomaz.szeredi.hu
[8] c89681ed7d0e ("[PATCH] remove steal_locks()")
[9] fd8328be874f ("[PATCH] sanitize handling of shared descriptor tables in failing execve()")
[10] https://lkml.kernel.org/r/20180317142520.30520-1-jlayton@kernel.org
[11] https://lkml.kernel.org/r/87r2nwqk73.fsf@xmission.com
[12] https://lkml.kernel.org/r/87bmfgvg8w.fsf@xmission.com
[13] https://lkml.kernel.org/r/20180322111424.GE30522@ZenIV.linux.org.uk
[14] https://lkml.kernel.org/r/20180827174722.3723-1-jlayton@kernel.org
[15] https://lkml.kernel.org/r/20180830172423.21964-1-jlayton@kernel.org
[16] https://lkml.kernel.org/r/20180914105310.6454-1-jlayton@kernel.org
[17] https://lkml.kernel.org/r/87a7ohs5ow.fsf@xmission.com
[18] https://lkml.kernel.org/r/87pn8c1uj6.fsf_-_@x220.int.ebiederm.org
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-1-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-1-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoexec: Don't open code get_close_on_exec
Eric W. Biederman [Wed, 9 Dec 2020 21:42:57 +0000 (15:42 -0600)] 
exec: Don't open code get_close_on_exec

[ Upstream commit 878f12dbb8f514799d126544d59be4d2675caac3 ]

Al Viro pointed out that using the phrase "close_on_exec(fd,
rcu_dereference_raw(current->files->fdt))" instead of wrapping it in
rcu_read_lock(), rcu_read_unlock() is a very questionable
optimization[1].

Once wrapped with rcu_read_lock()/rcu_read_unlock() that phrase
becomes equivalent the helper function get_close_on_exec so
simplify the code and make it more robust by simply using
get_close_on_exec.

[1] https://lkml.kernel.org/r/20201207222214.GA4115853@ZenIV.linux.org.uk
Suggested-by: Al Viro <viro@ftp.linux.org.uk>
Link: https://lkml.kernel.org/r/87k0tqr6zi.fsf_-_@x220.int.ebiederm.org
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: Record NFSv4 pre/post-op attributes as non-atomic
Trond Myklebust [Tue, 1 Dec 2020 04:14:27 +0000 (23:14 -0500)] 
nfsd: Record NFSv4 pre/post-op attributes as non-atomic

[ Upstream commit 716a8bc7f706eeef80ab42c99d9f210eda845c81 ]

For the case of NFSv4, specify to the client that the pre/post-op
attributes were not recorded atomically with the main operation.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: Set PF_LOCAL_THROTTLE on local filesystems only
Trond Myklebust [Mon, 30 Nov 2020 22:03:19 +0000 (17:03 -0500)] 
nfsd: Set PF_LOCAL_THROTTLE on local filesystems only

[ Upstream commit 01cbf3853959feec40ec9b9a399e12a021cd4d81 ]

Don't set PF_LOCAL_THROTTLE on remote filesystems like NFS, since they
aren't expected to ever be subject to double buffering.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: Fix up nfsd to ensure that timeout errors don't result in ESTALE
Trond Myklebust [Mon, 30 Nov 2020 22:03:18 +0000 (17:03 -0500)] 
nfsd: Fix up nfsd to ensure that timeout errors don't result in ESTALE

[ Upstream commit 2e19d10c1438241de32467637a2a411971547991 ]

If the underlying filesystem times out, then we want knfsd to return
NFSERR_JUKEBOX/DELAY rather than NFSERR_STALE.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoexportfs: Add a function to return the raw output from fh_to_dentry()
Trond Myklebust [Mon, 30 Nov 2020 22:03:17 +0000 (17:03 -0500)] 
exportfs: Add a function to return the raw output from fh_to_dentry()

[ Upstream commit d045465fc6cbfa4acfb5a7d817a7c1a57a078109 ]

In order to allow nfsd to accept return values that are not
acceptable to overlayfs and others, add a new function.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: close cached files prior to a REMOVE or RENAME that would replace target
Jeff Layton [Mon, 30 Nov 2020 22:03:16 +0000 (17:03 -0500)] 
nfsd: close cached files prior to a REMOVE or RENAME that would replace target

[ Upstream commit 7f84b488f9add1d5cca3e6197c95914c7bd3c1cf ]

It's not uncommon for some workloads to do a bunch of I/O to a file and
delete it just afterward. If knfsd has a cached open file however, then
the file may still be open when the dentry is unlinked. If the
underlying filesystem is nfs, then that could trigger it to do a
sillyrename.

On a REMOVE or RENAME scan the nfsd_file cache for open files that
correspond to the inode, and proactively unhash and put their
references. This should prevent any delete-on-last-close activity from
occurring, solely due to knfsd's open file cache.

This must be done synchronously though so we use the variants that call
flush_delayed_fput. There are deadlock possibilities if you call
flush_delayed_fput while holding locks, however. In the case of
nfsd_rename, we don't even do the lookups of the dentries to be renamed
until we've locked for rename.

Once we've figured out what the target dentry is for a rename, check to
see whether there are cached open files associated with it. If there
are, then unwind all of the locking, close them all, and then reattempt
the rename.

None of this is really necessary for "typical" filesystems though. It's
mostly of use for NFS, so declare a new export op flag and use that to
determine whether to close the files beforehand.

Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
Signed-off-by: Lance Shelton <lance.shelton@hammerspace.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
[ cel: adjusted to apply to 5.10.y ]
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: allow filesystems to opt out of subtree checking
Jeff Layton [Mon, 30 Nov 2020 22:03:15 +0000 (17:03 -0500)] 
nfsd: allow filesystems to opt out of subtree checking

[ Upstream commit ba5e8187c55555519ae0b63c0fb681391bc42af9 ]

When we start allowing NFS to be reexported, then we have some problems
when it comes to subtree checking. In principle, we could allow it, but
it would mean encoding parent info in the filehandles and there may not
be enough space for that in a NFSv3 filehandle.

To enforce this at export upcall time, we add a new export_ops flag
that declares the filesystem ineligible for subtree checking.

Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
Signed-off-by: Lance Shelton <lance.shelton@hammerspace.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: add a new EXPORT_OP_NOWCC flag to struct export_operations
Jeff Layton [Mon, 30 Nov 2020 22:03:14 +0000 (17:03 -0500)] 
nfsd: add a new EXPORT_OP_NOWCC flag to struct export_operations

[ Upstream commit daab110e47f8d7aa6da66923e3ac1a8dbd2b2a72 ]

With NFSv3 nfsd will always attempt to send along WCC data to the
client. This generally involves saving off the in-core inode information
prior to doing the operation on the given filehandle, and then issuing a
vfs_getattr to it after the op.

Some filesystems (particularly clustered or networked ones) have an
expensive ->getattr inode operation. Atomicity is also often difficult
or impossible to guarantee on such filesystems. For those, we're best
off not trying to provide WCC information to the client at all, and to
simply allow it to poll for that information as needed with a GETATTR
RPC.

This patch adds a new flags field to struct export_operations, and
defines a new EXPORT_OP_NOWCC flag that filesystems can use to indicate
that nfsd should not attempt to provide WCC info in NFSv3 replies. It
also adds a blurb about the new flags field and flag to the exporting
documentation.

The server will also now skip collecting this information for NFSv2 as
well, since that info is never used there anyway.

Note that this patch does not add this flag to any filesystem
export_operations structures. This was originally developed to allow
reexporting nfs via nfsd.

Other filesystems may want to consider enabling this flag too. It's hard
to tell however which ones have export operations to enable export via
knfsd and which ones mostly rely on them for open-by-filehandle support,
so I'm leaving that up to the individual maintainers to decide. I am
cc'ing the relevant lists for those filesystems that I think may want to
consider adding this though.

Cc: HPDD-discuss@lists.01.org
Cc: ceph-devel@vger.kernel.org
Cc: cluster-devel@redhat.com
Cc: fuse-devel@lists.sourceforge.net
Cc: ocfs2-devel@oss.oracle.com
Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
Signed-off-by: Lance Shelton <lance.shelton@hammerspace.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoRevert "nfsd4: support change_attr_type attribute"
J. Bruce Fields [Mon, 30 Nov 2020 22:46:18 +0000 (17:46 -0500)] 
Revert "nfsd4: support change_attr_type attribute"

This reverts commit a85857633b04d57f4524cca0a2bfaf87b2543f9f.

We're still factoring ctime into our change attribute even in the
IS_I_VERSION case.  If someone sets the system time backwards, a client
could see the change attribute go backwards.  Maybe we can just say
"well, don't do that", but there's some question whether that's good
enough, or whether we need a better guarantee.

Also, the client still isn't actually using the attribute.

While we're still figuring this out, let's just stop returning this
attribute.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd4: don't query change attribute in v2/v3 case
J. Bruce Fields [Mon, 30 Nov 2020 22:46:17 +0000 (17:46 -0500)] 
nfsd4: don't query change attribute in v2/v3 case

[ Upstream commit 942b20dc245590327ee0187c15c78174cd96dd52 ]

inode_query_iversion() has side effects, and there's no point calling it
when we're not even going to use it.

We check whether we're currently processing a v4 request by checking
fh_maxsize, which is arguably a little hacky; we could add a flag to
svc_fh instead.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: minor nfsd4_change_attribute cleanup
J. Bruce Fields [Mon, 30 Nov 2020 22:46:16 +0000 (17:46 -0500)] 
nfsd: minor nfsd4_change_attribute cleanup

[ Upstream commit 4b03d99794eeed27650597a886247c6427ce1055 ]

Minor cleanup, no change in behavior.

Also pull out a common helper that'll be useful elsewhere.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: simplify nfsd4_change_info
J. Bruce Fields [Mon, 30 Nov 2020 22:46:15 +0000 (17:46 -0500)] 
nfsd: simplify nfsd4_change_info

[ Upstream commit b2140338d8dca827ad9e83f3e026e9d51748b265 ]

It doesn't make sense to carry all these extra fields around.  Just
make everything into change attribute from the start.

This is just cleanup, there should be no change in behavior.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agonfsd: only call inode_query_iversion in the I_VERSION case
J. Bruce Fields [Mon, 30 Nov 2020 22:46:14 +0000 (17:46 -0500)] 
nfsd: only call inode_query_iversion in the I_VERSION case

[ Upstream commit 70b87f77294d16d3e567056ba4c9ee2b091a5b50 ]

inode_query_iversion() can modify i_version.  Depending on the exported
filesystem, that may not be safe.  For example, if you're re-exporting
NFS, NFS stores the server's change attribute in i_version and does not
expect it to be modified locally.  This has been observed causing
unnecessary cache invalidations.

The way a filesystem indicates that it's OK to call
inode_query_iverson() is by setting SB_I_VERSION.

So, move the I_VERSION check out of encode_change(), where it's used
only in GETATTR responses, to nfsd4_change_attribute(), which is
also called for pre- and post- operation attributes.

(Note we could also pull the NFSEXP_V4ROOT case into
nfsd4_change_attribute() as well.  That would actually be a no-op,
since pre/post attrs are only used for metadata-modifying operations,
and V4ROOT exports are read-only.  But we might make the change in
the future just for simplicity.)

Reported-by: Daire Byrne <daire@dneg.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Remove macros that are no longer used
Chuck Lever [Wed, 4 Nov 2020 16:12:18 +0000 (11:12 -0500)] 
NFSD: Remove macros that are no longer used

[ Upstream commit 5cfc822f3e77b0477e6602d399116130317f537a ]

Now that all the NFSv4 decoder functions have been converted to
make direct calls to the xdr helpers, remove the unused C macros.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_compound()
Chuck Lever [Wed, 4 Nov 2020 16:07:06 +0000 (11:07 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_compound()

[ Upstream commit d9b74bdac6f24afc3101b6a5b6f59842610c9c94 ]

And clean-up: Now that we have removed the DECODE_TAIL macro from
nfsd4_decode_compound(), we observe that there's no benefit for
nfsd4_decode_compound() to return nfs_ok or nfserr_bad_xdr only to
have its sole caller convert those values to one or zero,
respectively. Have nfsd4_decode_compound() return 1/0 instead.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Make nfsd4_ops::opnum a u32
Chuck Lever [Sun, 22 Nov 2020 17:49:52 +0000 (12:49 -0500)] 
NFSD: Make nfsd4_ops::opnum a u32

[ Upstream commit 3a237b4af5b7b0e77588e120554077cab3341943 ]

Avoid passing a "pointer to int" argument to xdr_stream_decode_u32.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_listxattrs()
Chuck Lever [Wed, 4 Nov 2020 16:04:02 +0000 (11:04 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_listxattrs()

[ Upstream commit 2212036cadf4da3c4b0e4bd2a9a8c3d78617ab4f ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_setxattr()
Chuck Lever [Wed, 4 Nov 2020 15:59:57 +0000 (10:59 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_setxattr()

[ Upstream commit 403366a7e8e2930002157525cd44add7fa01bca9 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_xattr_name()
Chuck Lever [Wed, 4 Nov 2020 15:56:52 +0000 (10:56 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_xattr_name()

[ Upstream commit 830c71502ae0ae1677ac6c08ffbcf85a6e7b2937 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_clone()
Chuck Lever [Wed, 4 Nov 2020 15:46:46 +0000 (10:46 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_clone()

[ Upstream commit 3dfd0b0e15671e2b4047ccb9222432f0b2d930be ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_seek()
Chuck Lever [Wed, 4 Nov 2020 15:54:47 +0000 (10:54 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_seek()

[ Upstream commit 9d32b412fe0a6186cc57789d218e8f8299454ae2 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_offload_status()
Chuck Lever [Sat, 21 Nov 2020 19:21:25 +0000 (14:21 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_offload_status()

[ Upstream commit 2846bb0525a73e00b3566fda535ea6a5879e2971 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_copy_notify()
Chuck Lever [Sat, 21 Nov 2020 19:19:24 +0000 (14:19 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_copy_notify()

[ Upstream commit f9a953fb369bbd2135ccead3393ec1ef66544471 ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_copy()
Chuck Lever [Wed, 4 Nov 2020 15:49:37 +0000 (10:49 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_copy()

[ Upstream commit e8febea7190bcbd1e608093acb67f2a5009556aa ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 months agoNFSD: Replace READ* macros in nfsd4_decode_nl4_server()
Chuck Lever [Mon, 16 Nov 2020 23:05:06 +0000 (18:05 -0500)] 
NFSD: Replace READ* macros in nfsd4_decode_nl4_server()

[ Upstream commit f49e4b4d58cc835d8bd0cc9663f7b9c5497e0e7e ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>