Re: close return value (was Re: [ANNOUNCE] Ext3 vs Reiserfs benchmarks)

From: Richard Gooch (rgooch@ras.ucalgary.ca)
Date: Wed Jul 17 2002 - 12:51:31 EST


Andries Brouwer writes:
> On Tue, Jul 16, 2002 at 09:38:53PM -0700, Elladan wrote:
>
> > The question is, does the OS standard guarantee that the fd is closed,
> > even if close() returns EINTR or EIO? Just going by the normal usage of
> > EINTR, one might think otherwise. It doesn't appear to be documented
> > one way or another.
> >
> > Alan said you could just issue close again to make sure - the example
> > shows that this is not the case. A second close is either required or
> > forbidden in that example - and the behavior has to be well defined or
> > you won't know which to do.
>
> No, the behaviour is not well-defined at all.
> The standard explicitly leaves undefined what happens when close
> returns EINTR or EIO.

However, the only sane thing to do is to explicitly define one way or
another. The standard is broken. Consider a threaded application,
where one thread tries to call close(), gets an error and re-tries,
because it's not sure if the fd was closed or not. If the fd *is*
closed, and the thread loops calling close(), checking for EBADF,
there is a race if another thread tries calling open()/creat()/dup().

The ambiguity in the standard thus results in the impossibility of
writing a race-free application. And no, forcing the application to
protect system calls with mutexes isn't a solution.

Linux should define explicitly what happens on error return from
close(). Let that be the new standard.

                                Regards,

                                        Richard....
Permanent: rgooch@atnf.csiro.au
Current: rgooch@ras.ucalgary.ca
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Tue Jul 23 2002 - 22:00:23 EST