On Fri, 8 Jan 2016, Robert Elz wrote:
Another possibility would be to detach the logged-to file from the process when logging is enabled (making the ioctl that attaches it also be notionally a close from the process point of view). But keeping the reference in kernel. When logging is disabled (for whatever reason) do the kernel fd_close() at that point).
Is there a "supported" interface for detaching the file (or descriptor) from the process without closing it?
Do this, and the process can no longer do an explicit close to cause a hang, and exit() won't close it in the normal sequence either, only closing the log (or detaching it from the fd) would close that file. That's also a change of filemon semantics, but I can't imagine that the application (make) really wants to be accessing the file while filemon is writing to it, does it? And if it did, it could always just explicitly open it again (though I haven't really thought through the effects of a dup() at this point - perhaps forbid ioctl'ing to a file that has a ref count > 1, so we know the fd is the only reference to it, once the ioctl "closes" it, a dup can't happen, obviously.
I expect that make(1) assumes the log-fd is still available, and just follows the example code in filemon(4) man page: when finished logging, reset the file-pointer to 0 and start reading the data.
Accessing the file via an independent open (before or after the ioctl) should not have any of these problems, that's a different struct file.
Yeah, I was trying to avoid the change in semantics. :) The fewer things I touch, the fewer things will go wrong, and I definitely don't want to break make, which would result in difficulties making[sic] a new version. :)
+------------------+--------------------------+------------------------+ | Paul Goyette | PGP Key fingerprint: | E-mail addresses: | | (Retired) | FA29 0E3B 35AF E8AE 6651 | paul at whooppee.com | | Kernel Developer | 0786 F758 55DE 53BA 7731 | pgoyette at netbsd.org | +------------------+--------------------------+------------------------+