On Tue, Sep 03, 2019 at 06:56:10PM +0100, Al Viro wrote: > On Tue, Sep 03, 2019 at 08:39:30AM -0700, Christoph Hellwig wrote: > > > > There's much nastier situation than "new upstream kernel released, > > > need to rebuild" - it's bisect in mainline trying to locate something... > > > > I really don't get the point. And it's not like we've card about > > this anywhere else. And jumping wildly around with the numeric values > > for constants will lead to bugs like the one you added and fixed again > > and again. > > The thing is, there are several groups - it's not as if all additions > were guaranteed to be at the end. So either we play with renumbering > again and again, or we are back to the square one... > > Is there any common trick that would allow to verify the lack of duplicates > at the build time? > > Or we can reorder the list by constant value, with no grouping visible > anywhere... Here is what I'd do. No validation of duplicates, but the 1 << bit notation makes them very easy to spot: diff --git a/include/linux/namei.h b/include/linux/namei.h index 397a08ade6a2..a9536f90936c 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h @@ -16,28 +16,47 @@ enum { MAX_NESTED_LINKS = 8 }; */ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND}; -/* 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_REVAL 0x0020 /* tell ->d_revalidate() to trust no cache */ -#define LOOKUP_RCU 0x0040 /* RCU pathwalk mode; semi-internal */ - -/* 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 exclusive creation */ -#define LOOKUP_RENAME_TARGET 0x0800 /* ... in destination of rename() */ - -/* internal use only */ -#define LOOKUP_PARENT 0x0010 -#define LOOKUP_NO_REVAL 0x0080 -#define LOOKUP_JUMPED 0x1000 -#define LOOKUP_ROOT 0x2000 -#define LOOKUP_ROOT_GRABBED 0x0008 +/* + * Pathwalk mode: + */ + +/* follow links at the end */ +#define LOOKUP_FOLLOW (1 << 0) +/* require a directory */ +#define LOOKUP_DIRECTORY (1 << 1) +/* force terminal automount */ +#define LOOKUP_AUTOMOUNT (1 << 2) +/* accept empty path [user_... only] */ +#define LOOKUP_EMPTY (1 << 3) +/* follow mounts in the starting point */ +#define LOOKUP_DOWN (1 << 4) +/* tell ->d_revalidate() to trust no cache */ +#define LOOKUP_REVAL (1 << 5) +/* RCU pathwalk mode; semi-internal */ +#define LOOKUP_RCU (1 << 6) + + +/* + * These tell filesystem methods that we are dealing with the final component: + */ + +/* ... in open */ +#define LOOKUP_OPEN (1 << 10) +/* ... in object creation */ +#define LOOKUP_CREATE (1 << 11) +/* ... in exclusive creation */ +#define LOOKUP_EXCL (1 << 12) +/* ... in destination of rename() */ +#define LOOKUP_RENAME_TARGET (1 << 13) + +/* + * Internal use only: + */ +#define LOOKUP_PARENT (1 << 20) +#define LOOKUP_NO_REVAL (1 << 21) +#define LOOKUP_JUMPED (1 << 22) +#define LOOKUP_ROOT (1 << 23) +#define LOOKUP_ROOT_GRABBED (1 << 24) extern int path_pts(struct path *path);