Re: [PATCH v3 6/7] fs: struct file move from call_rcu() to SLAB_DESTROY_BY_RCU
From: Eric Dumazet <hidden>
Date: 2008-12-17 20:25:20
Also in:
linux-fsdevel, lkml
Christoph Lameter a écrit :
On Fri, 12 Dec 2008, Eric Dumazet wrote:quoted
quoted
a truly allocated file. At this point the file is a truly allocated file but not anymore ours.Its a valid file. Does ownership matter here?quoted
Reading again this mail I realise we call put_filp(file), while this should be fput(file) or put_filp(file), we dont know. Damned, this patch is wrong as is. Christoph, Paul, do you see the problem ?Yes.quoted
In fget()/fget_light() we dont know if the other thread (the one who re-allocated the file, and tried to close it while we got a reference on file) had to call put_filp() or fput() to release its own reference. So we call atomic_long_dec_and_test() and cannot take the appropriate action (calling the full __fput() version or the small one, that some systems use to 'close' an not really opened file.The difference is mainly that fput() does full processing whereas put_filp() is used when we know that the file was not fully operational. If the checks in __fput are able to handle the put_filp() situation by not releasing resources that were not allocated then we should be fine.quoted
I believe put_filp() is only called on slowpath (error cases).Looks like it. It seems to assume that no dentry is associated.quoted
Should we just zap it and always call fput() ?Only if fput() can handle partially setup files.
It can do that if we add a check for NULL dentry in __fput(), so put_filp() can disappear. But there is a remaining point where we do an atomic_long_dec_and_test(&...->f_count), in fs/aio.c, function __aio_put_req(). This one is tricky :(