diff options
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index fc2faa44f8d1..2355bddad8de 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -291,9 +291,9 @@ struct dentry * dget_locked(struct dentry *dentry) | |||
291 | * it can be unhashed only if it has no children, or if it is the root | 291 | * it can be unhashed only if it has no children, or if it is the root |
292 | * of a filesystem. | 292 | * of a filesystem. |
293 | * | 293 | * |
294 | * If the inode has a DCACHE_DISCONNECTED alias, then prefer | 294 | * If the inode has an IS_ROOT, DCACHE_DISCONNECTED alias, then prefer |
295 | * any other hashed alias over that one unless @want_discon is set, | 295 | * any other hashed alias over that one unless @want_discon is set, |
296 | * in which case only return a DCACHE_DISCONNECTED alias. | 296 | * in which case only return an IS_ROOT, DCACHE_DISCONNECTED alias. |
297 | */ | 297 | */ |
298 | 298 | ||
299 | static struct dentry * __d_find_alias(struct inode *inode, int want_discon) | 299 | static struct dentry * __d_find_alias(struct inode *inode, int want_discon) |
@@ -309,7 +309,8 @@ static struct dentry * __d_find_alias(struct inode *inode, int want_discon) | |||
309 | prefetch(next); | 309 | prefetch(next); |
310 | alias = list_entry(tmp, struct dentry, d_alias); | 310 | alias = list_entry(tmp, struct dentry, d_alias); |
311 | if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) { | 311 | if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) { |
312 | if (alias->d_flags & DCACHE_DISCONNECTED) | 312 | if (IS_ROOT(alias) && |
313 | (alias->d_flags & DCACHE_DISCONNECTED)) | ||
313 | discon_alias = alias; | 314 | discon_alias = alias; |
314 | else if (!want_discon) { | 315 | else if (!want_discon) { |
315 | __dget_locked(alias); | 316 | __dget_locked(alias); |
@@ -1004,7 +1005,7 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry) | |||
1004 | { | 1005 | { |
1005 | struct dentry *new = NULL; | 1006 | struct dentry *new = NULL; |
1006 | 1007 | ||
1007 | if (inode) { | 1008 | if (inode && S_ISDIR(inode->i_mode)) { |
1008 | spin_lock(&dcache_lock); | 1009 | spin_lock(&dcache_lock); |
1009 | new = __d_find_alias(inode, 1); | 1010 | new = __d_find_alias(inode, 1); |
1010 | if (new) { | 1011 | if (new) { |