On Tue 30-07-24 11:49:37, Christian Brauner wrote: > 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: Looks good to me. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > > 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; > } > } > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR