On 2019-09-07, Jeff Layton jlayton@kernel.org 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).