autofs: improve ioctl sbi checks
authorIan Kent <raven@themaw.net>
Thu, 3 Jan 2019 23:27:33 +0000 (15:27 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 4 Jan 2019 21:13:46 +0000 (13:13 -0800)
Al Viro made some suggestions to improve the implementation of commit
0633da48f0 ("fix autofs_sbi() does not check super block type").

The check is unnecessary in all cases except for ioctl usage so placing
the check in the super block accessor function adds a small overhead to
the common case where it isn't needed.

So it's sufficient to do this in the ioctl code only.

Also the check in the ioctl code is needlessly complex.

[akpm@linux-foundation.org: declare autofs_fs_type in .h, not .c]
Link: http://lkml.kernel.org/r/154296970987.9889.1597442413573683096.stgit@pluto-themaw-net
Signed-off-by: Ian Kent <raven@themaw.net>
Cc: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/autofs/autofs_i.h
fs/autofs/dev-ioctl.c
fs/autofs/init.c

index 9f9cadbfbd7a34f8005fafb0960b3c60e4848c60..64f693d355ada097aedbeae3b42a2d12609cb0a4 100644 (file)
@@ -42,6 +42,8 @@
 #endif
 #define pr_fmt(fmt) KBUILD_MODNAME ":pid:%d:%s: " fmt, current->pid, __func__
 
+extern struct file_system_type autofs_fs_type;
+
 /*
  * Unified info structure.  This is pointed to by both the dentry and
  * inode structures.  Each file in the filesystem has an instance of this
@@ -126,8 +128,7 @@ struct autofs_sb_info {
 
 static inline struct autofs_sb_info *autofs_sbi(struct super_block *sb)
 {
-       return sb->s_magic != AUTOFS_SUPER_MAGIC ?
-               NULL : (struct autofs_sb_info *)(sb->s_fs_info);
+       return (struct autofs_sb_info *)(sb->s_fs_info);
 }
 
 static inline struct autofs_info *autofs_dentry_ino(struct dentry *dentry)
index 86eafda4a65226ef292f8713c2a86dee48e831ff..752983aafb846bdaa7739f02649e8d0fcef0d877 100644 (file)
@@ -151,22 +151,6 @@ out:
        return err;
 }
 
-/*
- * Get the autofs super block info struct from the file opened on
- * the autofs mount point.
- */
-static struct autofs_sb_info *autofs_dev_ioctl_sbi(struct file *f)
-{
-       struct autofs_sb_info *sbi = NULL;
-       struct inode *inode;
-
-       if (f) {
-               inode = file_inode(f);
-               sbi = autofs_sbi(inode->i_sb);
-       }
-       return sbi;
-}
-
 /* Return autofs dev ioctl version */
 static int autofs_dev_ioctl_version(struct file *fp,
                                    struct autofs_sb_info *sbi,
@@ -658,6 +642,8 @@ static int _autofs_dev_ioctl(unsigned int command,
        if (cmd != AUTOFS_DEV_IOCTL_VERSION_CMD &&
            cmd != AUTOFS_DEV_IOCTL_OPENMOUNT_CMD &&
            cmd != AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD) {
+               struct super_block *sb;
+
                fp = fget(param->ioctlfd);
                if (!fp) {
                        if (cmd == AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD)
@@ -666,12 +652,13 @@ static int _autofs_dev_ioctl(unsigned int command,
                        goto out;
                }
 
-               sbi = autofs_dev_ioctl_sbi(fp);
-               if (!sbi || sbi->magic != AUTOFS_SBI_MAGIC) {
+               sb = file_inode(fp)->i_sb;
+               if (sb->s_type != &autofs_fs_type) {
                        err = -EINVAL;
                        fput(fp);
                        goto out;
                }
+               sbi = autofs_sbi(sb);
 
                /*
                 * Admin needs to be able to set the mount catatonic in
index 79ae07d9592f55cc06a10086cf45453250637d30..c0c1db2cc6ea7aa12ed64b8415b9558b884a0051 100644 (file)
@@ -16,7 +16,7 @@ static struct dentry *autofs_mount(struct file_system_type *fs_type,
        return mount_nodev(fs_type, flags, data, autofs_fill_super);
 }
 
-static struct file_system_type autofs_fs_type = {
+struct file_system_type autofs_fs_type = {
        .owner          = THIS_MODULE,
        .name           = "autofs",
        .mount          = autofs_mount,