]> Git Repo - linux.git/blobdiff - fs/compat_ioctl.c
Merge branch 'for-linus' into for-next
[linux.git] / fs / compat_ioctl.c
index d537888f36608186fd757c4ec9f483f1349461e8..358ea2ecf36b2abfc300a94c9488755390d16d7d 100644 (file)
 
 #include <linux/sort.h>
 
-static int do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
-       int err;
-
-       err = security_file_ioctl(file, cmd, arg);
-       if (err)
-               return err;
-
-       return vfs_ioctl(file, cmd, arg);
-}
-
-#ifdef CONFIG_BLOCK
-struct compat_sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
-       char req_state;
-       char orphan;
-       char sg_io_owned;
-       char problem;
-       int pack_id;
-       compat_uptr_t usr_ptr;
-       unsigned int duration;
-       int unused;
-};
-
-static int sg_grt_trans(struct file *file,
-               unsigned int cmd, struct compat_sg_req_info __user *o)
-{
-       int err, i;
-       sg_req_info_t __user *r;
-       r = compat_alloc_user_space(sizeof(sg_req_info_t)*SG_MAX_QUEUE);
-       err = do_ioctl(file, cmd, (unsigned long)r);
-       if (err < 0)
-               return err;
-       for (i = 0; i < SG_MAX_QUEUE; i++) {
-               void __user *ptr;
-               int d;
-
-               if (copy_in_user(o + i, r + i, offsetof(sg_req_info_t, usr_ptr)) ||
-                   get_user(ptr, &r[i].usr_ptr) ||
-                   get_user(d, &r[i].duration) ||
-                   put_user((u32)(unsigned long)(ptr), &o[i].usr_ptr) ||
-                   put_user(d, &o[i].duration))
-                       return -EFAULT;
-       }
-       return err;
-}
-#endif /* CONFIG_BLOCK */
-
-struct sock_fprog32 {
-       unsigned short  len;
-       compat_caddr_t  filter;
-};
-
-#define PPPIOCSPASS32  _IOW('t', 71, struct sock_fprog32)
-#define PPPIOCSACTIVE32        _IOW('t', 70, struct sock_fprog32)
-
-static int ppp_sock_fprog_ioctl_trans(struct file *file,
-               unsigned int cmd, struct sock_fprog32 __user *u_fprog32)
-{
-       struct sock_fprog __user *u_fprog64 = compat_alloc_user_space(sizeof(struct sock_fprog));
-       void __user *fptr64;
-       u32 fptr32;
-       u16 flen;
-
-       if (get_user(flen, &u_fprog32->len) ||
-           get_user(fptr32, &u_fprog32->filter))
-               return -EFAULT;
-
-       fptr64 = compat_ptr(fptr32);
-
-       if (put_user(flen, &u_fprog64->len) ||
-           put_user(fptr64, &u_fprog64->filter))
-               return -EFAULT;
-
-       if (cmd == PPPIOCSPASS32)
-               cmd = PPPIOCSPASS;
-       else
-               cmd = PPPIOCSACTIVE;
-
-       return do_ioctl(file, cmd, (unsigned long) u_fprog64);
-}
-
-struct ppp_option_data32 {
-       compat_caddr_t  ptr;
-       u32                     length;
-       compat_int_t            transmit;
-};
-#define PPPIOCSCOMPRESS32      _IOW('t', 77, struct ppp_option_data32)
-
-struct ppp_idle32 {
-       compat_time_t xmit_idle;
-       compat_time_t recv_idle;
-};
-#define PPPIOCGIDLE32          _IOR('t', 63, struct ppp_idle32)
-
-static int ppp_gidle(struct file *file, unsigned int cmd,
-               struct ppp_idle32 __user *idle32)
-{
-       struct ppp_idle __user *idle;
-       __kernel_time_t xmit, recv;
-       int err;
-
-       idle = compat_alloc_user_space(sizeof(*idle));
-
-       err = do_ioctl(file, PPPIOCGIDLE, (unsigned long) idle);
-
-       if (!err) {
-               if (get_user(xmit, &idle->xmit_idle) ||
-                   get_user(recv, &idle->recv_idle) ||
-                   put_user(xmit, &idle32->xmit_idle) ||
-                   put_user(recv, &idle32->recv_idle))
-                       err = -EFAULT;
-       }
-       return err;
-}
-
-static int ppp_scompress(struct file *file, unsigned int cmd,
-       struct ppp_option_data32 __user *odata32)
-{
-       struct ppp_option_data __user *odata;
-       __u32 data;
-       void __user *datap;
-
-       odata = compat_alloc_user_space(sizeof(*odata));
-
-       if (get_user(data, &odata32->ptr))
-               return -EFAULT;
-
-       datap = compat_ptr(data);
-       if (put_user(datap, &odata->ptr))
-               return -EFAULT;
-
-       if (copy_in_user(&odata->length, &odata32->length,
-                        sizeof(__u32) + sizeof(int)))
-               return -EFAULT;
-
-       return do_ioctl(file, PPPIOCSCOMPRESS, (unsigned long) odata);
-}
-
 /*
  * simple reversible transform to make our table more evenly
  * distributed after sorting.
@@ -212,6 +74,7 @@ COMPATIBLE_IOCTL(SCSI_IOCTL_GET_PCI)
 #ifdef CONFIG_BLOCK
 /* SG stuff */
 COMPATIBLE_IOCTL(SG_IO)
