On Tue, Jul 30, 2024 at 10:58:13AM GMT, Olaf Hering wrote: > 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. The API of that function is not > documented. It currently returns only ERR_PTR values, but may return > also NULL in the future. Use PTR_ERR_OR_ZERO to cover both cases. > > Fixes: f8b92ba67c5d ("mount: Add mount warning for impending timestamp expiry") > > Signed-off-by: Olaf Hering <olaf@xxxxxxxxx> > --- > fs/namespace.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/fs/namespace.c b/fs/namespace.c > index 328087a4df8a..539d4f203a20 100644 > --- a/fs/namespace.c > +++ b/fs/namespace.c > @@ -2922,7 +2922,14 @@ static void mnt_warn_timestamp_expiry(struct path *mountpoint, struct vfsmount * > (!(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 *mntpath; > + > + if (!buf) > + return; > + > + mntpath = d_path(mountpoint, buf, PAGE_SIZE); > + if (PTR_ERR_OR_ZERO(mntpath)) This needs to be IS_ERR_OR_NULL(). > + goto err; We should still warn when decoding the mountpoint fails. I'll just amend your patch to something like: diff --git a/fs/namespace.c b/fs/namespace.c index 328087a4df8a..0f2f140aaf05 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -2921,16 +2921,21 @@ 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 = NULL; + + buf = (char *)__get_free_page(GFP_KERNEL); + if (buf) + mntpath = d_path(mountpoint, buf, PAGE_SIZE); + if (IS_ERR_OR_NULL(mntpath)) + mntpath = "(unknown)"; pr_warn("%s filesystem being %s at %s supports timestamps until %ptTd (0x%llx)\n", sb->s_type->name, is_mounted(mnt) ? "remounted" : "mounted", mntpath, &sb->s_time_max, (unsigned long long)sb->s_time_max); - - free_page((unsigned long)buf); + if (buf) + free_page((unsigned long)buf); sb->s_iflags |= SB_I_TS_EXPIRY_WARNED; } }