fix cdev leak on O_PATH final fput()
[cascardo/linux.git] / fs / namei.c
index 0a601ca..b912b7a 100644 (file)
@@ -753,9 +753,11 @@ follow_link(struct path *link, struct nameidata *nd, void **p)
 
        BUG_ON(nd->flags & LOOKUP_RCU);
 
+       if (link->mnt == nd->path.mnt)
+               mntget(link->mnt);
+
        if (unlikely(current->total_link_count >= 40)) {
                *p = ERR_PTR(-ELOOP); /* no ->put_link(), please */
-               path_put_conditional(link, nd);
                path_put(&nd->path);
                return -ELOOP;
        }
@@ -765,9 +767,6 @@ follow_link(struct path *link, struct nameidata *nd, void **p)
        touch_atime(link->mnt, dentry);
        nd_set_link(nd, NULL);
 
-       if (link->mnt == nd->path.mnt)
-               mntget(link->mnt);
-
        error = security_inode_follow_link(link->dentry, nd);
        if (error) {
                *p = ERR_PTR(error); /* no ->put_link(), please */