diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/compat_ioctl.c | 340 |
1 files changed, 0 insertions, 340 deletions
diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index 04325b81c2b4..696e0cdd2df1 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c | |||
@@ -4,7 +4,6 @@ | |||
4 | #include <linux/cdrom.h> | 4 | #include <linux/cdrom.h> |
5 | #include <linux/compat.h> | 5 | #include <linux/compat.h> |
6 | #include <linux/elevator.h> | 6 | #include <linux/elevator.h> |
7 | #include <linux/fd.h> | ||
8 | #include <linux/hdreg.h> | 7 | #include <linux/hdreg.h> |
9 | #include <linux/slab.h> | 8 | #include <linux/slab.h> |
10 | #include <linux/syscalls.h> | 9 | #include <linux/syscalls.h> |
@@ -209,318 +208,6 @@ static int compat_blkpg_ioctl(struct block_device *bdev, fmode_t mode, | |||
209 | #define BLKBSZSET_32 _IOW(0x12, 113, int) | 208 | #define BLKBSZSET_32 _IOW(0x12, 113, int) |
210 | #define BLKGETSIZE64_32 _IOR(0x12, 114, int) | 209 | #define BLKGETSIZE64_32 _IOR(0x12, 114, int) |
211 | 210 | ||
212 | struct compat_floppy_drive_params { | ||
213 | char cmos; | ||
214 | compat_ulong_t max_dtr; | ||
215 | compat_ulong_t hlt; | ||
216 | compat_ulong_t hut; | ||
217 | compat_ulong_t srt; | ||
218 | compat_ulong_t spinup; | ||
219 | compat_ulong_t spindown; | ||
220 | unsigned char spindown_offset; | ||
221 | unsigned char select_delay; | ||
222 | unsigned char rps; | ||
223 | unsigned char tracks; | ||
224 | compat_ulong_t timeout; | ||
225 | unsigned char interleave_sect; | ||
226 | struct floppy_max_errors max_errors; | ||
227 | char flags; | ||
228 | char read_track; | ||
229 | short autodetect[8]; | ||
230 | compat_int_t checkfreq; | ||
231 | compat_int_t native_format; | ||
232 | }; | ||
233 | |||
234 | struct compat_floppy_drive_struct { | ||
235 | signed char flags; | ||
236 | compat_ulong_t spinup_date; | ||
237 | compat_ulong_t select_date; | ||
238 | compat_ulong_t first_read_date; | ||
239 | short probed_format; | ||
240 | short track; | ||
241 | short maxblock; | ||
242 | short maxtrack; | ||
243 | compat_int_t generation; | ||
244 | compat_int_t keep_data; | ||
245 | compat_int_t fd_ref; | ||
246 | compat_int_t fd_device; | ||
247 | compat_int_t last_checked; | ||
248 | compat_caddr_t dmabuf; | ||
249 | compat_int_t bufblocks; | ||
250 | }; | ||
251 | |||
252 | struct compat_floppy_fdc_state { | ||
253 | compat_int_t spec1; | ||
254 | compat_int_t spec2; | ||
255 | compat_int_t dtr; | ||
256 | unsigned char version; | ||
257 | unsigned char dor; | ||
258 | compat_ulong_t address; | ||
259 | unsigned int rawcmd:2; | ||
260 | unsigned int reset:1; | ||
261 | unsigned int need_configure:1; | ||
262 | unsigned int perp_mode:2; | ||
263 | unsigned int has_fifo:1; | ||
264 | unsigned int driver_version; | ||
265 | unsigned char track[4]; | ||
266 | }; | ||
267 | |||
268 | struct compat_floppy_write_errors { | ||
269 | unsigned int write_errors; | ||
270 | compat_ulong_t first_error_sector; | ||
271 | compat_int_t first_error_generation; | ||
272 | compat_ulong_t last_error_sector; | ||
273 | compat_int_t last_error_generation; | ||
274 | compat_uint_t badness; | ||
275 | }; | ||
276 | |||
277 | #define FDSETPRM32 _IOW(2, 0x42, struct compat_floppy_struct) | ||
278 | #define FDDEFPRM32 _IOW(2, 0x43, struct compat_floppy_struct) | ||
279 | #define FDSETDRVPRM32 _IOW(2, 0x90, struct compat_floppy_drive_params) | ||
280 | #define FDGETDRVPRM32 _IOR(2, 0x11, struct compat_floppy_drive_params) | ||
281 | #define FDGETDRVSTAT32 _IOR(2, 0x12, struct compat_floppy_drive_struct) | ||
282 | #define FDPOLLDRVSTAT32 _IOR(2, 0x13, struct compat_floppy_drive_struct) | ||
283 | #define FDGETFDCSTAT32 _IOR(2, 0x15, struct compat_floppy_fdc_state) | ||
284 | #define FDWERRORGET32 _IOR(2, 0x17, struct compat_floppy_write_errors) | ||
285 | |||
286 | static struct { | ||
287 | unsigned int cmd32; | ||
288 | unsigned int cmd; | ||
289 | } fd_ioctl_trans_table[] = { | ||
290 | { FDSETPRM32, FDSETPRM }, | ||
291 | { FDDEFPRM32, FDDEFPRM }, | ||
292 | { FDGETPRM32, FDGETPRM }, | ||
293 | { FDSETDRVPRM32, FDSETDRVPRM }, | ||
294 | { FDGETDRVPRM32, FDGETDRVPRM }, | ||
295 | { FDGETDRVSTAT32, FDGETDRVSTAT }, | ||
296 | { FDPOLLDRVSTAT32, FDPOLLDRVSTAT }, | ||
297 | { FDGETFDCSTAT32, FDGETFDCSTAT }, | ||
298 | { FDWERRORGET32, FDWERRORGET } | ||
299 | }; | ||
300 | |||
301 | #define NR_FD_IOCTL_TRANS ARRAY_SIZE(fd_ioctl_trans_table) | ||
302 | |||
303 | static int compat_fd_ioctl(struct block_device *bdev, fmode_t mode, | ||
304 | unsigned int cmd, unsigned long arg) | ||
305 | { | ||
306 | mm_segment_t old_fs = get_fs(); | ||
307 | void *karg = NULL; | ||
308 | unsigned int kcmd = 0; | ||
309 | int i, err; | ||
310 | |||
311 | for (i = 0; i < NR_FD_IOCTL_TRANS; i++) | ||
312 | if (cmd == fd_ioctl_trans_table[i].cmd32) { | ||
313 | kcmd = fd_ioctl_trans_table[i].cmd; | ||
314 | break; | ||
315 | } | ||
316 | if (!kcmd) | ||
317 | return -EINVAL; | ||
318 | |||
319 | switch (cmd) { | ||
320 | case FDSETPRM32: | ||
321 | case FDDEFPRM32: | ||
322 | case FDGETPRM32: | ||
323 | { | ||
324 | compat_uptr_t name; | ||
325 | struct compat_floppy_struct __user *uf; | ||
326 | struct floppy_struct *f; | ||
327 | |||
328 | uf = compat_ptr(arg); | ||
329 | f = karg = kmalloc(sizeof(struct floppy_struct), GFP_KERNEL); | ||
330 | if (!karg) | ||
331 | return -ENOMEM; | ||
332 | if (cmd == FDGETPRM32) | ||
333 | break; | ||
334 | err = __get_user(f->size, &uf->size); | ||
335 | err |= __get_user(f->sect, &uf->sect); | ||
336 | err |= __get_user(f->head, &uf->head); | ||
337 | err |= __get_user(f->track, &uf->track); | ||
338 | err |= __get_user(f->stretch, &uf->stretch); | ||
339 | err |= __get_user(f->gap, &uf->gap); | ||
340 | err |= __get_user(f->rate, &uf->rate); | ||
341 | err |= __get_user(f->spec1, &uf->spec1); | ||
342 | err |= __get_user(f->fmt_gap, &uf->fmt_gap); | ||
343 | err |= __get_user(name, &uf->name); | ||
344 | f->name = compat_ptr(name); | ||
345 | if (err) { | ||
346 | err = -EFAULT; | ||
347 | goto out; | ||
348 | } | ||
349 | break; | ||
350 | } | ||
351 | case FDSETDRVPRM32: | ||
352 | case FDGETDRVPRM32: | ||
353 | { | ||
354 | struct compat_floppy_drive_params __user *uf; | ||
355 | struct floppy_drive_params *f; | ||
356 | |||
357 | uf = compat_ptr(arg); | ||
358 | f = karg = kmalloc(sizeof(struct floppy_drive_params), GFP_KERNEL); | ||
359 | if (!karg) | ||
360 | return -ENOMEM; | ||
361 | if (cmd == FDGETDRVPRM32) | ||
362 | break; | ||
363 | err = __get_user(f->cmos, &uf->cmos); | ||
364 | err |= __get_user(f->max_dtr, &uf->max_dtr); | ||
365 | err |= __get_user(f->hlt, &uf->hlt); | ||
366 | err |= __get_user(f->hut, &uf->hut); | ||
367 | err |= __get_user(f->srt, &uf->srt); | ||
368 | err |= __get_user(f->spinup, &uf->spinup); | ||
369 | err |= __get_user(f->spindown, &uf->spindown); | ||
370 | err |= __get_user(f->spindown_offset, &uf->spindown_offset); | ||
371 | err |= __get_user(f->select_delay, &uf->select_delay); | ||
372 | err |= __get_user(f->rps, &uf->rps); | ||
373 | err |= __get_user(f->tracks, &uf->tracks); | ||
374 | err |= __get_user(f->timeout, &uf->timeout); | ||
375 | err |= __get_user(f->interleave_sect, &uf->interleave_sect); | ||
376 | err |= __copy_from_user(&f->max_errors, &uf->max_errors, sizeof(f->max_errors)); | ||
377 | err |= __get_user(f->flags, &uf->flags); | ||
378 | err |= __get_user(f->read_track, &uf->read_track); | ||
379 | err |= __copy_from_user(f->autodetect, uf->autodetect, sizeof(f->autodetect)); | ||
380 | err |= __get_user(f->checkfreq, &uf->checkfreq); | ||
381 | err |= __get_user(f->native_format, &uf->native_format); | ||
382 | if (err) { | ||
383 | err = -EFAULT; | ||
384 | goto out; | ||
385 | } | ||
386 | break; | ||
387 | } | ||
388 | case FDGETDRVSTAT32: | ||
389 | case FDPOLLDRVSTAT32: | ||
390 | karg = kmalloc(sizeof(struct floppy_drive_struct), GFP_KERNEL); | ||
391 | if (!karg) | ||
392 | return -ENOMEM; | ||
393 | break; | ||
394 | case FDGETFDCSTAT32: | ||
395 | karg = kmalloc(sizeof(struct floppy_fdc_state), GFP_KERNEL); | ||
396 | if (!karg) | ||
397 | return -ENOMEM; | ||
398 | break; | ||
399 | case FDWERRORGET32: | ||
400 | karg = kmalloc(sizeof(struct floppy_write_errors), GFP_KERNEL); | ||
401 | if (!karg) | ||
402 | return -ENOMEM; | ||
403 | break; | ||
404 | default: | ||
405 | return -EINVAL; | ||
406 | } | ||
407 | set_fs(KERNEL_DS); | ||
408 | err = __blkdev_driver_ioctl(bdev, mode, kcmd, (unsigned long)karg); | ||
409 | set_fs(old_fs); | ||
410 | if (err) | ||
411 | goto out; | ||
412 | switch (cmd) { | ||
413 | case FDGETPRM32: | ||
414 | { | ||
415 | struct floppy_struct *f = karg; | ||
416 | struct compat_floppy_struct __user *uf = compat_ptr(arg); | ||
417 | |||
418 | err = __put_user(f->size, &uf->size); | ||
419 | err |= __put_user(f->sect, &uf->sect); | ||
420 | err |= __put_user(f->head, &uf->head); | ||
421 | err |= __put_user(f->track, &uf->track); | ||
422 | err |= __put_user(f->stretch, &uf->stretch); | ||
423 | err |= __put_user(f->gap, &uf->gap); | ||
424 | err |= __put_user(f->rate, &uf->rate); | ||
425 | err |= __put_user(f->spec1, &uf->spec1); | ||
426 | err |= __put_user(f->fmt_gap, &uf->fmt_gap); | ||
427 | err |= __put_user((u64)f->name, (compat_caddr_t __user *)&uf->name); | ||
428 | break; | ||
429 | } | ||
430 | case FDGETDRVPRM32: | ||
431 | { | ||
432 | struct compat_floppy_drive_params __user *uf; | ||
433 | struct floppy_drive_params *f = karg; | ||
434 | |||
435 | uf = compat_ptr(arg); | ||
436 | err = __put_user(f->cmos, &uf->cmos); | ||
437 | err |= __put_user(f->max_dtr, &uf->max_dtr); | ||
438 | err |= __put_user(f->hlt, &uf->hlt); | ||
439 | err |= __put_user(f->hut, &uf->hut); | ||
440 | err |= __put_user(f->srt, &uf->srt); | ||
441 | err |= __put_user(f->spinup, &uf->spinup); | ||
442 | err |= __put_user(f->spindown, &uf->spindown); | ||
443 | err |= __put_user(f->spindown_offset, &uf->spindown_offset); | ||
444 | err |= __put_user(f->select_delay, &uf->select_delay); | ||
445 | err |= __put_user(f->rps, &uf->rps); | ||
446 | err |= __put_user(f->tracks, &uf->tracks); | ||
447 | err |= __put_user(f->timeout, &uf->timeout); | ||
448 | err |= __put_user(f->interleave_sect, &uf->interleave_sect); | ||
449 | err |= __copy_to_user(&uf->max_errors, &f->max_errors, sizeof(f->max_errors)); | ||
450 | err |= __put_user(f->flags, &uf->flags); | ||
451 | err |= __put_user(f->read_track, &uf->read_track); | ||
452 | err |= __copy_to_user(uf->autodetect, f->autodetect, sizeof(f->autodetect)); | ||
453 | err |= __put_user(f->checkfreq, &uf->checkfreq); | ||
454 | err |= __put_user(f->native_format, &uf->native_format); | ||
455 | break; | ||
456 | } | ||
457 | case FDGETDRVSTAT32: | ||
458 | case FDPOLLDRVSTAT32: | ||
459 | { | ||
460 | struct compat_floppy_drive_struct __user *uf; | ||
461 | struct floppy_drive_struct *f = karg; | ||
462 | |||
463 | uf = compat_ptr(arg); | ||
464 | err = __put_user(f->flags, &uf->flags); | ||
465 | err |= __put_user(f->spinup_date, &uf->spinup_date); | ||
466 | err |= __put_user(f->select_date, &uf->select_date); | ||
467 | err |= __put_user(f->first_read_date, &uf->first_read_date); | ||
468 | err |= __put_user(f->probed_format, &uf->probed_format); | ||
469 | err |= __put_user(f->track, &uf->track); | ||
470 | err |= __put_user(f->maxblock, &uf->maxblock); | ||
471 | err |= __put_user(f->maxtrack, &uf->maxtrack); | ||
472 | err |= __put_user(f->generation, &uf->generation); | ||
473 | err |= __put_user(f->keep_data, &uf->keep_data); | ||
474 | err |= __put_user(f->fd_ref, &uf->fd_ref); | ||
475 | err |= __put_user(f->fd_device, &uf->fd_device); | ||
476 | err |= __put_user(f->last_checked, &uf->last_checked); | ||
477 | err |= __put_user((u64)f->dmabuf, &uf->dmabuf); | ||
478 | err |= __put_user((u64)f->bufblocks, &uf->bufblocks); | ||
479 | break; | ||
480 | } | ||
481 | case FDGETFDCSTAT32: | ||
482 | { | ||
483 | struct compat_floppy_fdc_state __user *uf; | ||
484 | struct floppy_fdc_state *f = karg; | ||
485 | |||
486 | uf = compat_ptr(arg); | ||
487 | err = __put_user(f->spec1, &uf->spec1); | ||
488 | err |= __put_user(f->spec2, &uf->spec2); | ||
489 | err |= __put_user(f->dtr, &uf->dtr); | ||
490 | err |= __put_user(f->version, &uf->version); | ||
491 | err |= __put_user(f->dor, &uf->dor); | ||
492 | err |= __put_user(f->address, &uf->address); | ||
493 | err |= __copy_to_user((char __user *)&uf->address + sizeof(uf->address), | ||
494 | (char *)&f->address + sizeof(f->address), sizeof(int)); | ||
495 | err |= __put_user(f->driver_version, &uf->driver_version); | ||
496 | err |= __copy_to_user(uf->track, f->track, sizeof(f->track)); | ||
497 | break; | ||
498 | } | ||
499 | case FDWERRORGET32: | ||
500 | { | ||
501 | struct compat_floppy_write_errors __user *uf; | ||
502 | struct floppy_write_errors *f = karg; | ||
503 | |||
504 | uf = compat_ptr(arg); | ||
505 | err = __put_user(f->write_errors, &uf->write_errors); | ||
506 | err |= __put_user(f->first_error_sector, &uf->first_error_sector); | ||
507 | err |= __put_user(f->first_error_generation, &uf->first_error_generation); | ||
508 | err |= __put_user(f->last_error_sector, &uf->last_error_sector); | ||
509 | err |= __put_user(f->last_error_generation, &uf->last_error_generation); | ||
510 | err |= __put_user(f->badness, &uf->badness); | ||
511 | break; | ||
512 | } | ||
513 | default: | ||
514 | break; | ||
515 | } | ||
516 | if (err) | ||
517 | err = -EFAULT; | ||
518 | |||
519 | out: | ||
520 | kfree(karg); | ||
521 | return err; | ||
522 | } | ||
523 | |||
524 | static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, | 211 | static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, |
525 | unsigned cmd, unsigned long arg) | 212 | unsigned cmd, unsigned long arg) |
526 | { | 213 | { |
@@ -537,16 +224,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, | |||
537 | case HDIO_GET_ADDRESS: | 224 | case HDIO_GET_ADDRESS: |
538 | case HDIO_GET_BUSSTATE: | 225 | case HDIO_GET_BUSSTATE: |
539 | return compat_hdio_ioctl(bdev, mode, cmd, arg); | 226 | return compat_hdio_ioctl(bdev, mode, cmd, arg); |
540 | case FDSETPRM32: | ||
541 | case FDDEFPRM32: | ||
542 | case FDGETPRM32: | ||
543 | case FDSETDRVPRM32: | ||
544 | case FDGETDRVPRM32: | ||
545 | case FDGETDRVSTAT32: | ||
546 | case FDPOLLDRVSTAT32: | ||
547 | case FDGETFDCSTAT32: | ||
548 | case FDWERRORGET32: | ||
549 | return compat_fd_ioctl(bdev, mode, cmd, arg); | ||
550 | case CDROMREADAUDIO: | 227 | case CDROMREADAUDIO: |
551 | return compat_cdrom_read_audio(bdev, mode, cmd, arg); | 228 | return compat_cdrom_read_audio(bdev, mode, cmd, arg); |
552 | case CDROM_SEND_PACKET: | 229 | case CDROM_SEND_PACKET: |
@@ -566,23 +243,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, | |||
566 | case HDIO_DRIVE_CMD: | 243 | case HDIO_DRIVE_CMD: |
567 | /* 0x330 is reserved -- it used to be HDIO_GETGEO_BIG */ | 244 | /* 0x330 is reserved -- it used to be HDIO_GETGEO_BIG */ |
568 | case 0x330: | 245 | case 0x330: |
569 | /* 0x02 -- Floppy ioctls */ | ||
570 | case FDMSGON: | ||
571 | case FDMSGOFF: | ||
572 | case FDSETEMSGTRESH: | ||
573 | case FDFLUSH: | ||
574 | case FDWERRORCLR: | ||
575 | case FDSETMAXERRS: | ||
576 | case FDGETMAXERRS: | ||
577 | case FDGETDRVTYP: | ||
578 | case FDEJECT: | ||
579 | case FDCLRPRM: | ||
580 | case FDFMTBEG: | ||
581 | case FDFMTEND: | ||
582 | case FDRESET: | ||
583 | case FDTWADDLE: | ||
584 | case FDFMTTRK: | ||
585 | case FDRAWCMD: | ||
586 | /* CDROM stuff */ | 246 | /* CDROM stuff */ |
587 | case CDROMPAUSE: | 247 | case CDROMPAUSE: |
588 | case CDROMRESUME: | 248 | case CDROMRESUME: |