On Sun, Aug 29, 2004 at 08:55:02PM -0700, Linus Torvalds wrote: > Well, the above _is_ the same as "openat()", really. It's just using a > filesystem starting point to emulate a new system call. Same thing > conceptually. You could do pretty much any system call as a filesystem > action if you wanted to ;)
Umm... Yes and no - open() is not the only thing you can do there. You can emulate some of the other stuff with open() + fchdir() + syscall, but... Note that it also gives you access to other tasks' files (provided that tasks are yours, so you can get to their /proc/.../fd). > I don't disagree with doing so - as a way to expose the new system call to > scripts. But I don't think you're being entirely intellectually honest if > you think this suddendly makes it be "one namespace". It's still a > secondary namespace rooted in an entry in the normal ones - exactly like > "openat()". Well - it *does* expose these objects to all normal syscalls. E.g. you can unlink() a component in there without fd2 = open(".", ...); fd3 = openat(fd, ".", ....) fchdir(fd3); unlink("blah"); fchdir(fd2); and similar horrors (now have fun adding locking for multithreaded process, etc.). In that sense it is, indeed, the same namespace. > For a non-script, a native "openat()" interface would be more efficient > and less confusing, and conceptually no different from yours. No reason > we couldn't have both, since they are 100% equivalent and would share the > same code anyway... I'm not sure that openat() is the right interface for e.g. fileservers. And no, I'm not saying that above is suitable for them - IMO neither variant is what they need. The thing is, fileserver almost certainly wants to create and remove objects. And you either end up with new syscalls for doing *that* relative to opened fd or you do tons of fchdir(), which makes benefits of openat() dubious in the best case. Arguments about O_NOFOLLOW on the intermediate stages are bullshit, IMNSHO - if they want to make some parts of tree inaccessible, they should simply mkdir /tmp/FOAD; chmod 0 /tmp/FOAD; mount --bind /tmp/FOAD <blocked path> in the namespace their daemon is running in. And forget all that crap about filtering pathnames and blocking symlinks on intermediate stages (the latter is obviously worthless without the former since one can simply substitute the symlink body in the pathname).