aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2006-01-11 16:44:03 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-11 22:04:53 -0500
commit2966387b481a11a90a7bed6600fc17b4253f6980 (patch)
tree69bb1a6cb29ccb6983ff9f2644947da6b537dc17
parentf95190b28daa1bebf78ab5ec4129d01a223982c5 (diff)
[PATCH] x86_64: Implement compat code for sg driver SG_GET_REQUEST_TABLE ioctl
Apparently helps with some non SANE scanner drivers. Cc: axboe@suse.de Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/compat_ioctl.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
index f51696358a21..f0b7256b2f87 100644
--- a/fs/compat_ioctl.c
+++ b/fs/compat_ioctl.c
@@ -916,6 +916,40 @@ static int sg_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
916 return err; 916 return err;
917} 917}
918 918
919struct compat_sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
920 char req_state;
921 char orphan;
922 char sg_io_owned;
923 char problem;
924 int pack_id;
925 compat_uptr_t usr_ptr;
926 unsigned int duration;
927 int unused;
928};
929
930static int sg_grt_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
931{
932 int err, i;
933 sg_req_info_t *r;
934 struct compat_sg_req_info *o = (struct compat_sg_req_info *)arg;
935 r = compat_alloc_user_space(sizeof(sg_req_info_t)*SG_MAX_QUEUE);
936 err = sys_ioctl(fd,cmd,(unsigned long)r);
937 if (err < 0)
938 return err;
939 for (i = 0; i < SG_MAX_QUEUE; i++) {
940 void __user *ptr;
941 int d;
942
943 if (copy_in_user(o + i, r + i, offsetof(sg_req_info_t, usr_ptr)) ||
944 get_user(ptr, &r[i].usr_ptr) ||
945 get_user(d, &r[i].duration) ||
946 put_user((u32)(unsigned long)(ptr), &o[i].usr_ptr) ||
947 put_user(d, &o[i].duration))
948 return -EFAULT;
949 }
950 return err;
951}
952
919struct sock_fprog32 { 953struct sock_fprog32 {
920 unsigned short len; 954 unsigned short len;
921 compat_caddr_t filter; 955 compat_caddr_t filter;
@@ -2794,6 +2828,7 @@ HANDLE_IOCTL(FDPOLLDRVSTAT32, fd_ioctl_trans)
2794HANDLE_IOCTL(FDGETFDCSTAT32, fd_ioctl_trans) 2828HANDLE_IOCTL(FDGETFDCSTAT32, fd_ioctl_trans)
2795HANDLE_IOCTL(FDWERRORGET32, fd_ioctl_trans) 2829HANDLE_IOCTL(FDWERRORGET32, fd_ioctl_trans)
2796HANDLE_IOCTL(SG_IO,sg_ioctl_trans) 2830HANDLE_IOCTL(SG_IO,sg_ioctl_trans)
2831HANDLE_IOCTL(SG_GET_REQUEST_TABLE, sg_grt_trans)
2797HANDLE_IOCTL(PPPIOCGIDLE32, ppp_ioctl_trans) 2832HANDLE_IOCTL(PPPIOCGIDLE32, ppp_ioctl_trans)
2798HANDLE_IOCTL(PPPIOCSCOMPRESS32, ppp_ioctl_trans) 2833HANDLE_IOCTL(PPPIOCSCOMPRESS32, ppp_ioctl_trans)
2799HANDLE_IOCTL(PPPIOCSPASS32, ppp_sock_fprog_ioctl_trans) 2834HANDLE_IOCTL(PPPIOCSPASS32, ppp_sock_fprog_ioctl_trans)