]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mount: handle OOM on mnt_warn_timestamp_expiry
authorOlaf Hering <olaf@aepfle.de>
Tue, 30 Jul 2024 08:58:13 +0000 (10:58 +0200)
committerChristian Brauner <brauner@kernel.org>
Mon, 19 Aug 2024 11:45:02 +0000 (13:45 +0200)
If no page could be allocated, an error pointer was used as format
string in pr_warn.

Rearrange the code to return early in case of OOM. Also add a check
for the return value of d_path.

Fixes: f8b92ba67c5d ("mount: Add mount warning for impending timestamp expiry")
Signed-off-by: Olaf Hering <olaf@aepfle.de>
Link: https://lore.kernel.org/r/20240730085856.32385-1-olaf@aepfle.de
[brauner: rewrite commit and commit message]
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/namespace.c

index 328087a4df8a6e19f5a64cff8fe53423a04f6df9..155c6abda71da6f5deefc5555aeea7a3b9a69f8e 100644 (file)
@@ -2921,8 +2921,15 @@ static void mnt_warn_timestamp_expiry(struct path *mountpoint, struct vfsmount *
        if (!__mnt_is_readonly(mnt) &&
           (!(sb->s_iflags & SB_I_TS_EXPIRY_WARNED)) &&
           (ktime_get_real_seconds() + TIME_UPTIME_SEC_MAX > sb->s_time_max)) {
-               char *buf = (char *)__get_free_page(GFP_KERNEL);
-               char *mntpath = buf ? d_path(mountpoint, buf, PAGE_SIZE) : ERR_PTR(-ENOMEM);
+               char *buf, *mntpath;
+
+               buf = (char *)__get_free_page(GFP_KERNEL);
+               if (buf)
+                       mntpath = d_path(mountpoint, buf, PAGE_SIZE);
+               else
+                       mntpath = ERR_PTR(-ENOMEM);
+               if (IS_ERR(mntpath))
+                       mntpath = "(unknown)";
 
                pr_warn("%s filesystem being %s at %s supports timestamps until %ptTd (0x%llx)\n",
                        sb->s_type->name,
@@ -2930,8 +2937,9 @@ static void mnt_warn_timestamp_expiry(struct path *mountpoint, struct vfsmount *
                        mntpath, &sb->s_time_max,
                        (unsigned long long)sb->s_time_max);
 
-               free_page((unsigned long)buf);
                sb->s_iflags |= SB_I_TS_EXPIRY_WARNED;
+               if (buf)
+                       free_page((unsigned long)buf);
        }
 }