compat: add simple_write_to_buffer
authorHauke Mehrtens <hauke@hauke-m.de>
Wed, 9 Jan 2013 16:34:21 +0000 (17:34 +0100)
committerLuis R. Rodriguez <mcgrof@do-not-panic.com>
Thu, 10 Jan 2013 21:11:25 +0000 (13:11 -0800)
This was copied from fs/libfs.c

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
compat/compat-2.6.35.c
include/linux/compat-2.6.35.h

index 0fc0db2a54433a6e32248896a5ec5c89c3964658..422487c028b553604f480965dda7ecfc35134588 100644 (file)
@@ -89,3 +89,37 @@ loff_t noop_llseek(struct file *file, loff_t offset, int origin)
 }
 EXPORT_SYMBOL_GPL(noop_llseek);
 
+/**
+ * simple_write_to_buffer - copy data from user space to the buffer
+ * @to: the buffer to write to
+ * @available: the size of the buffer
+ * @ppos: the current position in the buffer
+ * @from: the user space buffer to read from
+ * @count: the maximum number of bytes to read
+ *
+ * The simple_write_to_buffer() function reads up to @count bytes from the user
+ * space address starting at @from into the buffer @to at offset @ppos.
+ *
+ * On success, the number of bytes written is returned and the offset @ppos is
+ * advanced by this number, or negative value is returned on error.
+ **/
+ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos,
+               const void __user *from, size_t count)
+{
+       loff_t pos = *ppos;
+       size_t res;
+
+       if (pos < 0)
+               return -EINVAL;
+       if (pos >= available || !count)
+               return 0;
+       if (count > available - pos)
+               count = available - pos;
+       res = copy_from_user(to + pos, from, count);
+       if (res == count)
+               return -EFAULT;
+       count -= res;
+       *ppos = pos + count;
+       return count;
+}
+EXPORT_SYMBOL(simple_write_to_buffer);
index b06638ac727c4f6b05ae1741dda9b4a192257010..82b4dea48009c4077d86c042503dd2f2e100520c 100644 (file)
@@ -88,6 +88,9 @@ usb_pipe_endpoint(struct usb_device *dev, unsigned int pipe)
        return eps[usb_pipeendpoint(pipe)];
 }
 
+extern ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos,
+               const void __user *from, size_t count);
+
 #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)) */
 
 #endif /* LINUX_26_35_COMPAT_H */