Merge tag 'sound-5.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[sfrench/cifs-2.6.git] / fs / file_table.c
index 155d7514a0943d729f43f7f4560ab9e50fa7a60a..3f9c1b452c1d9e8b732730315fe8a3d3232336f3 100644 (file)
@@ -255,6 +255,7 @@ static void __fput(struct file *file)
        struct dentry *dentry = file->f_path.dentry;
        struct vfsmount *mnt = file->f_path.mnt;
        struct inode *inode = file->f_inode;
+       fmode_t mode = file->f_mode;
 
        if (unlikely(!(file->f_mode & FMODE_OPENED)))
                goto out;
@@ -277,18 +278,20 @@ static void __fput(struct file *file)
        if (file->f_op->release)
                file->f_op->release(inode, file);
        if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL &&
-                    !(file->f_mode & FMODE_PATH))) {
+                    !(mode & FMODE_PATH))) {
                cdev_put(inode->i_cdev);
        }
        fops_put(file->f_op);
        put_pid(file->f_owner.pid);
-       if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
+       if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
                i_readcount_dec(inode);
-       if (file->f_mode & FMODE_WRITER) {
+       if (mode & FMODE_WRITER) {
                put_write_access(inode);
                __mnt_drop_write(mnt);
        }
        dput(dentry);
+       if (unlikely(mode & FMODE_NEED_UNMOUNT))
+               dissolve_on_fput(mnt);
        mntput(mnt);
 out:
        file_free(file);