Message ID | 1378579561-26868-5-git-send-email-bfields@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, Sep 07, 2013 at 02:46:01PM -0400, J. Bruce Fields wrote: > From: "J. Bruce Fields" <bfields@redhat.com> > > DCACHE_DISCONNECTED should not be cleared until we're sure the dentry is > connected all the way up to the root of the filesystem. It *shouldn't* > be cleared as soon as the dentry is connected to a parent. That will > cause bugs at least on exportable filesystems. Then you probably want this if (!IS_ROOT(pd)) { /* must have found a connected parent - great */ spin_lock(&pd->d_lock); pd->d_flags &= ~DCACHE_DISCONNECTED; spin_unlock(&pd->d_lock); noprogress = 0; to go through all intermediates, clearing DCACHE_DISCONNECTED on all of them; O(depth^2) can suck when we have a long chain of directories... -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Sep 09, 2013 at 01:46:47AM +0100, Al Viro wrote: > On Sat, Sep 07, 2013 at 02:46:01PM -0400, J. Bruce Fields wrote: > > From: "J. Bruce Fields" <bfields@redhat.com> > > > > DCACHE_DISCONNECTED should not be cleared until we're sure the dentry is > > connected all the way up to the root of the filesystem. It *shouldn't* > > be cleared as soon as the dentry is connected to a parent. That will > > cause bugs at least on exportable filesystems. > > Then you probably want this > if (!IS_ROOT(pd)) { > /* must have found a connected parent - great */ > spin_lock(&pd->d_lock); > pd->d_flags &= ~DCACHE_DISCONNECTED; > spin_unlock(&pd->d_lock); > noprogress = 0; > to go through all intermediates, clearing DCACHE_DISCONNECTED on all of > them; O(depth^2) can suck when we have a long chain of directories... Aka call reconnect_path() from fs/exportfs/expfs.c on it. -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/dcache.c b/fs/dcache.c index a53f55d..a4560ca 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -2404,7 +2404,6 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon) spin_unlock(&dentry->d_lock); /* anon->d_lock still locked, returns locked */ - anon->d_flags &= ~DCACHE_DISCONNECTED; } /**