[Lustre-discuss] question about dcache revalidate

tao.peng at emc.com tao.peng at emc.com
Wed Jan 11 06:06:43 PST 2012


I was reading dcache.c and following comments in ll_revalidate_it() seem confusing. Does it mean llite can hash a positive dentry to dcache without taking inode LOOKUP lock?

589         /*
590          * This part is here to combat evil-evil race in real_lookup on 2.6
591          * kernels.  The race details are: We enter do_lookup() looking for some
592          * name, there is nothing in dcache for this name yet and d_lookup()
593          * returns NULL.  We proceed to real_lookup(), and while we do this,
594          * another process does open on the same file we looking up (most simple
595          * reproducer), open succeeds and the dentry is added. Now back to
596          * us. In real_lookup() we do d_lookup() again and suddenly find the
597          * dentry, so we call d_revalidate on it, but there is no lock, so
598          * without this code we would return 0, but unpatched real_lookup just
599          * returns -ENOENT in such a case instead of retrying the lookup. Once
600          * this is dealt with in real_lookup(), all of this ugly mess can go and
601          * we can just check locks in ->d_revalidate without doing any RPCs
602          * ever.
603          */

Best Regards,

More information about the lustre-discuss mailing list