4
4
#include <linux/cdrom.h>
5
5
#include <linux/compat.h>
6
6
#include <linux/elevator.h>
7
- #include <linux/fd.h>
8
7
#include <linux/hdreg.h>
9
8
#include <linux/slab.h>
10
9
#include <linux/syscalls.h>
@@ -209,318 +208,6 @@ static int compat_blkpg_ioctl(struct block_device *bdev, fmode_t mode,
209
208
#define BLKBSZSET_32 _IOW(0x12, 113, int)
210
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
211
static int compat_blkdev_driver_ioctl (struct block_device * bdev , fmode_t mode ,
525
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
224
case HDIO_GET_ADDRESS :
538
225
case HDIO_GET_BUSSTATE :
539
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
227
case CDROMREADAUDIO :
551
228
return compat_cdrom_read_audio (bdev , mode , cmd , arg );
552
229
case CDROM_SEND_PACKET :
@@ -566,23 +243,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
566
243
case HDIO_DRIVE_CMD :
567
244
/* 0x330 is reserved -- it used to be HDIO_GETGEO_BIG */
568
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
246
/* CDROM stuff */
587
247
case CDROMPAUSE :
588
248
case CDROMRESUME :
0 commit comments