Messages in this thread | | | Date | Fri, 31 May 2013 18:38:34 +0200 | From | Oleg Nesterov <> | Subject | Re: [PATCH 3/3] proc: simplify proc_task_readdir/first_tid paths |
| |
Eric, sorry for delay.
On 05/29, Eric W. Biederman wrote: > > Oleg Nesterov <oleg@redhat.com> writes: > > > Why the empty "." + ".." dir is bad if the task(s) has gone away after > > opendir? > > Because the definition of a deleted directory that you are in is that > getdents will return -ENOENT. > > You can reproduce this with any linux filesystem. > mkdir foo > cd foo > rmdir ../foo > strace -f ls . > > open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 > getdents(3, 0x1851c88, 32768) = -1 ENOENT (No such file or directory) > close(3) = 0
Heh. Indeed, vfs_readdir() checks IS_DEADDIR().
Thanks.
OK. But this means that even 1/3 is not 100% right, exactly because leader can be unhashed right before first_tid() takes rcu lock. Easy to fix, we should simply factor out the "nr != 0" check.
And this also means that 3/3 is not right by the same reason. I'll make a simpler patch which only avoids the unnecessary get/put in proc_task_readdir().
Unless we can tolerate this very unlikely rase when the leader goes away after initial ENOENT check at the start, of course... Or unless we add canceldir() which resets getdents_callback->previous so that we could return ENOENT after filldir() was already called ;)
Thanks Eric. I'll send v2.
Oleg.
| |