nfs: add missing selections of CONFIG_CRC32
authorEric Biggers <ebiggers@google.com>
Tue, 1 Apr 2025 22:02:21 +0000 (15:02 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Apr 2025 08:45:46 +0000 (10:45 +0200)
[ Upstream commit cd35b6cb46649750b7dbd0df0e2d767415d8917b ]

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: 1264a2f053a3 ("NFS: refactor code for calculating the crc32 hash of a filehandle")
Signed-off-by: Eric Biggers <ebiggers@google.com>
Acked-by: Anna Schumaker <anna.schumaker@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/Kconfig
fs/nfs/Kconfig
fs/nfs/internal.h
fs/nfs/nfs4session.h
fs/nfsd/Kconfig
fs/nfsd/nfsfh.h
include/linux/nfs.h

index 02a9237807a779ee34125f952c799ed45630cf26..85ae4953f2d7b9e09145178df2a4a1ed50eaad20 100644 (file)
@@ -365,6 +365,7 @@ config GRACE_PERIOD
 config LOCKD
        tristate
        depends on FILE_LOCKING
+       select CRC32
        select GRACE_PERIOD
 
 config LOCKD_V4
index 7df2503cef6c30060f66d17330c3270514b9c78d..2d99f5e7a686b05c49c9df025cb46c46956b8b7e 100644 (file)
@@ -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_ACL_SUPPORT if NFS_V3_ACL
@@ -194,7 +195,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
index a92b234ae0870b1ad4fcd40f94b354d84c448bd1..ca49d999159eb114e0f6df038613a8876a0662dc 100644 (file)
@@ -859,18 +859,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)
 {
index 351616c61df541fcb9e09e1df7d1ebbc0f8883d2..f9c291e2165cd873b7bde88e193f4847cf3abd5e 100644 (file)
@@ -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)
index 43b88eaf0673ab0bfda775646b40835d264e3748..05c10f70456ccd8d3aabd7ed171323e76f27ae97 100644 (file)
@@ -4,6 +4,7 @@ config NFSD
        depends on INET
        depends on FILE_LOCKING
        depends on FSNOTIFY
+       select CRC32
        select LOCKD
        select SUNRPC
        select EXPORTFS
index 40426f899e76012b12558b6f761ae513e72824a1..f1420d3510d2ef729a9c4f11af3d8e7503b93d89 100644 (file)
@@ -263,7 +263,6 @@ static inline bool fh_fsid_match(const struct knfsd_fh *fh1,
        return true;
 }
 
-#ifdef CONFIG_CRC32
 /**
  * knfsd_fh_hash - calculate the crc32 hash for the filehandle
  * @fh - pointer to filehandle
@@ -275,12 +274,6 @@ static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh)
 {
        return ~crc32_le(0xFFFFFFFF, fh->fh_raw, fh->fh_size);
 }
-#else
-static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh)
-{
-       return 0;
-}
-#endif
 
 /**
  * fh_clear_pre_post_attrs - Reset pre/post attributes
index ceb70a926b95e8188a1f077db7c1a87df3d0e1b5..095a95c1fae826a3f6e7958ae5f16893cd55e4b6 100644 (file)
@@ -46,7 +46,6 @@ enum nfs3_stable_how {
        NFS_INVALID_STABLE_HOW = -1
 };
 
-#ifdef CONFIG_CRC32
 /**
  * nfs_fhandle_hash - calculate the crc32 hash for the filehandle
  * @fh - pointer to filehandle
@@ -58,10 +57,4 @@ static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh)
 {
        return ~crc32_le(0xFFFFFFFF, &fh->data[0], fh->size);
 }
-#else /* CONFIG_CRC32 */
-static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh)
-{
-       return 0;
-}
-#endif /* CONFIG_CRC32 */
 #endif /* _LINUX_NFS_H */