]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nfsd: Replace clamp_t in nfsd4_get_drc_mem()
authorNeilBrown <neil@brown.name>
Fri, 14 Nov 2025 21:19:22 +0000 (16:19 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 6 Dec 2025 21:12:44 +0000 (06:12 +0900)
A recent change to clamp_t() in 6.1.y caused fs/nfsd/nfs4state.c to fail
to compile with gcc-9. The code in nfsd4_get_drc_mem() was written with
the assumption that when "max < min",

   clamp(val, min, max)

would return max.  This assumption is not documented as an API promise
and the change caused a compile failure if it could be statically
determined that "max < min".

The relevant code was no longer present upstream when commit 1519fbc8832b
("minmax.h: use BUILD_BUG_ON_MSG() for the lo < hi test in clamp()")
landed there, so there is no upstream change to nfsd4_get_drc_mem() to
backport.

There is no clear case that the existing code in nfsd4_get_drc_mem()
is functioning incorrectly. The goal of this patch is to permit the clean
application of commit 1519fbc8832b ("minmax.h: use BUILD_BUG_ON_MSG() for
the lo < hi test in clamp()"), and any commits that depend on it, to LTS
kernels without affecting the ability to compile those kernels. This is
done by open-coding the __clamp() macro sans the built-in type checking.

Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220745#c0
Signed-off-by: NeilBrown <neil@brown.name>
Stable-dep-of: 1519fbc8832b ("minmax.h: use BUILD_BUG_ON_MSG() for the lo < hi test in clamp()")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed_by: David Laight <david.laight.linux@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfsd/nfs4state.c

index c24fe43b22684ba356290bd66e34bb4c45dde214..e4509afc3ad5d23c8acafbeb9b371aedbde76f3b 100644 (file)
@@ -1823,8 +1823,10 @@ static u32 nfsd4_get_drc_mem(struct nfsd4_channel_attrs *ca, struct nfsd_net *nn
         */
        scale_factor = max_t(unsigned int, 8, nn->nfsd_serv->sv_nrthreads);
 
-       avail = clamp_t(unsigned long, avail, slotsize,
-                       total_avail/scale_factor);
+       if (avail > total_avail / scale_factor)
+               avail = total_avail / scale_factor;
+       else if (avail < slotsize)
+               avail = slotsize;
        num = min_t(int, num, avail / slotsize);
        num = max_t(int, num, 1);
        nfsd_drc_mem_used += num * slotsize;