Commit cd35b6cb authored by Eric Biggers's avatar Eric Biggers Committed by Chuck Lever
Browse files

nfs: add missing selections of CONFIG_CRC32



nfs.ko, nfsd.ko, and lockd.ko all use crc32_le(), which is available
only when CONFIG_CRC32 is enabled.  But the only NFS kconfig option that
selected CONFIG_CRC32 was CONFIG_NFS_DEBUG, which is client-specific and
did not actually guard the use of crc32_le() even on the client.

The code worked around this bug by only actually calling crc32_le() when
CONFIG_CRC32 is built-in, instead hard-coding '0' in other cases.  This
avoided randconfig build errors, and in real kernels the fallback code
was unlikely to be reached since CONFIG_CRC32 is 'default y'.  But, this
really needs to just be done properly, especially now that I'm planning
to update CONFIG_CRC32 to not be 'default y'.

Therefore, make CONFIG_NFS_FS, CONFIG_NFSD, and CONFIG_LOCKD select
CONFIG_CRC32.  Then remove the fallback code that becomes unnecessary,
as well as the selection of CONFIG_CRC32 from CONFIG_NFS_DEBUG.

Fixes: 1264a2f0 ("NFS: refactor code for calculating the crc32 hash of a filehandle")
Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
Acked-by: default avatarAnna Schumaker <anna.schumaker@oracle.com>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 26a80762
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -368,6 +368,7 @@ config GRACE_PERIOD
config LOCKD
	tristate
	depends on FILE_LOCKING
	select CRC32
	select GRACE_PERIOD

config LOCKD_V4
+1 −1
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
config NFS_FS
	tristate "NFS client support"
	depends on INET && FILE_LOCKING && MULTIUSER
	select CRC32
	select LOCKD
	select SUNRPC
	select NFS_COMMON
@@ -196,7 +197,6 @@ config NFS_USE_KERNEL_DNS
config NFS_DEBUG
	bool
	depends on NFS_FS && SUNRPC_DEBUG
	select CRC32
	default y

config NFS_DISABLE_UDP_SUPPORT
+0 −7
Original line number Diff line number Diff line
@@ -899,18 +899,11 @@ u64 nfs_timespec_to_change_attr(const struct timespec64 *ts)
	return ((u64)ts->tv_sec << 30) + ts->tv_nsec;
}

#ifdef CONFIG_CRC32
static inline u32 nfs_stateid_hash(const nfs4_stateid *stateid)
{
	return ~crc32_le(0xFFFFFFFF, &stateid->other[0],
				NFS4_STATEID_OTHER_SIZE);
}
#else
static inline u32 nfs_stateid_hash(nfs4_stateid *stateid)
{
	return 0;
}
#endif

static inline bool nfs_error_is_fatal(int err)
{
+0 −4
Original line number Diff line number Diff line
@@ -148,16 +148,12 @@ static inline void nfs4_copy_sessionid(struct nfs4_sessionid *dst,
	memcpy(dst->data, src->data, NFS4_MAX_SESSIONID_LEN);
}

#ifdef CONFIG_CRC32
/*
 * nfs_session_id_hash - calculate the crc32 hash for the session id
 * @session - pointer to session
 */
#define nfs_session_id_hash(sess_id) \
	(~crc32_le(0xFFFFFFFF, &(sess_id)->data[0], sizeof((sess_id)->data)))
#else
#define nfs_session_id_hash(session) (0)
#endif
#else /* defined(CONFIG_NFS_V4_1) */

static inline int nfs4_init_session(struct nfs_client *clp)
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ config NFSD
	depends on INET
	depends on FILE_LOCKING
	depends on FSNOTIFY
	select CRC32
	select LOCKD
	select SUNRPC
	select EXPORTFS
Loading