linux: Fix leaked dentry reference in the revalidate op
authorMarc Dionne <marc.dionne@your-file-system.com>
Wed, 24 Apr 2013 13:11:09 +0000 (09:11 -0400)
committerDerrick Brashear <shadow@your-file-system.com>
Mon, 20 May 2013 18:29:43 +0000 (11:29 -0700)
In one error case, we exit the function without release the
reference on the parent dentry.  This dangling reference can cause
an oops when the client is shut down.

Change-Id: I1632b581f6e7a557bb54a999dc1837c31b8381bf
Reviewed-on: http://gerrit.openafs.org/9802
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>

src/afs/LINUX/osi_vnodeops.c

index cc6775d..ca7fe85 100644 (file)
@@ -1134,6 +1134,7 @@ afs_linux_dentry_revalidate(struct dentry *dp, int flags)
                    code = afs_EvalFakeStat(&vcp, &fakestate, &treq);
                if ((tryEvalOnly && vcp->mvstat == 1) || code) {
                    /* a mount point, not yet replaced by its directory */
+                   dput(parent);
                    goto bad_dentry;
                }
            }
@@ -1150,8 +1151,10 @@ afs_linux_dentry_revalidate(struct dentry *dp, int flags)
         * always require a crref() which would be "slow".
         */
        if (vcp->last_looker != treq.uid) {
-           if (!afs_AccessOK(vcp, (vType(vcp) == VREG) ? PRSFS_READ : PRSFS_LOOKUP, &treq, CHECK_MODE_BITS))
+           if (!afs_AccessOK(vcp, (vType(vcp) == VREG) ? PRSFS_READ : PRSFS_LOOKUP, &treq, CHECK_MODE_BITS)) {
+               dput(parent);
                goto bad_dentry;
+           }
 
            vcp->last_looker = treq.uid;
        }