On 2019-09-07, Jeff Layton wrote: > On Thu, 2019-09-05 at 06:19 +1000, Aleksa Sarai wrote: > > + * @flags: O_* flags. > > + * @mode: O_CREAT/O_TMPFILE file mode. > > + * @upgrade_mask: UPGRADE_* flags (to restrict O_PATH re-opening). > > + * @resolve: RESOLVE_* flags. > > + */ > > +struct open_how { > > + __u32 flags; > > + union { > > + __u16 mode; > > + __u16 upgrade_mask; > > + }; > > + __u16 resolve; > > +}; > > + > > +#define OPEN_HOW_SIZE_VER0 8 /* sizeof first published struct */ > > + > > Hmm, there is no version field. When you want to expand this in the > future, what is the plan? Add a new flag to indicate that it's some > length? The "version number" is the size of the struct. Any extensions we make are appended to the struct (openat2 now takes a size_t argument), and the new copy_struct_{to,from}_user() helpers handle all of the permutations of {old,new} kernel and {old,new} user space. This is how clone3(), sched_[gs]etattr() and perf_event_open() all operate (all of the sigset syscalls operate similarly but don't gracefully handle different kernel vintages -- you just get -EINVAL). -- Aleksa Sarai Senior Software Engineer (Containers) SUSE Linux GmbH