[PATCH] cachefiles: convert deprecated simple_strtoul() to kstrtoul() in percentage command handlers

From: Drif Abdelmalek Mohamed Said

Date: Sat Aug 29 2026 - 18:45:13 EST


Convert the six <N>% percentage command handlers -
cachefiles_daemon_frun(), _fcull(), _fstop(), _brun(), _bcull(), and
_bstop() - from the deprecated simple_strtoul() to kstrtoul(). These
are the only handlers in this file that take a trailing '%' after
the number; other nearby commands take plain values and are
unaffected.

Since kstrtoul() requires the whole input to be a valid number, each
handler now walks the digit run itself, checks it's followed by '%'
and NUL, and temporarily null-terminates at the '%' to isolate the
number for kstrtoul(), restoring it afterwards.

Signed-off-by: Drif Abdelmalek Mohamed Said <drifabdelmalekmohamedsaid@xxxxxxxxx>
---
fs/cachefiles/daemon.c | 78 +++++++++++++++++++++++++++++++++++-------
1 file changed, 66 insertions(+), 12 deletions(-)

diff --git a/fs/cachefiles/daemon.c b/fs/cachefiles/daemon.c
index 1a66e0af2837..12c38b366881 100644
--- a/fs/cachefiles/daemon.c
+++ b/fs/cachefiles/daemon.c
@@ -331,16 +331,25 @@ static int cachefiles_daemon_range_error(struct cachefiles_cache *cache,
static int cachefiles_daemon_frun(struct cachefiles_cache *cache, char *args)
{
unsigned long frun;
+ char *end = args;
+ int ret;

_enter(",%s", args);

if (!*args)
return -EINVAL;

- frun = simple_strtoul(args, &args, 10);
- if (args[0] != '%' || args[1] != '\0')
+ while (isdigit(*end))
+ end++;
+ if (end == args || *end != '%' || end[1] != '\0')
return -EINVAL;

+ *end = '\0';
+ ret = kstrtoul(args, 10, &frun);
+ *end = '%';
+ if (ret)
+ return ret;
+
if (frun <= cache->fcull_percent || frun >= 100)
return cachefiles_daemon_range_error(cache, args);

@@ -355,16 +364,25 @@ static int cachefiles_daemon_frun(struct cachefiles_cache *cache, char *args)
static int cachefiles_daemon_fcull(struct cachefiles_cache *cache, char *args)
{
unsigned long fcull;
+ char *end = args;
+ int ret;

_enter(",%s", args);

if (!*args)
return -EINVAL;

- fcull = simple_strtoul(args, &args, 10);
- if (args[0] != '%' || args[1] != '\0')
+ while (isdigit(*end))
+ end++;
+ if (end == args || *end != '%' || end[1] != '\0')
return -EINVAL;

+ *end = '\0';
+ ret = kstrtoul(args, 10, &fcull);
+ *end = '%';
+ if (ret)
+ return ret;
+
if (fcull <= cache->fstop_percent || fcull >= cache->frun_percent)
return cachefiles_daemon_range_error(cache, args);

@@ -379,16 +397,25 @@ static int cachefiles_daemon_fcull(struct cachefiles_cache *cache, char *args)
static int cachefiles_daemon_fstop(struct cachefiles_cache *cache, char *args)
{
unsigned long fstop;
+ char *end = args;
+ int ret;

_enter(",%s", args);

if (!*args)
return -EINVAL;

- fstop = simple_strtoul(args, &args, 10);
- if (args[0] != '%' || args[1] != '\0')
+ while (isdigit(*end))
+ end++;
+ if (end == args || *end != '%' || end[1] != '\0')
return -EINVAL;

+ *end = '\0';
+ ret = kstrtoul(args, 10, &fstop);
+ *end = '%';
+ if (ret)
+ return ret;
+
if (fstop >= cache->fcull_percent)
return cachefiles_daemon_range_error(cache, args);

@@ -403,16 +430,25 @@ static int cachefiles_daemon_fstop(struct cachefiles_cache *cache, char *args)
static int cachefiles_daemon_brun(struct cachefiles_cache *cache, char *args)
{
unsigned long brun;
+ char *end = args;
+ int ret;

_enter(",%s", args);

if (!*args)
return -EINVAL;

- brun = simple_strtoul(args, &args, 10);
- if (args[0] != '%' || args[1] != '\0')
+ while (isdigit(*end))
+ end++;
+ if (end == args || *end != '%' || end[1] != '\0')
return -EINVAL;

+ *end = '\0';
+ ret = kstrtoul(args, 10, &brun);
+ *end = '%';
+ if (ret)
+ return ret;
+
if (brun <= cache->bcull_percent || brun >= 100)
return cachefiles_daemon_range_error(cache, args);

@@ -427,16 +463,25 @@ static int cachefiles_daemon_brun(struct cachefiles_cache *cache, char *args)
static int cachefiles_daemon_bcull(struct cachefiles_cache *cache, char *args)
{
unsigned long bcull;
+ char *end = args;
+ int ret;

_enter(",%s", args);

if (!*args)
return -EINVAL;

- bcull = simple_strtoul(args, &args, 10);
- if (args[0] != '%' || args[1] != '\0')
+ while (isdigit(*end))
+ end++;
+ if (end == args || *end != '%' || end[1] != '\0')
return -EINVAL;

+ *end = '\0';
+ ret = kstrtoul(args, 10, &bcull);
+ *end = '%';
+ if (ret)
+ return ret;
+
if (bcull <= cache->bstop_percent || bcull >= cache->brun_percent)
return cachefiles_daemon_range_error(cache, args);

@@ -451,16 +496,25 @@ static int cachefiles_daemon_bcull(struct cachefiles_cache *cache, char *args)
static int cachefiles_daemon_bstop(struct cachefiles_cache *cache, char *args)
{
unsigned long bstop;
+ char *end = args;
+ int ret;

_enter(",%s", args);

if (!*args)
return -EINVAL;

- bstop = simple_strtoul(args, &args, 10);
- if (args[0] != '%' || args[1] != '\0')
+ while (isdigit(*end))
+ end++;
+ if (end == args || *end != '%' || end[1] != '\0')
return -EINVAL;

+ *end = '\0';
+ ret = kstrtoul(args, 10, &bstop);
+ *end = '%';
+ if (ret)
+ return ret;
+
if (bstop >= cache->bcull_percent)
return cachefiles_daemon_range_error(cache, args);

--
2.43.0