On 2019-09-07, Jeff Layton <jlayton@xxxxxxxxxx> 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 <https://www.cyphar.com/>
Attachment:
signature.asc
Description: PGP signature