procfs has both sets of file operations twice, with and without
->compat_ioctl(), and picks the one with it for entries that have
->proc_compat_ioctl(). That's from commit 778f3dd5a13c ("Fix procfs
compat_ioctl regression") when a file without ->compat_ioctl() went
through the translation tables in fs/compat_ioctl.c and one with it
didn't. Those tables are gone since commit 77b9040195de ("compat_ioctl:
simplify the implementation"). compat_sys_ioctl() answers -ENOTTY for a
file without ->compat_ioctl() now, which is what
proc_reg_compat_ioctl() answers for an entry without
->proc_compat_ioctl().

So always set ->compat_ioctl() and drop the second set of file
operations and the flag that picked it.

No functional changes.

Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 fs/proc/generic.c       |  4 ----
 fs/proc/inode.c         | 45 +++------------------------------------------
 fs/proc/internal.h      |  9 ---------
 include/linux/proc_fs.h |  1 -
 4 files changed, 3 insertions(+), 56 deletions(-)

diff --git a/fs/proc/generic.c b/fs/proc/generic.c
index 23fc026d7bbb..761f9958558f 100644
--- a/fs/proc/generic.c
+++ b/fs/proc/generic.c
@@ -445,10 +445,6 @@ static void pde_set_flags(struct proc_dir_entry *pde)
                pde->flags |= PROC_ENTRY_PERMANENT;
        if (proc_ops->proc_read_iter)
                pde->flags |= PROC_ENTRY_proc_read_iter;
-#ifdef CONFIG_COMPAT
-       if (proc_ops->proc_compat_ioctl)
-               pde->flags |= PROC_ENTRY_proc_compat_ioctl;
-#endif
        if (proc_ops->proc_lseek)
                pde->flags |= PROC_ENTRY_proc_lseek;
 }
diff --git a/fs/proc/inode.c b/fs/proc/inode.c
index 2d65f3c8ec03..18f6490bfe77 100644
--- a/fs/proc/inode.c
+++ b/fs/proc/inode.c
@@ -410,6 +410,8 @@ static long proc_reg_compat_ioctl(struct file *file, 
unsigned int cmd, unsigned
        }
        return rv;
 }
+#else
+#define proc_reg_compat_ioctl NULL
 #endif
 
 static int pde_mmap(struct proc_dir_entry *pde, struct file *file, struct 
vm_area_struct *vma)
@@ -569,6 +571,7 @@ static const struct file_operations proc_reg_file_ops = {
        .write          = proc_reg_write,
        .poll           = proc_reg_poll,
        .unlocked_ioctl = proc_reg_unlocked_ioctl,
+       .compat_ioctl   = proc_reg_compat_ioctl,
        .mmap           = proc_reg_mmap,
        .get_unmapped_area = proc_reg_get_unmapped_area,
 #ifndef CONFIG_MMU
@@ -585,39 +588,6 @@ static const struct file_operations proc_iter_file_ops = {
        .splice_read    = copy_splice_read,
        .poll           = proc_reg_poll,
        .unlocked_ioctl = proc_reg_unlocked_ioctl,
-       .mmap           = proc_reg_mmap,
-       .get_unmapped_area = proc_reg_get_unmapped_area,
-#ifndef CONFIG_MMU
-       .mmap_capabilities = proc_reg_mmap_capabilities,
-#endif
-       .open           = proc_reg_open,
-       .release        = proc_reg_release,
-};
-
-#ifdef CONFIG_COMPAT
-static const struct file_operations proc_reg_file_ops_compat = {
-       .llseek         = proc_reg_llseek,
-       .read           = proc_reg_read,
-       .write          = proc_reg_write,
-       .poll           = proc_reg_poll,
-       .unlocked_ioctl = proc_reg_unlocked_ioctl,
-       .compat_ioctl   = proc_reg_compat_ioctl,
-       .mmap           = proc_reg_mmap,
-       .get_unmapped_area = proc_reg_get_unmapped_area,
-#ifndef CONFIG_MMU
-       .mmap_capabilities = proc_reg_mmap_capabilities,
-#endif
-       .open           = proc_reg_open,
-       .release        = proc_reg_release,
-};
-
-static const struct file_operations proc_iter_file_ops_compat = {
-       .llseek         = proc_reg_llseek,
-       .read_iter      = proc_reg_read_iter,
-       .splice_read    = copy_splice_read,
-       .write          = proc_reg_write,
-       .poll           = proc_reg_poll,
-       .unlocked_ioctl = proc_reg_unlocked_ioctl,
        .compat_ioctl   = proc_reg_compat_ioctl,
        .mmap           = proc_reg_mmap,
        .get_unmapped_area = proc_reg_get_unmapped_area,
@@ -627,7 +597,6 @@ static const struct file_operations 
proc_iter_file_ops_compat = {
        .open           = proc_reg_open,
        .release        = proc_reg_release,
 };
-#endif
 
 static const char *proc_get_link(struct dentry *dentry,
                                 struct inode *inode,
@@ -683,14 +652,6 @@ struct inode *proc_get_inode(struct super_block *sb, 
struct proc_dir_entry *de)
                        inode->i_fop = &proc_iter_file_ops;
                else
                        inode->i_fop = &proc_reg_file_ops;
-#ifdef CONFIG_COMPAT
-               if (pde_has_proc_compat_ioctl(de)) {
-                       if (pde_has_proc_read_iter(de))
-                               inode->i_fop = &proc_iter_file_ops_compat;
-                       else
-                               inode->i_fop = &proc_reg_file_ops_compat;
-               }
-#endif
        } else if (S_ISDIR(inode->i_mode)) {
                inode->i_op = de->proc_iops;
                inode->i_fop = de->proc_dir_ops;
diff --git a/fs/proc/internal.h b/fs/proc/internal.h
index 04f7ce2b24ed..268a0523be12 100644
--- a/fs/proc/internal.h
+++ b/fs/proc/internal.h
@@ -92,15 +92,6 @@ static inline bool pde_has_proc_read_iter(const struct 
proc_dir_entry *pde)
        return pde->flags & PROC_ENTRY_proc_read_iter;
 }
 
-static inline bool pde_has_proc_compat_ioctl(const struct proc_dir_entry *pde)
-{
-#ifdef CONFIG_COMPAT
-       return pde->flags & PROC_ENTRY_proc_compat_ioctl;
-#else
-       return false;
-#endif
-}
-
 static inline bool pde_has_proc_lseek(const struct proc_dir_entry *pde)
 {
        return pde->flags & PROC_ENTRY_proc_lseek;
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
index 47d7deaeed8f..6ad5150020bf 100644
--- a/include/linux/proc_fs.h
+++ b/include/linux/proc_fs.h
@@ -26,7 +26,6 @@ enum {
 #endif
 
        PROC_ENTRY_proc_read_iter       = 1U << 1,
-       PROC_ENTRY_proc_compat_ioctl    = 1U << 2,
        PROC_ENTRY_proc_lseek           = 1U << 3,
 
        PROC_ENTRY_FORCE_LOOKUP         = 1U << 7,

-- 
2.53.0


Reply via email to