Skip to content

Commit 229b53c

Browse files
author
Al Viro
committed
take floppy compat ioctls to sodding floppy.c
all other drivers recognizing those ioctls are very much *not* biarch. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent e5f699d commit 229b53c

File tree

2 files changed

+328
-340
lines changed

2 files changed

+328
-340
lines changed

block/compat_ioctl.c

Lines changed: 0 additions & 340 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <linux/cdrom.h>
55
#include <linux/compat.h>
66
#include <linux/elevator.h>
7-
#include <linux/fd.h>
87
#include <linux/hdreg.h>
98
#include <linux/slab.h>
109
#include <linux/syscalls.h>
@@ -209,318 +208,6 @@ static int compat_blkpg_ioctl(struct block_device *bdev, fmode_t mode,
209208
#define BLKBSZSET_32 _IOW(0x12, 113, int)
210209
#define BLKGETSIZE64_32 _IOR(0x12, 114, int)
211210

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-
524211
static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
525212
unsigned cmd, unsigned long arg)
526213
{
@@ -537,16 +224,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
537224
case HDIO_GET_ADDRESS:
538225
case HDIO_GET_BUSSTATE:
539226
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);
550227
case CDROMREADAUDIO:
551228
return compat_cdrom_read_audio(bdev, mode, cmd, arg);
552229
case CDROM_SEND_PACKET:
@@ -566,23 +243,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
566243
case HDIO_DRIVE_CMD:
567244
/* 0x330 is reserved -- it used to be HDIO_GETGEO_BIG */
568245
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:
586246
/* CDROM stuff */
587247
case CDROMPAUSE:
588248
case CDROMRESUME:

0 commit comments

Comments
 (0)