Messages in this thread | | | Date | Mon, 3 Mar 2014 22:01:06 +0000 | From | Al Viro <> | Subject | Re: Update of file offset on write() etc. is non-atomic with I/O |
| |
On Mon, Mar 03, 2014 at 01:52:13PM -0800, Linus Torvalds wrote: > On Mon, Mar 3, 2014 at 1:26 PM, Al Viro <viro@zeniv.linux.org.uk> wrote: > > On Mon, Mar 03, 2014 at 04:03:59PM -0500, George Spelvin wrote: > >> > >> (If you want to use bits, why not use the two lsbits of the file pointer > >> for the purpose? That would save a lot of space.) > > > > Most of the cases have it kept separately in registers, actually - there's > > a reason why fdget() and friends are inlined. > > Yes. And bit test and set ops on registers are actually cheaper than > playing around with bytes. > > That said, the "fget_light()" interface sucks - exactly because it > doesn't do the "return structure in two registers" thing. We should > get rid of it - there's just one remaining user in networking code, > and it should be rewritten in terms of fdget(). > > That's a separate issue, though.
The thing is, the callers in there do *not* keep struct file * at all - they keep struct socket * and use sock->file to get struct file * back when they need it.
So struct fd is the wrong thing to use there - it only adds to register pressure. A similar pair of struct socket * and "need to fput that" flag would probably be needed, with sockfd_lookup_light() returning that.
| |