Details
-
Bug
-
Resolution: Fixed
-
Minor
-
None
-
None
-
3
-
9223372036854775807
Description
If libcfs_debug_mb parameter is specified to insmod (i.e. set before module is initialized) then it does not get initialized correctly. This appears to be a regression from:
commit 8b78a3ffb5220330f41b4fa8576a05c4e017cfb1 Author: Mr NeilBrown <neilb@suse.de> Date: Sun Mar 8 21:35:57 2020 -0400 LU-9859 libcfs: always range-check libcfs_debug_mb setting.
diff --git a/libcfs/libcfs/debug.c b/libcfs/libcfs/debug.c index 99518ab116..e5bff2e18a 100644 --- a/libcfs/libcfs/debug.c +++ b/libcfs/libcfs/debug.c @@ -65,21 +65,15 @@ static int libcfs_param_debug_mb_set(const char *val, if (rc < 0) return rc; -/* - * RHEL6 does not support any kind of locking so we have to provide - * our own - */ - if (!*((unsigned int *)kp->arg)) { - *((unsigned int *)kp->arg) = num; - return 0; - } + num = cfs_trace_set_debug_mb(num); - rc = cfs_trace_set_debug_mb(num); - - if (!rc) - *((unsigned int *)kp->arg) = cfs_trace_get_debug_mb(); + *((unsigned int *)kp->arg) = num; + num = cfs_trace_get_debug_mb(); + if (num) + /* This value is more precise */ + *((unsigned int *)kp->arg) = num; - return rc; + return 0; }
I think the idea is that cfs_trace_get_debug_mb() would only return non-zero if the module had been initialized, so it's return value should be used instead of the return val from cfs_trace_set_debug_mb(). However, cfs_trace_get_debug_mb() never returns 0:
int cfs_trace_get_debug_mb(void) { ... return (total_pages >> (20 - PAGE_SHIFT)) + 1; }
We can see it will always return at least 1.