[TUHS] FreeBSD behind the times? (was: Favorite unix design principles?)
Bakul Shah
bakul at iitbombay.org
Sat Feb 6 11:55:38 AEST 2021
Please see my followup message. My fault for mixing two separate things
(what a user should not do vs how the kernel can still provide coherence).
> On Feb 5, 2021, at 5:18 PM, John Gilmore <gnu at toad.com> wrote:
>
> On Thu, Feb 04, 2021 at 09:17:54PM -0800, Bakul Shah wrote:
>> Write(2)ing to a mapped page sounds pretty dodgy. Likely to get you
>> in trouble in any case. Similarly read(2)ing.
>
> Uh, no. You misunderstand completely.
>
> The purpose of the kernel is to provide a reliable interface to system
> facilities, that lets processes NOT DEPEND on what other processes are
> doing.
>
> The decision about whether Tool X uses mmap() versus read() to access a
> file, or mmap() versus write() to change one, is a decision that DOES
> NOT DEPEND on what Tool Y is doing. Tools X and Y may have been written
> by different groups in different decades. Tool X may have been written
> to use stdio, which used read(). Three years later, stdio got rewritten
> to use mmap() for speed, but that's invisible to the author of Tool X.
> And maybe an end user in 2025 decides to use both Tool X and Tool Y on
> the same file. So only much later will any malign interactions between
> read/write and mmap actually be noticed by end users. And the fix is
> not to create new dependencies between Tool X, stdio, and Tool Y. It is
> to fix the kernel so they do not depend on each other!
>
> Here is a real-life example from my own experience.
>
> There is a long-standing bug in the Linux kernel, in which the inotify()
> system call simply didn't work on nested file systems. This caused a
> long-standing bug in Ubuntu, which I reported in 2012 here:
>
> https://bugs.launchpad.net/ubuntu/+source/rpcbind/+bug/977847
>
> The symptom was that after booting from a LiveCD image, "apt-get
> install" for system services (in my case an NFS client package) wouldn't
> work. Turned out the system startup scripts used inotify() to notice
> and start newly installed system services. The root cause was that
> inotify failed because the root file system was an "overlayfs" that
> overlaid a RAMdisk on top of the read-only LiveCD file system. The
> people who implemented "overlayfs" didn't think inotify() was important,
> or they thought it would be too much work to make it actually meet its
> specs, so they just made it ignore changes to the files in the overlaid
> file system. So the startup daemon's inotify() would never report the
> creation of new files about the new services, because those files were
> in the overlaying RAM disk, and so it would not start them and the user
> would notice the error.
>
> The underlying overlayfs bug was reported in 2011 here:
>
> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/882147
>
> As far as I know it has never been fixed. (The bug report was
> closed in 2019 for one of the usual bogus reasons.)
>
> The problem came because real tools (like systemd, or the tail command)
> actually started using inotify, assuming that as a well documented
> kernel interface, it would actually meet its specs. And because a
> completely unrelated other real tool (like the LiveCD installer)
> actually started using overlayfs, assuming that as a well documented
> kernel interface, it too would actually meet its specs. And then one
> day somebody tried to use both those tools together and they failed.
>
> That's why telling people "Don't use mmap() on the same file that you
> use read() on" is an invalid attitude for a Real Kernel Maintainer.
> Props to Larry McVoy for caring about this. Boos to the Linux
> maintainers of overlayfs who didn't give a shit.
>
> John
>
More information about the TUHS
mailing list