Proposal: a revoke() system call
Robert Watson
rwatson at FreeBSD.org
Mon Jul 7 23:06:42 UTC 2008
On Mon, 7 Jul 2008, Ken Smith wrote:
> On Mon, 2008-07-07 at 00:05 +0100, Robert Watson wrote:
>> You could achieve something of the same end by opening /dev/null and then
>> dup2()'ing to the file descriptor you want to revoke, perhaps?
>
> I might be missing something but isn't this what the deadfs vnodeops are
> for?
It's a little different, although similar. When a vnode is deadfs'd, such as
after a call to revoke(2)'s historic implementation, all open file descriptors
on the file are invalidated. I think that Sergey is suggesting semantics in
which only the current file descriptor refering to the object is invalidated
-- other independently acquired file descriptors in other processes would
remain valid.
BTW, this does show up one of the potential semantic conflicts in the proposed
new revoke behavior: suppose a TCP connection is opened, and two processes
have references to the file descriptor for the connection. One of those
processes is multi-threaded, and has a blocking read(2) on the file descriptor
in one thread, and calls close(2) from another thread. Is the proposal to
cancel in-progress I/O's against the file descriptor even though the
connection isn't closing due to the further reference to the same descriptor
in another process? Solaris has a pretty complex infrastructure to support
that sort of in-kernel cancellation -- the shutdown(2) behavior we have is
fairly different in that it manipulates connection state to cancel outstanding
I/O's, and would also affect the second process, rather than simply consumers
on the one file descriptor.
Robert N M Watson
Computer Laboratory
University of Cambridge
More information about the freebsd-arch
mailing list