From: Stas Sergeev > Sent: 22 April 2024 09:45 I seem to have 5 copies of this patch..... > This patch moves the call to alloc_empty_file() below the call to > path_init(). That changes is needed for the next patch, which adds > a cred override for alloc_empty_file(). The needed cred info is only > available after the call to path_init(). > > No functional changes are intended by that patch. ... > --- > fs/namei.c | 26 +++++++++++++++++--------- > 1 file changed, 17 insertions(+), 9 deletions(-) > > diff --git a/fs/namei.c b/fs/namei.c > index c5b2a25be7d0..2fde2c320ae9 100644 > --- a/fs/namei.c > +++ b/fs/namei.c > @@ -3782,22 +3782,30 @@ static struct file *path_openat(struct nameidata *nd, > struct file *file; > int error; > > - file = alloc_empty_file(op->open_flag, current_cred()); > - if (IS_ERR(file)) > - return file; > - > - if (unlikely(file->f_flags & __O_TMPFILE)) { > + if (unlikely(op->open_flag & __O_TMPFILE)) { > + file = alloc_empty_file(op->open_flag, current_cred()); > + if (IS_ERR(file)) > + return file; > error = do_tmpfile(nd, flags, op, file); > - } else if (unlikely(file->f_flags & O_PATH)) { > + } else if (unlikely(op->open_flag & O_PATH)) { > + file = alloc_empty_file(op->open_flag, current_cred()); > + if (IS_ERR(file)) > + return file; > error = do_o_path(nd, flags, file); You probably ought to merge the two 'unlikely' tests. Otherwise there'll be two conditionals in the 'hot path'. (There probably always were.) So something like: if (unlikely(op->open_flag & (__O_TMPFILE | O_PATH))) { file = alloc_empty_file(op->open_flag, current_cred()); if (IS_ERR(file)) return file; if (op->open_flag & __O_TMFILE) error = do_tmpfile(nd, flags, op, file); else error = do_o_path(nd, flags, file); } else { Copying op->open_flag to a local may also generate better code. David > } else { > const char *s = path_init(nd, flags); > - while (!(error = link_path_walk(s, nd)) && > - (s = open_last_lookups(nd, file, op)) != NULL) > - ; > + file = alloc_empty_file(op->open_flag, current_cred()); > + error = PTR_ERR_OR_ZERO(file); > + if (!error) { > + while (!(error = link_path_walk(s, nd)) && > + (s = open_last_lookups(nd, file, op)) != NULL) > + ; > + } > if (!error) > error = do_open(nd, file, op); > terminate_walk(nd); > + if (IS_ERR(file)) > + return file; > } > if (likely(!error)) { > if (likely(file->f_mode & FMODE_OPENED)) > -- > 2.44.0 > - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)