> On Jul 23, 2026, at 10:22 AM, Miklos Szeredi <[email protected]> wrote:
> 
> On Wed, 22 Jul 2026 at 18:36, Andy Lutomirski <[email protected]> wrote:
> 
>> Other than that question, I think I generally agree with you.  The
>> interesting operations here (getting an fd to something that was
>> previously inaccessible) are different enough from normal path lookups
>> that I think they deserve to be explicit syscalls or syscall modes,
>> not magic links.
> 
> This is a super specialized use case.
> 
> I sort of agree that doing statmount() as a syscall was not a bad
> idea.   But new syscall for getting a backing layer, that makes sense
> on just a couple of filesystems?
> 
> And that leaves us with ioctl.   And ioclt() returning an open fd has
> it's own problems, besides ioctl being a generally bad interface.
> 
> And we have all these powerful concepts and interfaces for
> filesystems, why the big resistance to actually using them?.
> 
> Sure, it's easy to misuse, but I don't yet see why this particular
> case would be a misuse.  Enlighten me please.
> 

I think there are are a couple of complications involved with open, openat, etc 
that aren’t present with explicit for-the-purpose syscalls:

- O_XYZ flags to open() are all kinds of awful, for historical reasons that are 
not fundamental to the concept.

- symlinks. If we have a new API where opening /proc/something/magic/blah can 
access something that ought to be inaccessible when accessed intentionally and 
with privilege, a symlink pointing at /proc/something/… can cause the API to be 
used inadvertently.  Admittedly we have this problem with basically all 
symlinks, so this isn’t exactly unique.

- our nasty fs permission model. We gave a sort of gnarly mix of a bit of 
fd-based permission and mostly mode/ACL-based permissions for path traversal 
and opening, and mapping this nicely only new APIs (as opposed to actual files 
and directories) can have unpleasant results.

Of course, I’m busy arguing (slowly and without a concrete proposal) that we 
should have proper capability-like fds, and maybe that’s kind of an answer to 
this:

What if we had an API to get an fd to the “control filesystem” for a 
superblock, like your O_ALT but as a real syscall or maybe only accessible via 
one of the newer and less janky open variants?  And what if the resulting fd 
and the filesystem tree it represented had a few properties that made it very 
different from normal directory fds:

- You cannot mount anything on it or its subdirectories, nor can you open_tree 
or otherwise mount it anywhere.  But you can open_tree the very specific things 
in it that point outside of the special API (e.g. the overlayfs layers).

- Privilege is fully captured by the original call that gets you the fd.  
current->cred is not checked when *using* it except to the extent that you 
might need privileges over your own namespaces to do operations that might 
affect them.

- You can’t fchdir or (hypothetically) fchroot into it.  (Not sure how 
important this is.)

- Maybe you can’t follow /proc/pid/fd/N links into it either?  Or maybe that 
would break CRIU too badly.

The basic idea here is to try to treat it like an API that happens to use the 
open machinery but not as part of the filesystem hierarchy.

One could go even farther and try to remove a bunch of the parts that make 
implementing it tedious.  For example, if this hierarchy had 
“/layers/1/options”, there is really no reason to over open an fd to layers or 
layers/1, and if we had a readfile syscall there wouldn’t be a reason to open 
an fd to options either.  But maybe this is a silly direction to move in.

> Thanks,
> Miklos

Reply via email to