binfmt_misc: ->s_root is not going anywhere
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 29 May 2016 23:14:03 +0000 (19:14 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 29 May 2016 23:14:03 +0000 (19:14 -0400)
... no need to dget/dput it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/binfmt_misc.c

index 3a3ced779fc738199cb5bb3d25a8f8c76edc754d..5417516f6e59ea0556dc2005a17a9d7d5069b264 100644 (file)
@@ -637,13 +637,12 @@ static ssize_t bm_entry_write(struct file *file, const char __user *buffer,
                break;
        case 3:
                /* Delete this handler. */
-               root = dget(file->f_path.dentry->d_sb->s_root);
+               root = file_inode(file)->i_sb->s_root;
                inode_lock(d_inode(root));
 
                kill_node(e);
 
                inode_unlock(d_inode(root));
-               dput(root);
                break;
        default:
                return res;
@@ -665,8 +664,8 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer,
 {
        Node *e;
        struct inode *inode;
-       struct dentry *root, *dentry;
-       struct super_block *sb = file->f_path.dentry->d_sb;
+       struct super_block *sb = file_inode(file)->i_sb;
+       struct dentry *root = sb->s_root, *dentry;
        int err = 0;
 
        e = create_entry(buffer, count);
@@ -674,7 +673,6 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer,
        if (IS_ERR(e))
                return PTR_ERR(e);
 
-       root = dget(sb->s_root);
        inode_lock(d_inode(root));
        dentry = lookup_one_len(e->name, root, strlen(e->name));
        err = PTR_ERR(dentry);
@@ -712,7 +710,6 @@ out2:
        dput(dentry);
 out:
        inode_unlock(d_inode(root));
-       dput(root);
 
        if (err) {
                kfree(e);
@@ -753,14 +750,13 @@ static ssize_t bm_status_write(struct file *file, const char __user *buffer,
                break;
        case 3:
                /* Delete all handlers. */
-               root = dget(file->f_path.dentry->d_sb->s_root);
+               root = file_inode(file)->i_sb->s_root;
                inode_lock(d_inode(root));
 
                while (!list_empty(&entries))
                        kill_node(list_entry(entries.next, Node, list));
 
                inode_unlock(d_inode(root));
-               dput(root);
                break;
        default:
                return res;