On Thu, Jan 28, 2021 at 10:15 PM Alessio Balsini <balsini@xxxxxxxxxxx> wrote: > > Hi all, > > I'm more than happy to change the interface into something that is > objectively better and accepted by everyone. > I would really love to reach the point at which we have a "stable-ish" > UAPI as soon as possible. > > I've been thinking about a few possible approaches to fix the issue, yet > to preserve its flexibility. These are mentioned below. > > > Solution 1: Size > > As mentioned in my previous email, one solution could be to introduce > the "size" field to allow the structure to grow in the future. > > struct fuse_passthrough_out { > uint32_t size; // Size of this data structure > uint32_t fd; > }; > > The problem here is that we are making the promise that all the upcoming > fields are going to be maintained forever and at the offsets they were > originally defined. > > > Solution 2: Version > > Another solution could be to s/size/version, where for every version of > FUSE passthrough we reserve the right to modifying the fields over time, > casting them to the right data structure according to the version. > > > Solution 3: Type > > Using an enumerator to define the data structure content and purpose is > the most flexible solution I can think of. This would for example allow > us to substitute FUSE_DEV_IOC_PASSTHROUGH_OPEN with the generic > FUSE_DEV_IOC_PASSTHROUGH and having a single ioctl for any eventually > upcoming passthrough requests. > > enum fuse_passthrough_type { > FUSE_PASSTHROUGH_OPEN > }; > > struct fuse_passthrough_out { > uint32_t type; /* as defined by enum fuse_passthrough_type */ > union { > uint32_t fd; > }; > }; > > This last is my favorite, as regardless the minimal logic required to > detect the size and content of the struct (not required now as we only > have a single option), it would also allow to do some kind of interface > versioning (e.g., in case we want to implement > FUSE_PASSTHROUGH_OPEN_V2). > Usually a new type of ioctl will be added in such cases. If we want to stick to the same ioctl number, it might be easier to add a `flags` field to differentiate compatible passthrough ioctls. So in future, if a new interface is compatible with the existing one, we can use flags to tell it. If it is not compatible, we still need to add a new ioctl. wdyt? struct fuse_passthrough_out { uint32_t flags; union { uint32_t fd; }; }; This somehow follows the "Flags as a system call API design pattern" (https://lwn.net/Articles/585415/). Just my two cents. Cheers, Tao -- Into Sth. Rich & Strange