diff options
-rw-r--r-- | block/compat_ioctl.c | 70 | ||||
-rw-r--r-- | fs/compat_ioctl.c | 60 |
2 files changed, 70 insertions, 60 deletions
diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index 219b7e76e8ad..5c6dafaad938 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c | |||
@@ -36,6 +36,62 @@ static int compat_put_u64(unsigned long arg, u64 val) | |||
36 | return put_user(val, (compat_u64 __user *)compat_ptr(arg)); | 36 | return put_user(val, (compat_u64 __user *)compat_ptr(arg)); |
37 | } | 37 | } |
38 | 38 | ||
39 | struct compat_hd_geometry { | ||
40 | unsigned char heads; | ||
41 | unsigned char sectors; | ||
42 | unsigned short cylinders; | ||
43 | u32 start; | ||
44 | }; | ||
45 | |||
46 | static int compat_hdio_getgeo(struct gendisk *disk, struct block_device *bdev, | ||
47 | struct compat_hd_geometry __user *ugeo) | ||
48 | { | ||
49 | struct hd_geometry geo; | ||
50 | int ret; | ||
51 | |||
52 | if (!ugeo) | ||
53 | return -EINVAL; | ||
54 | if (!disk->fops->getgeo) | ||
55 | return -ENOTTY; | ||
56 | |||
57 | /* | ||
58 | * We need to set the startsect first, the driver may | ||
59 | * want to override it. | ||
60 | */ | ||
61 | geo.start = get_start_sect(bdev); | ||
62 | ret = disk->fops->getgeo(bdev, &geo); | ||
63 | if (ret) | ||
64 | return ret; | ||
65 | |||
66 | ret = copy_to_user(ugeo, &geo, 4); | ||
67 | ret |= __put_user(geo.start, &ugeo->start); | ||
68 | if (ret) | ||
69 | ret = -EFAULT; | ||
70 | |||
71 | return ret; | ||
72 | } | ||
73 | |||
74 | static int compat_hdio_ioctl(struct inode *inode, struct file *file, | ||
75 | struct gendisk *disk, unsigned int cmd, unsigned long arg) | ||
76 | { | ||
77 | mm_segment_t old_fs = get_fs(); | ||
78 | unsigned long kval; | ||
79 | unsigned int __user *uvp; | ||
80 | int error; | ||
81 | |||
82 | set_fs(KERNEL_DS); | ||
83 | error = blkdev_driver_ioctl(inode, file, disk, | ||
84 | cmd, (unsigned long)(&kval)); | ||
85 | set_fs(old_fs); | ||
86 | |||
87 | if (error == 0) { | ||
88 | uvp = compat_ptr(arg); | ||
89 | if (put_user(kval, uvp)) | ||
90 | error = -EFAULT; | ||
91 | } | ||
92 | return error; | ||
93 | } | ||
94 | |||
39 | #define BLKBSZGET_32 _IOR(0x12, 112, int) | 95 | #define BLKBSZGET_32 _IOR(0x12, 112, int) |
40 | #define BLKBSZSET_32 _IOW(0x12, 113, int) | 96 | #define BLKBSZSET_32 _IOW(0x12, 113, int) |
41 | #define BLKGETSIZE64_32 _IOR(0x12, 114, int) | 97 | #define BLKGETSIZE64_32 _IOR(0x12, 114, int) |
@@ -93,6 +149,18 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file, | |||
93 | int ret; | 149 | int ret; |
94 | 150 | ||
95 | switch (arg) { | 151 | switch (arg) { |
152 | case HDIO_GET_UNMASKINTR: | ||
153 | case HDIO_GET_MULTCOUNT: | ||
154 | case HDIO_GET_KEEPSETTINGS: | ||
155 | case HDIO_GET_32BIT: | ||
156 | case HDIO_GET_NOWERR: | ||
157 | case HDIO_GET_DMA: | ||
158 | case HDIO_GET_NICE: | ||
159 | case HDIO_GET_WCACHE: | ||
160 | case HDIO_GET_ACOUSTIC: | ||
161 | case HDIO_GET_ADDRESS: | ||
162 | case HDIO_GET_BUSSTATE: | ||
163 | return compat_hdio_ioctl(inode, file, disk, cmd, arg); | ||
96 | /* | 164 | /* |
97 | * No handler required for the ones below, we just need to | 165 | * No handler required for the ones below, we just need to |
98 | * convert arg to a 64 bit pointer. | 166 | * convert arg to a 64 bit pointer. |
@@ -266,6 +334,8 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) | |||
266 | struct gendisk *disk = bdev->bd_disk; | 334 | struct gendisk *disk = bdev->bd_disk; |
267 | 335 | ||
268 | switch (cmd) { | 336 | switch (cmd) { |
337 | case HDIO_GETGEO: | ||
338 | return compat_hdio_getgeo(disk, bdev, compat_ptr(arg)); | ||
269 | case BLKFLSBUF: | 339 | case BLKFLSBUF: |
270 | case BLKROSET: | 340 | case BLKROSET: |
271 | /* | 341 | /* |
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index 71065603a581..e6a94714b1b0 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/if.h> | 21 | #include <linux/if.h> |
22 | #include <linux/if_bridge.h> | 22 | #include <linux/if_bridge.h> |
23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
24 | #include <linux/hdreg.h> | ||
25 | #include <linux/raid/md.h> | 24 | #include <linux/raid/md.h> |
26 | #include <linux/kd.h> | 25 | #include <linux/kd.h> |
27 | #include <linux/dirent.h> | 26 | #include <linux/dirent.h> |
@@ -667,53 +666,6 @@ out: | |||
667 | #endif | 666 | #endif |
668 | 667 | ||
669 | #ifdef CONFIG_BLOCK | 668 | #ifdef CONFIG_BLOCK |
670 | struct hd_geometry32 { | ||
671 | unsigned char heads; | ||
672 | unsigned char sectors; | ||
673 | unsigned short cylinders; | ||
674 | u32 start; | ||
675 | }; | ||
676 | |||
677 | static int hdio_getgeo(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
678 | { | ||
679 | mm_segment_t old_fs = get_fs(); | ||
680 | struct hd_geometry geo; | ||
681 | struct hd_geometry32 __user *ugeo; | ||
682 | int err; | ||
683 | |||
684 | set_fs (KERNEL_DS); | ||
685 | err = sys_ioctl(fd, HDIO_GETGEO, (unsigned long)&geo); | ||
686 | set_fs (old_fs); | ||
687 | ugeo = compat_ptr(arg); | ||
688 | if (!err) { | ||
689 | err = copy_to_user (ugeo, &geo, 4); | ||
690 | err |= __put_user (geo.start, &ugeo->start); | ||
691 | if (err) | ||
692 | err = -EFAULT; | ||
693 | } | ||
694 | return err; | ||
695 | } | ||
696 | |||
697 | static int hdio_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
698 | { | ||
699 | mm_segment_t old_fs = get_fs(); | ||
700 | unsigned long kval; | ||
701 | unsigned int __user *uvp; | ||
702 | int error; | ||
703 | |||
704 | set_fs(KERNEL_DS); | ||
705 | error = sys_ioctl(fd, cmd, (long)&kval); | ||
706 | set_fs(old_fs); | ||
707 | |||
708 | if(error == 0) { | ||
709 | uvp = compat_ptr(arg); | ||
710 | if(put_user(kval, uvp)) | ||
711 | error = -EFAULT; | ||
712 | } | ||
713 | return error; | ||
714 | } | ||
715 | |||
716 | |||
717 | typedef struct sg_io_hdr32 { | 669 | typedef struct sg_io_hdr32 { |
718 | compat_int_t interface_id; /* [i] 'S' for SCSI generic (required) */ | 670 | compat_int_t interface_id; /* [i] 'S' for SCSI generic (required) */ |
719 | compat_int_t dxfer_direction; /* [i] data transfer direction */ | 671 | compat_int_t dxfer_direction; /* [i] data transfer direction */ |
@@ -3208,19 +3160,7 @@ HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp) | |||
3208 | HANDLE_IOCTL(SIOCGSTAMPNS, do_siocgstampns) | 3160 | HANDLE_IOCTL(SIOCGSTAMPNS, do_siocgstampns) |
3209 | #endif | 3161 | #endif |
3210 | #ifdef CONFIG_BLOCK | 3162 | #ifdef CONFIG_BLOCK |
3211 | HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo) | ||
3212 | HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans) | 3163 | HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans) |
3213 | HANDLE_IOCTL(HDIO_GET_UNMASKINTR, hdio_ioctl_trans) | ||
3214 | HANDLE_IOCTL(HDIO_GET_MULTCOUNT, hdio_ioctl_trans) | ||
3215 | HANDLE_IOCTL(HDIO_GET_KEEPSETTINGS, hdio_ioctl_trans) | ||
3216 | HANDLE_IOCTL(HDIO_GET_32BIT, hdio_ioctl_trans) | ||
3217 | HANDLE_IOCTL(HDIO_GET_NOWERR, hdio_ioctl_trans) | ||
3218 | HANDLE_IOCTL(HDIO_GET_DMA, hdio_ioctl_trans) | ||
3219 | HANDLE_IOCTL(HDIO_GET_NICE, hdio_ioctl_trans) | ||
3220 | HANDLE_IOCTL(HDIO_GET_WCACHE, hdio_ioctl_trans) | ||
3221 | HANDLE_IOCTL(HDIO_GET_ACOUSTIC, hdio_ioctl_trans) | ||
3222 | HANDLE_IOCTL(HDIO_GET_ADDRESS, hdio_ioctl_trans) | ||
3223 | HANDLE_IOCTL(HDIO_GET_BUSSTATE, hdio_ioctl_trans) | ||
3224 | HANDLE_IOCTL(FDSETPRM32, fd_ioctl_trans) | 3164 | HANDLE_IOCTL(FDSETPRM32, fd_ioctl_trans) |
3225 | HANDLE_IOCTL(FDDEFPRM32, fd_ioctl_trans) | 3165 | HANDLE_IOCTL(FDDEFPRM32, fd_ioctl_trans) |
3226 | HANDLE_IOCTL(FDGETPRM32, fd_ioctl_trans) | 3166 | HANDLE_IOCTL(FDGETPRM32, fd_ioctl_trans) |