Re: [PATCH 07/19] VFS: repack LOOKUP_ bit flags.
From: NeilBrown
Date: Thu Feb 06 2025 - 19:24:47 EST
On Thu, 06 Feb 2025, Christian Brauner wrote:
> On Thu, Feb 06, 2025 at 04:42:44PM +1100, NeilBrown wrote:
> > The LOOKUP_ bits are not in order, which can make it awkward when adding
> > new bits. Two bits have recently been added to the end which makes them
> > look like "scoping flags", but in fact they aren't.
> >
> > Also LOOKUP_PARENT is described as "internal use only" but is used in
> > fs/nfs/
> >
> > This patch:
> > - Moves these three flags into the "pathwalk mode" section
> > - changes all bits to use the BIT(n) macro
> > - Allocates bits in order leaving gaps between the sections,
> > and documents those gaps.
> >
> > Signed-off-by: NeilBrown <neilb@xxxxxxx>
> > ---
>
> This is also a worthwhile cleanup independent of the rest of the series.
> But you've added LOOKUP_INTENT_FLAGS prior to packing the flags. Imho,
> this patch should've gone before the addition of LOOKUP_INTENT_FLAGS.
I'll fix that and submit separately - thanks.
>
> And btw, what does this series apply to?
It was based on
Commit 92514ef226f5 ("Merge tag 'for-6.14-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux")
which was the current upstream at the time.
> Doesn't apply to next-20250206 nor to current mainline.
> I get the usual
>
> Patch failed at 0012 VFS: enhance d_splice_alias to accommodate shared-lock updates
> error: sha1 information is lacking or useless (fs/dcache.c).
> error: could not build fake ancestor
>
> when trying to look at this locally.
Probably your tree was missing
Commit 902e09c8acde ("fix braino in "9p: fix ->rename_sem exclusion"")
Thanks,
NeilBrown
>
> > include/linux/namei.h | 46 +++++++++++++++++++++----------------------
> > 1 file changed, 23 insertions(+), 23 deletions(-)
> >
> > diff --git a/include/linux/namei.h b/include/linux/namei.h
> > index 839a64d07f8c..0d81e571a159 100644
> > --- a/include/linux/namei.h
> > +++ b/include/linux/namei.h
> > @@ -18,38 +18,38 @@ enum { MAX_NESTED_LINKS = 8 };
> > enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT};
> >
> > /* pathwalk mode */
> > -#define LOOKUP_FOLLOW 0x0001 /* follow links at the end */
> > -#define LOOKUP_DIRECTORY 0x0002 /* require a directory */
> > -#define LOOKUP_AUTOMOUNT 0x0004 /* force terminal automount */
> > -#define LOOKUP_EMPTY 0x4000 /* accept empty path [user_... only] */
> > -#define LOOKUP_DOWN 0x8000 /* follow mounts in the starting point */
> > -#define LOOKUP_MOUNTPOINT 0x0080 /* follow mounts in the end */
> > -
> > -#define LOOKUP_REVAL 0x0020 /* tell ->d_revalidate() to trust no cache */
> > -#define LOOKUP_RCU 0x0040 /* RCU pathwalk mode; semi-internal */
> > +#define LOOKUP_FOLLOW BIT(0) /* follow links at the end */
> > +#define LOOKUP_DIRECTORY BIT(1) /* require a directory */
> > +#define LOOKUP_AUTOMOUNT BIT(2) /* force terminal automount */
> > +#define LOOKUP_EMPTY BIT(3) /* accept empty path [user_... only] */
> > +#define LOOKUP_LINKAT_EMPTY BIT(4) /* Linkat request with empty path. */
> > +#define LOOKUP_DOWN BIT(5) /* follow mounts in the starting point */
> > +#define LOOKUP_MOUNTPOINT BIT(6) /* follow mounts in the end */
> > +#define LOOKUP_REVAL BIT(7) /* tell ->d_revalidate() to trust no cache */
> > +#define LOOKUP_RCU BIT(8) /* RCU pathwalk mode; semi-internal */
> > +#define LOOKUP_CACHED BIT(9) /* Only do cached lookup */
> > +#define LOOKUP_PARENT BIT(10) /* Looking up final parent in path */
> > +/* 5 spare bits for pathwalk */
> >
> > /* These tell filesystem methods that we are dealing with the final component... */
> > -#define LOOKUP_OPEN 0x0100 /* ... in open */
> > -#define LOOKUP_CREATE 0x0200 /* ... in object creation */
> > -#define LOOKUP_EXCL 0x0400 /* ... in target must not exist */
> > -#define LOOKUP_RENAME_TARGET 0x0800 /* ... in destination of rename() */
> > +#define LOOKUP_OPEN BIT(16) /* ... in open */
> > +#define LOOKUP_CREATE BIT(17) /* ... in object creation */
> > +#define LOOKUP_EXCL BIT(18) /* ... in target must not exist */
> > +#define LOOKUP_RENAME_TARGET BIT(19) /* ... in destination of rename() */
> >
> > #define LOOKUP_INTENT_FLAGS (LOOKUP_OPEN | LOOKUP_CREATE | LOOKUP_EXCL | \
> > LOOKUP_RENAME_TARGET)
> > -
> > -/* internal use only */
> > -#define LOOKUP_PARENT 0x0010
> > +/* 4 spare bits for intent */
> >
> > /* Scoping flags for lookup. */
> > -#define LOOKUP_NO_SYMLINKS 0x010000 /* No symlink crossing. */
> > -#define LOOKUP_NO_MAGICLINKS 0x020000 /* No nd_jump_link() crossing. */
> > -#define LOOKUP_NO_XDEV 0x040000 /* No mountpoint crossing. */
> > -#define LOOKUP_BENEATH 0x080000 /* No escaping from starting point. */
> > -#define LOOKUP_IN_ROOT 0x100000 /* Treat dirfd as fs root. */
> > -#define LOOKUP_CACHED 0x200000 /* Only do cached lookup */
> > -#define LOOKUP_LINKAT_EMPTY 0x400000 /* Linkat request with empty path. */
> > +#define LOOKUP_NO_SYMLINKS BIT(24) /* No symlink crossing. */
> > +#define LOOKUP_NO_MAGICLINKS BIT(25) /* No nd_jump_link() crossing. */
> > +#define LOOKUP_NO_XDEV BIT(26) /* No mountpoint crossing. */
> > +#define LOOKUP_BENEATH BIT(27) /* No escaping from starting point. */
> > +#define LOOKUP_IN_ROOT BIT(28) /* Treat dirfd as fs root. */
> > /* LOOKUP_* flags which do scope-related checks based on the dirfd. */
> > #define LOOKUP_IS_SCOPED (LOOKUP_BENEATH | LOOKUP_IN_ROOT)
> > +/* 3 spare bits for scoping */
> >
> > extern int path_pts(struct path *path);
> >
> > --
> > 2.47.1
> >
>