+COMPATIBLE_IOCTL(SG_GET_REQUEST_TABLE)
 COMPATIBLE_IOCTL(SG_SET_TIMEOUT)
 COMPATIBLE_IOCTL(SG_GET_TIMEOUT)
 COMPATIBLE_IOCTL(SG_EMULATED_HOST)
@@ -235,37 +98,6 @@ COMPATIBLE_IOCTL(SG_GET_REQUEST_TABLE)
 COMPATIBLE_IOCTL(SG_SET_KEEP_ORPHAN)
 COMPATIBLE_IOCTL(SG_GET_KEEP_ORPHAN)
 #endif
-/* PPP stuff */
-COMPATIBLE_IOCTL(PPPIOCGFLAGS)
-COMPATIBLE_IOCTL(PPPIOCSFLAGS)
-COMPATIBLE_IOCTL(PPPIOCGASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCSASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCGUNIT)
-COMPATIBLE_IOCTL(PPPIOCGRASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCSRASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCGMRU)
-COMPATIBLE_IOCTL(PPPIOCSMRU)
-COMPATIBLE_IOCTL(PPPIOCSMAXCID)
-COMPATIBLE_IOCTL(PPPIOCGXASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCSXASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCXFERUNIT)
-/* PPPIOCSCOMPRESS is translated */
-COMPATIBLE_IOCTL(PPPIOCGNPMODE)
-COMPATIBLE_IOCTL(PPPIOCSNPMODE)
-COMPATIBLE_IOCTL(PPPIOCGDEBUG)
-COMPATIBLE_IOCTL(PPPIOCSDEBUG)
-/* PPPIOCSPASS is translated */
-/* PPPIOCSACTIVE is translated */
-/* PPPIOCGIDLE is translated */
-COMPATIBLE_IOCTL(PPPIOCNEWUNIT)
-COMPATIBLE_IOCTL(PPPIOCATTACH)
-COMPATIBLE_IOCTL(PPPIOCDETACH)
-COMPATIBLE_IOCTL(PPPIOCSMRRU)
-COMPATIBLE_IOCTL(PPPIOCCONNECT)
-COMPATIBLE_IOCTL(PPPIOCDISCONN)
-COMPATIBLE_IOCTL(PPPIOCATTCHAN)
-COMPATIBLE_IOCTL(PPPIOCGCHAN)
-COMPATIBLE_IOCTL(PPPIOCGL2TPSTATS)
 };
 
 /*
@@ -278,27 +110,12 @@ COMPATIBLE_IOCTL(PPPIOCGL2TPSTATS)
 static long do_ioctl_trans(unsigned int cmd,
                 unsigned long arg, struct file *file)
 {
-       void __user *argp = compat_ptr(arg);
-
-       switch (cmd) {
-       case PPPIOCGIDLE32:
-               return ppp_gidle(file, cmd, argp);
-       case PPPIOCSCOMPRESS32:
-               return ppp_scompress(file, cmd, argp);
-       case PPPIOCSPASS32:
-       case PPPIOCSACTIVE32:
-               return ppp_sock_fprog_ioctl_trans(file, cmd, argp);
-#ifdef CONFIG_BLOCK
-       case SG_GET_REQUEST_TABLE:
-               return sg_grt_trans(file, cmd, argp);
-#endif
-       }
-
        return -ENOIOCTLCMD;
 }
 
 static int compat_ioctl_check_table(unsigned int xcmd)
 {
+#ifdef CONFIG_BLOCK
        int i;
        const int max = ARRAY_SIZE(ioctl_pointer) - 1;
 
@@ -317,6 +134,9 @@ static int compat_ioctl_check_table(unsigned int xcmd)
                i--;
 
        return ioctl_pointer[i] == xcmd;
+#else
+       return 0;
+#endif
 }
 
 COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd,
@@ -365,15 +185,27 @@ COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd,
        /* handled by some ->ioctl(); always a pointer to int */
        case FIONREAD:
                goto found_handler;
-       /* these two get messy on amd64 due to alignment differences */
+       /* these get messy on amd64 due to alignment differences */
 #if defined(CONFIG_X86_64)
        case FS_IOC_RESVSP_32:
        case FS_IOC_RESVSP64_32:
-               error = compat_ioctl_preallocate(f.file, compat_ptr(arg));
+               error = compat_ioctl_preallocate(f.file, 0, compat_ptr(arg));
+               goto out_fput;
+       case FS_IOC_UNRESVSP_32:
+       case FS_IOC_UNRESVSP64_32:
+               error = compat_ioctl_preallocate(f.file, FALLOC_FL_PUNCH_HOLE,
+                               compat_ptr(arg));
+               goto out_fput;
+       case FS_IOC_ZERO_RANGE_32:
+               error = compat_ioctl_preallocate(f.file, FALLOC_FL_ZERO_RANGE,
+                               compat_ptr(arg));
                goto out_fput;
 #else
        case FS_IOC_RESVSP:
        case FS_IOC_RESVSP64:
+       case FS_IOC_UNRESVSP:
+       case FS_IOC_UNRESVSP64:
+       case FS_IOC_ZERO_RANGE:
                goto found_handler;
 #endif
 
This page took 0.031178 seconds and 4 git commands to generate.