|
@@ -31,6 +31,7 @@
|
|
|
#include <linux/skbuff.h>
|
|
|
#include <linux/netlink.h>
|
|
|
#include <linux/vt.h>
|
|
|
+#include <linux/falloc.h>
|
|
|
#include <linux/fs.h>
|
|
|
#include <linux/file.h>
|
|
|
#include <linux/ppp_defs.h>
|
|
@@ -1779,6 +1780,41 @@ lp_timeout_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
|
|
|
return sys_ioctl(fd, cmd, (unsigned long)tn);
|
|
|
}
|
|
|
|
|
|
+/* on ia32 l_start is on a 32-bit boundary */
|
|
|
+#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
|
|
|
+struct space_resv_32 {
|
|
|
+ __s16 l_type;
|
|
|
+ __s16 l_whence;
|
|
|
+ __s64 l_start __attribute__((packed));
|
|
|
+ /* len == 0 means until end of file */
|
|
|
+ __s64 l_len __attribute__((packed));
|
|
|
+ __s32 l_sysid;
|
|
|
+ __u32 l_pid;
|
|
|
+ __s32 l_pad[4]; /* reserve area */
|
|
|
+};
|
|
|
+
|
|
|
+#define FS_IOC_RESVSP_32 _IOW ('X', 40, struct space_resv_32)
|
|
|
+#define FS_IOC_RESVSP64_32 _IOW ('X', 42, struct space_resv_32)
|
|
|
+
|
|
|
+/* just account for different alignment */
|
|
|
+static int compat_ioctl_preallocate(struct file *file, unsigned long arg)
|
|
|
+{
|
|
|
+ struct space_resv_32 __user *p32 = (void __user *)arg;
|
|
|
+ struct space_resv __user *p = compat_alloc_user_space(sizeof(*p));
|
|
|
+
|
|
|
+ if (copy_in_user(&p->l_type, &p32->l_type, sizeof(s16)) ||
|
|
|
+ copy_in_user(&p->l_whence, &p32->l_whence, sizeof(s16)) ||
|
|
|
+ copy_in_user(&p->l_start, &p32->l_start, sizeof(s64)) ||
|
|
|
+ copy_in_user(&p->l_len, &p32->l_len, sizeof(s64)) ||
|
|
|
+ copy_in_user(&p->l_sysid, &p32->l_sysid, sizeof(s32)) ||
|
|
|
+ copy_in_user(&p->l_pid, &p32->l_pid, sizeof(u32)) ||
|
|
|
+ copy_in_user(&p->l_pad, &p32->l_pad, 4*sizeof(u32)))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ return ioctl_preallocate(file, p);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
|
|
|
typedef int (*ioctl_trans_handler_t)(unsigned int, unsigned int,
|
|
|
unsigned long, struct file *);
|
|
@@ -2756,6 +2792,18 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
|
|
|
case FIOQSIZE:
|
|
|
break;
|
|
|
|
|
|
+#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
|
|
|
+ case FS_IOC_RESVSP_32:
|
|
|
+ case FS_IOC_RESVSP64_32:
|
|
|
+ error = compat_ioctl_preallocate(filp, arg);
|
|
|
+ goto out_fput;
|
|
|
+#else
|
|
|
+ case FS_IOC_RESVSP:
|
|
|
+ case FS_IOC_RESVSP64:
|
|
|
+ error = ioctl_preallocate(filp, (void __user *)arg);
|
|
|
+ goto out_fput;
|
|
|
+#endif
|
|
|
+
|
|
|
case FIBMAP:
|
|
|
case FIGETBSZ:
|
|
|
case FIONREAD:
|