Eric, sorry for delay. On 05/29, Eric W. Biederman wrote: > > Oleg Nesterov <o...@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. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/