Commit b3087cc4f31a66c8c7b63419e913ed9d34145f10
Committed by
Jens Axboe
1 parent
18cf7f8723
Exists in
master
and in
4 other branches
compat_ioctl: move cdrom handlers to block/compat_ioctl.c
These are shared by all cd-rom drivers and should have common handlers. Do slight cosmetic cleanups in the process. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Showing 2 changed files with 83 additions and 105 deletions Side-by-side Diff
block/compat_ioctl.c
... | ... | @@ -92,6 +92,84 @@ |
92 | 92 | return error; |
93 | 93 | } |
94 | 94 | |
95 | +struct compat_cdrom_read_audio { | |
96 | + union cdrom_addr addr; | |
97 | + u8 addr_format; | |
98 | + compat_int_t nframes; | |
99 | + compat_caddr_t buf; | |
100 | +}; | |
101 | + | |
102 | +struct compat_cdrom_generic_command { | |
103 | + unsigned char cmd[CDROM_PACKET_SIZE]; | |
104 | + compat_caddr_t buffer; | |
105 | + compat_uint_t buflen; | |
106 | + compat_int_t stat; | |
107 | + compat_caddr_t sense; | |
108 | + unsigned char data_direction; | |
109 | + compat_int_t quiet; | |
110 | + compat_int_t timeout; | |
111 | + compat_caddr_t reserved[1]; | |
112 | +}; | |
113 | + | |
114 | +static int compat_cdrom_read_audio(struct inode *inode, struct file *file, | |
115 | + struct gendisk *disk, unsigned int cmd, unsigned long arg) | |
116 | +{ | |
117 | + struct cdrom_read_audio __user *cdread_audio; | |
118 | + struct compat_cdrom_read_audio __user *cdread_audio32; | |
119 | + __u32 data; | |
120 | + void __user *datap; | |
121 | + | |
122 | + cdread_audio = compat_alloc_user_space(sizeof(*cdread_audio)); | |
123 | + cdread_audio32 = compat_ptr(arg); | |
124 | + | |
125 | + if (copy_in_user(&cdread_audio->addr, | |
126 | + &cdread_audio32->addr, | |
127 | + (sizeof(*cdread_audio32) - | |
128 | + sizeof(compat_caddr_t)))) | |
129 | + return -EFAULT; | |
130 | + | |
131 | + if (get_user(data, &cdread_audio32->buf)) | |
132 | + return -EFAULT; | |
133 | + datap = compat_ptr(data); | |
134 | + if (put_user(datap, &cdread_audio->buf)) | |
135 | + return -EFAULT; | |
136 | + | |
137 | + return blkdev_driver_ioctl(inode, file, disk, cmd, | |
138 | + (unsigned long)cdread_audio); | |
139 | +} | |
140 | + | |
141 | +static int compat_cdrom_generic_command(struct inode *inode, struct file *file, | |
142 | + struct gendisk *disk, unsigned int cmd, unsigned long arg) | |
143 | +{ | |
144 | + struct cdrom_generic_command __user *cgc; | |
145 | + struct compat_cdrom_generic_command __user *cgc32; | |
146 | + u32 data; | |
147 | + unsigned char dir; | |
148 | + int itmp; | |
149 | + | |
150 | + cgc = compat_alloc_user_space(sizeof(*cgc)); | |
151 | + cgc32 = compat_ptr(arg); | |
152 | + | |
153 | + if (copy_in_user(&cgc->cmd, &cgc32->cmd, sizeof(cgc->cmd)) || | |
154 | + get_user(data, &cgc32->buffer) || | |
155 | + put_user(compat_ptr(data), &cgc->buffer) || | |
156 | + copy_in_user(&cgc->buflen, &cgc32->buflen, | |
157 | + (sizeof(unsigned int) + sizeof(int))) || | |
158 | + get_user(data, &cgc32->sense) || | |
159 | + put_user(compat_ptr(data), &cgc->sense) || | |
160 | + get_user(dir, &cgc32->data_direction) || | |
161 | + put_user(dir, &cgc->data_direction) || | |
162 | + get_user(itmp, &cgc32->quiet) || | |
163 | + put_user(itmp, &cgc->quiet) || | |
164 | + get_user(itmp, &cgc32->timeout) || | |
165 | + put_user(itmp, &cgc->timeout) || | |
166 | + get_user(data, &cgc32->reserved[0]) || | |
167 | + put_user(compat_ptr(data), &cgc->reserved[0])) | |
168 | + return -EFAULT; | |
169 | + | |
170 | + return blkdev_driver_ioctl(inode, file, disk, cmd, (unsigned long)cgc); | |
171 | +} | |
172 | + | |
95 | 173 | struct compat_blkpg_ioctl_arg { |
96 | 174 | compat_int_t op; |
97 | 175 | compat_int_t flags; |
... | ... | @@ -190,6 +268,11 @@ |
190 | 268 | case HDIO_GET_ADDRESS: |
191 | 269 | case HDIO_GET_BUSSTATE: |
192 | 270 | return compat_hdio_ioctl(inode, file, disk, cmd, arg); |
271 | + case CDROMREADAUDIO: | |
272 | + return compat_cdrom_read_audio(inode, file, disk, cmd, arg); | |
273 | + case CDROM_SEND_PACKET: | |
274 | + return compat_cdrom_generic_command(inode, file, disk, cmd, arg); | |
275 | + | |
193 | 276 | /* |
194 | 277 | * No handler required for the ones below, we just need to |
195 | 278 | * convert arg to a 64 bit pointer. |
fs/compat_ioctl.c
... | ... | @@ -37,7 +37,6 @@ |
37 | 37 | #include <linux/if_ppp.h> |
38 | 38 | #include <linux/if_pppox.h> |
39 | 39 | #include <linux/mtio.h> |
40 | -#include <linux/cdrom.h> | |
41 | 40 | #include <linux/auto_fs.h> |
42 | 41 | #include <linux/auto_fs4.h> |
43 | 42 | #include <linux/tty.h> |
... | ... | @@ -1039,108 +1038,6 @@ |
1039 | 1038 | return err ? -EFAULT: 0; |
1040 | 1039 | } |
1041 | 1040 | |
1042 | -struct cdrom_read_audio32 { | |
1043 | - union cdrom_addr addr; | |
1044 | - u8 addr_format; | |
1045 | - compat_int_t nframes; | |
1046 | - compat_caddr_t buf; | |
1047 | -}; | |
1048 | - | |
1049 | -struct cdrom_generic_command32 { | |
1050 | - unsigned char cmd[CDROM_PACKET_SIZE]; | |
1051 | - compat_caddr_t buffer; | |
1052 | - compat_uint_t buflen; | |
1053 | - compat_int_t stat; | |
1054 | - compat_caddr_t sense; | |
1055 | - unsigned char data_direction; | |
1056 | - compat_int_t quiet; | |
1057 | - compat_int_t timeout; | |
1058 | - compat_caddr_t reserved[1]; | |
1059 | -}; | |
1060 | - | |
1061 | -static int cdrom_do_read_audio(unsigned int fd, unsigned int cmd, unsigned long arg) | |
1062 | -{ | |
1063 | - struct cdrom_read_audio __user *cdread_audio; | |
1064 | - struct cdrom_read_audio32 __user *cdread_audio32; | |
1065 | - __u32 data; | |
1066 | - void __user *datap; | |
1067 | - | |
1068 | - cdread_audio = compat_alloc_user_space(sizeof(*cdread_audio)); | |
1069 | - cdread_audio32 = compat_ptr(arg); | |
1070 | - | |
1071 | - if (copy_in_user(&cdread_audio->addr, | |
1072 | - &cdread_audio32->addr, | |
1073 | - (sizeof(*cdread_audio32) - | |
1074 | - sizeof(compat_caddr_t)))) | |
1075 | - return -EFAULT; | |
1076 | - | |
1077 | - if (get_user(data, &cdread_audio32->buf)) | |
1078 | - return -EFAULT; | |
1079 | - datap = compat_ptr(data); | |
1080 | - if (put_user(datap, &cdread_audio->buf)) | |
1081 | - return -EFAULT; | |
1082 | - | |
1083 | - return sys_ioctl(fd, cmd, (unsigned long) cdread_audio); | |
1084 | -} | |
1085 | - | |
1086 | -static int cdrom_do_generic_command(unsigned int fd, unsigned int cmd, unsigned long arg) | |
1087 | -{ | |
1088 | - struct cdrom_generic_command __user *cgc; | |
1089 | - struct cdrom_generic_command32 __user *cgc32; | |
1090 | - u32 data; | |
1091 | - unsigned char dir; | |
1092 | - int itmp; | |
1093 | - | |
1094 | - cgc = compat_alloc_user_space(sizeof(*cgc)); | |
1095 | - cgc32 = compat_ptr(arg); | |
1096 | - | |
1097 | - if (copy_in_user(&cgc->cmd, &cgc32->cmd, sizeof(cgc->cmd)) || | |
1098 | - get_user(data, &cgc32->buffer) || | |
1099 | - put_user(compat_ptr(data), &cgc->buffer) || | |
1100 | - copy_in_user(&cgc->buflen, &cgc32->buflen, | |
1101 | - (sizeof(unsigned int) + sizeof(int))) || | |
1102 | - get_user(data, &cgc32->sense) || | |
1103 | - put_user(compat_ptr(data), &cgc->sense) || | |
1104 | - get_user(dir, &cgc32->data_direction) || | |
1105 | - put_user(dir, &cgc->data_direction) || | |
1106 | - get_user(itmp, &cgc32->quiet) || | |
1107 | - put_user(itmp, &cgc->quiet) || | |
1108 | - get_user(itmp, &cgc32->timeout) || | |
1109 | - put_user(itmp, &cgc->timeout) || | |
1110 | - get_user(data, &cgc32->reserved[0]) || | |
1111 | - put_user(compat_ptr(data), &cgc->reserved[0])) | |
1112 | - return -EFAULT; | |
1113 | - | |
1114 | - return sys_ioctl(fd, cmd, (unsigned long) cgc); | |
1115 | -} | |
1116 | - | |
1117 | -static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) | |
1118 | -{ | |
1119 | - int err; | |
1120 | - | |
1121 | - switch(cmd) { | |
1122 | - case CDROMREADAUDIO: | |
1123 | - err = cdrom_do_read_audio(fd, cmd, arg); | |
1124 | - break; | |
1125 | - | |
1126 | - case CDROM_SEND_PACKET: | |
1127 | - err = cdrom_do_generic_command(fd, cmd, arg); | |
1128 | - break; | |
1129 | - | |
1130 | - default: | |
1131 | - do { | |
1132 | - static int count; | |
1133 | - if (++count <= 20) | |
1134 | - printk("cdrom_ioctl: Unknown cmd fd(%d) " | |
1135 | - "cmd(%08x) arg(%08x)\n", | |
1136 | - (int)fd, (unsigned int)cmd, (unsigned int)arg); | |
1137 | - } while(0); | |
1138 | - err = -EINVAL; | |
1139 | - break; | |
1140 | - }; | |
1141 | - | |
1142 | - return err; | |
1143 | -} | |
1144 | 1041 | #endif /* CONFIG_BLOCK */ |
1145 | 1042 | |
1146 | 1043 | #ifdef CONFIG_VT |
... | ... | @@ -3147,8 +3044,6 @@ |
3147 | 3044 | #ifdef CONFIG_BLOCK |
3148 | 3045 | HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans) |
3149 | 3046 | HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans) |
3150 | -HANDLE_IOCTL(CDROMREADAUDIO, cdrom_ioctl_trans) | |
3151 | -HANDLE_IOCTL(CDROM_SEND_PACKET, cdrom_ioctl_trans) | |
3152 | 3047 | #endif |
3153 | 3048 | #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int) |
3154 | 3049 | HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout) |