backports: add compat_put_timespec()
authorHauke Mehrtens <hauke@hauke-m.de>
Fri, 7 Feb 2014 23:52:42 +0000 (00:52 +0100)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 8 Feb 2014 12:34:15 +0000 (13:34 +0100)
This is used by v4l2-compat-ioctl32.c

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
backport/backport-include/linux/compat.h
backport/compat/compat-3.4.c

index 22db9b0f7be3ca1cc43b7ffa6d140793cdb691b4..07accd2ec66780a0708388b4f3493f4ef526130a 100644 (file)
@@ -13,4 +13,9 @@
 #endif
 #endif
 
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))
+#define compat_put_timespec LINUX_BACKPORT(compat_put_timespec)
+extern int compat_put_timespec(const struct timespec *, void __user *);
+#endif
+
 #endif /* __BACKPORT_COMPAT_H */
index fafe0dfd87aeb5d9db865320d9304464805691a3..bc090b7830d649364550e53a18ceb69931a3fa0e 100644 (file)
@@ -11,6 +11,8 @@
 #include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/wait.h>
+#include <linux/compat.h>
+#include <asm/uaccess.h>
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))
 #include <linux/regmap.h>
@@ -179,3 +181,21 @@ int simple_open(struct inode *inode, struct file *file)
        return 0;
 }
 EXPORT_SYMBOL_GPL(simple_open);
+
+#ifdef CONFIG_COMPAT
+static int __compat_put_timespec(const struct timespec *ts, struct compat_timespec __user *cts)
+{
+       return (!access_ok(VERIFY_WRITE, cts, sizeof(*cts)) ||
+                       __put_user(ts->tv_sec, &cts->tv_sec) ||
+                       __put_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
+}
+
+int compat_put_timespec(const struct timespec *ts, void __user *uts)
+{
+       if (COMPAT_USE_64BIT_TIME)
+               return copy_to_user(uts, ts, sizeof *ts) ? -EFAULT : 0;
+       else
+               return __compat_put_timespec(ts, uts);
+}
+EXPORT_SYMBOL_GPL(compat_put_timespec);
+#endif