Merge branch 'for-3.17/core' of git://git.kernel.dk/linux-block
[firefly-linux-kernel-4.4.55.git] / fs / dcache.c
index 85a2aad3dcb32a87579c3d043a0308a71ec07d17..d30ce699ae4b6ea4ac3ad1b8ec955fa271bdcb16 100644 (file)
@@ -1775,7 +1775,7 @@ struct dentry *d_find_any_alias(struct inode *inode)
 }
 EXPORT_SYMBOL(d_find_any_alias);
 
-struct dentry *__d_obtain_alias(struct inode *inode, int disconnected)
+static struct dentry *__d_obtain_alias(struct inode *inode, int disconnected)
 {
        static const struct qstr anonstring = QSTR_INIT("/", 1);
        struct dentry *tmp;
@@ -2706,6 +2706,11 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
                                dput(new);
                                return ERR_PTR(-EIO);
                        }
+                       if (d_ancestor(new, dentry)) {
+                               spin_unlock(&inode->i_lock);
+                               dput(new);
+                               return ERR_PTR(-EIO);
+                       }
                        write_seqlock(&rename_lock);
                        __d_materialise_dentry(dentry, new);
                        write_sequnlock(&rename_lock);