LINUX: Avoid duplicate mntget in afs_linux_raw_open
authorAndrew Deason <adeason@sinenomine.net>
Wed, 17 Apr 2013 06:33:07 +0000 (01:33 -0500)
committerDerrick Brashear <shadow@your-file-system.com>
Wed, 17 Apr 2013 12:36:27 +0000 (05:36 -0700)
In the unlikely event that our afs_dentry_open call fails with
cache_creds, we call afs_dentry_open again with the current creds as a
fallback. However, we call mntget on afs_cacheMnt for each call. So if
we actually hit the second call, we'll have added 2 refs to
afs_cacheMnt, but we only actually opened one file, causing a slight
overcount on afs_cacheMnt refs.

To avoid this, just call mntget once, before any of the
dentry_open-related calls.

Change-Id: I7ec3e8c193dd7782ab629fb5d7615d83f8385b6c
Reviewed-on: http://gerrit.openafs.org/9791
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Marc Dionne <marc.c.dionne@gmail.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>

src/afs/LINUX/osi_file.c

index eacffca..b48bf1a 100644 (file)
@@ -54,13 +54,17 @@ afs_linux_raw_open(afs_dcache_id_t *ainode)
     tip = dp->d_inode;
     tip->i_flags |= S_NOATIME; /* Disable updating access times. */
 
+    /* note that if this is ever changed to recover from errors, we will need
+     * to put this reference back */
+    mntget(afs_cacheMnt);
+
 #if defined(STRUCT_TASK_STRUCT_HAS_CRED)
     /* Use stashed credentials - prevent selinux/apparmor problems  */
-    filp = afs_dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, cache_creds);
+    filp = afs_dentry_open(dp, afs_cacheMnt, O_RDWR, cache_creds);
     if (IS_ERR(filp))
-       filp = afs_dentry_open(dp, mntget(afs_cacheMnt), O_RDWR, current_cred());
+       filp = afs_dentry_open(dp, afs_cacheMnt, O_RDWR, current_cred());
 #else
-    filp = dentry_open(dp, mntget(afs_cacheMnt), O_RDWR);
+    filp = dentry_open(dp, afs_cacheMnt, O_RDWR);
 #endif
     if (IS_ERR(filp))
        osi_Panic("Can't open file: %d\n", (int) PTR_ERR(filp));