android_kernel_xiaomi_sm8450/fs/nfsd
Chuck Lever 3f1a2b0b2d NFSD: da_addr_body field missing in some GETDEVICEINFO replies
[ Upstream commit 6372e2ee629894433fe6107d7048536a3280a284 ]

The XDR specification in RFC 8881 looks like this:

struct device_addr4 {
	layouttype4	da_layout_type;
	opaque		da_addr_body<>;
};

struct GETDEVICEINFO4resok {
	device_addr4	gdir_device_addr;
	bitmap4		gdir_notification;
};

union GETDEVICEINFO4res switch (nfsstat4 gdir_status) {
case NFS4_OK:
	GETDEVICEINFO4resok gdir_resok4;
case NFS4ERR_TOOSMALL:
	count4		gdir_mincount;
default:
	void;
};

Looking at nfsd4_encode_getdeviceinfo() ....

When the client provides a zero gd_maxcount, then the Linux NFS
server implementation encodes the da_layout_type field and then
skips the da_addr_body field completely, proceeding directly to
encode gdir_notification field.

There does not appear to be an option in the specification to skip
encoding da_addr_body. Moreover, Section 18.40.3 says:

> If the client wants to just update or turn off notifications, it
> MAY send a GETDEVICEINFO operation with gdia_maxcount set to zero.
> In that event, if the device ID is valid, the reply's da_addr_body
> field of the gdir_device_addr field will be of zero length.

Since the layout drivers are responsible for encoding the
da_addr_body field, put this fix inside the ->encode_getdeviceinfo
methods.

Fixes: 9cf514ccfa ("nfsd: implement pNFS operations")
Reviewed-by: Christoph Hellwig <hch@lst.de>
Cc: Tom Haynes <loghyr@gmail.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-09-19 12:20:15 +02:00
..
acl.h nfsd: eliminate an unnecessary acl size limit 2019-08-28 21:13:45 -04:00
auth.c nfsd: auth: Fix gid sorting when rootsquash enabled 2018-01-22 20:13:07 -08:00
auth.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
blocklayout.c block: add a bdev_is_partition helper 2020-09-25 08:18:57 -06:00
blocklayoutxdr.c NFSD: da_addr_body field missing in some GETDEVICEINFO replies 2023-09-19 12:20:15 +02:00
blocklayoutxdr.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
cache.h nfsd4: make drc_slab global, not per-net 2020-06-01 17:44:45 -04:00
current_stateid.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
export.c NFSD: Map nfserr_wrongsec outside of nfsd_dispatch 2020-10-02 09:37:42 -04:00
export.h knfsd: Allow lockless lookups of the exports 2018-10-29 16:58:04 -04:00
fault_inject.c nfsd: no need to check return value of debugfs_create functions 2019-07-03 16:57:17 +02:00
filecache.c nfsd: Replace use of rwsem with errseq_t 2022-06-22 14:13:12 +02:00
filecache.h nfsd: Replace use of rwsem with errseq_t 2022-06-22 14:13:12 +02:00
flexfilelayout.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
flexfilelayoutxdr.c NFSD: da_addr_body field missing in some GETDEVICEINFO replies 2023-09-19 12:20:15 +02:00
flexfilelayoutxdr.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
idmap.h nfsd: Remove duplicate define of IDMAP_NAMESZ/IDMAP_TYPE_xx 2015-07-20 14:58:46 -04:00
Kconfig fs: nfsd: fix kconfig dependency warning for NFSD_V4 2021-04-07 15:00:03 +02:00
lockd.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
Makefile nfsd: remove fault injection code 2020-09-25 18:01:26 -04:00
netns.h nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted 2023-02-01 08:23:26 +01:00
nfs2acl.c NFSD: Hoist status code encoding into XDR encoder functions 2020-10-12 10:29:44 -04:00
nfs3acl.c NFSD: Hoist status code encoding into XDR encoder functions 2020-10-12 10:29:44 -04:00
nfs3proc.c NFSD: Clamp WRITE offsets 2022-02-16 12:54:17 +01:00
nfs3xdr.c nfsd4: readdirplus shouldn't return parent of export 2021-01-23 16:03:58 +01:00
nfs4acl.c nfsd: check permissions when setting ACLs 2016-06-24 12:11:52 -04:00
nfs4callback.c NFSD: callback request does not use correct credential for AUTH_SYS 2023-04-20 12:10:22 +02:00
nfs4idmap.c nfsd: Use seq_putc() in two functions 2020-07-13 17:28:46 -04:00
nfs4layouts.c nfsd: fix race to check ls_layouts 2023-03-11 16:39:39 +01:00
nfs4proc.c NFSD: fix use-after-free in __nfs42_ssc_open() 2023-04-05 11:23:43 +02:00
nfs4recover.c nfsd: Fix a memory leak in an error handling path 2022-10-26 13:25:18 +02:00
nfs4state.c nfsd: Fix race to FREE_STATEID and cl_revoked 2023-08-30 16:23:15 +02:00
nfs4xdr.c NFSD: da_addr_body field missing in some GETDEVICEINFO replies 2023-09-19 12:20:15 +02:00
nfscache.c silence nfscache allocation warnings with kvzalloc 2020-09-25 18:01:28 -04:00
nfsctl.c nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted 2023-02-01 08:23:26 +01:00
nfsd.h nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted 2023-02-01 08:23:26 +01:00
nfsfh.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
nfsfh.h nfsd: handle nfs3 timestamps as unsigned 2019-12-19 17:46:08 -05:00
nfsproc.c NFSD: prevent underflow in nfssvc_decode_writeargs() 2022-04-08 14:39:51 +02:00
nfssvc.c nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted 2023-02-01 08:23:26 +01:00
nfsxdr.c NFSD: Hoist status code encoding into XDR encoder functions 2020-10-12 10:29:44 -04:00
pnfs.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
state.h nfsd: remove fault injection code 2020-09-25 18:01:26 -04:00
stats.c proc: convert everything to "struct proc_ops" 2020-02-04 03:05:26 +00:00
stats.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
trace.c nfsd: move include of state.h from trace.c to trace.h 2015-10-23 15:57:29 -04:00
trace.h NFSD: Fix offset type in I/O trace points 2022-02-16 12:54:17 +01:00
vfs.c vfs: fix copy_file_range() averts filesystem freeze protection 2022-12-19 12:27:30 +01:00
vfs.h nfsd: define xattr functions to call into their vfs counterparts 2020-07-13 17:27:03 -04:00
xdr3.h NFSD: Encoder and decoder functions are always present 2020-10-02 09:37:41 -04:00
xdr4.h NFSD: Encoder and decoder functions are always present 2020-10-02 09:37:41 -04:00
xdr4cb.h NFSD CB_OFFLOAD xdr 2018-09-25 20:34:54 -04:00
xdr.h NFSD: prevent underflow in nfssvc_decode_writeargs() 2022-04-08 14:39:51 +02:00