LINUX 5.9: Remove HAVE_UNLOCKED_IOCTL/COMPAT_IOCTL
[openafs.git] / src / afs / LINUX / osi_ioctl.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11  * Linux module support routines.
12  *
13  */
14 #include <afsconfig.h>
15 #include "afs/param.h"
16
17
18 #include <linux/module.h> /* early to avoid printf->printk mapping */
19 #include "afs/sysincludes.h"
20 #include "afsincludes.h"
21 #include <linux/unistd.h>               /* For syscall numbers. */
22 #include <linux/mm.h>
23
24 #ifdef AFS_AMD64_LINUX20_ENV
25 #include <asm/ia32_unistd.h>
26 #endif
27
28 #include <linux/slab.h>
29 #include <linux/init.h>
30 #include <linux/sched.h>
31 #include <linux/kernel.h>
32
33 #include "osi_compat.h"
34
35 extern struct proc_dir_entry *openafs_procfs;
36
37 extern asmlinkage long
38 afs_syscall(long syscall, long parm1, long parm2, long parm3, long parm4);
39
40 static int
41 afs_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
42           unsigned long arg)
43 {
44
45     struct afsprocdata sysargs;
46 #ifdef NEED_IOCTL32
47     struct afsprocdata32 sysargs32;
48 #endif
49
50     if (cmd != VIOC_SYSCALL && cmd != VIOC_SYSCALL32) return -EINVAL;
51
52 #ifdef NEED_IOCTL32
53 # if defined(AFS_S390X_LINUX26_ENV)
54     if (test_thread_flag(TIF_31BIT))
55 # elif defined(AFS_AMD64_LINUX20_ENV)
56     if (test_thread_flag(TIF_IA32))
57 # else
58     if (test_thread_flag(TIF_32BIT))
59 # endif /* AFS_S390X_LINUX26_ENV */
60     {
61         if (copy_from_user(&sysargs32, (void *)arg,
62                            sizeof(struct afsprocdata32)))
63             return -EFAULT;
64
65         return afs_syscall((unsigned long)sysargs32.syscall,
66                            (unsigned long)sysargs32.param1,
67                            (unsigned long)sysargs32.param2,
68                            (unsigned long)sysargs32.param3,
69                            (unsigned long)sysargs32.param4);
70     } else
71 #endif /* NEED_IOCTL32 */
72     {
73         if (copy_from_user(&sysargs, (void *)arg, sizeof(struct afsprocdata)))
74             return -EFAULT;
75
76         return afs_syscall(sysargs.syscall, sysargs.param1,
77                            sysargs.param2, sysargs.param3, sysargs.param4);
78     }
79 }
80
81 static long afs_unlocked_ioctl(struct file *file, unsigned int cmd,
82                                unsigned long arg) {
83     return afs_ioctl(FILE_INODE(file), file, cmd, arg);
84 }
85
86 #if defined(HAVE_LINUX_STRUCT_PROC_OPS)
87 static struct proc_ops afs_syscall_ops = {
88     .proc_ioctl = afs_unlocked_ioctl,
89 # ifdef STRUCT_PROC_OPS_HAS_PROC_COMPAT_IOCTL
90     .proc_compat_ioctl = afs_unlocked_ioctl,
91 # endif
92 };
93 #else
94 static struct file_operations afs_syscall_ops = {
95     .unlocked_ioctl = afs_unlocked_ioctl,
96     .compat_ioctl = afs_unlocked_ioctl,
97 };
98 #endif /* HAVE_LINUX_STRUCT_PROC_OPS */
99
100 void
101 osi_ioctl_init(void)
102 {
103     struct proc_dir_entry *entry;
104
105     entry = afs_proc_create(PROC_SYSCALL_NAME, 0666, openafs_procfs, &afs_syscall_ops);
106 #if defined(STRUCT_PROC_DIR_ENTRY_HAS_OWNER)
107     if (entry)
108         entry->owner = THIS_MODULE;
109 #endif
110
111 }
112
113 void
114 osi_ioctl_clean(void)
115 {
116     remove_proc_entry(PROC_SYSCALL_NAME, openafs_procfs);
117 }