introduce memory_read_from_buffer()
authorAkinobu Mita <[email protected]>
Fri, 6 Jun 2008 05:46:21 +0000 (22:46 -0700)
committerLinus Torvalds <[email protected]>
Fri, 6 Jun 2008 18:29:11 +0000 (11:29 -0700)
This patch introduces memory_read_from_buffer().

The only difference between memory_read_from_buffer() and
simple_read_from_buffer() is which address space the function copies to.

simple_read_from_buffer copies to user space memory.
memory_read_from_buffer copies to normal memory.

Signed-off-by: Akinobu Mita <[email protected]>
Cc: Al Viro <[email protected]>
Cc: Doug Warzecha <[email protected]>
Cc: Zhang Rui <[email protected]>
Cc: Matt Domsch <[email protected]>
Cc: Abhay Salunke <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: Markus Rechberger <[email protected]>
Cc: Kay Sievers <[email protected]>
Cc: Bob Moore <[email protected]>
Cc: Thomas Renninger <[email protected]>
Cc: Len Brown <[email protected]>
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: "Antonino A. Daplas" <[email protected]>
Cc: Krzysztof Helt <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Cc: Martin Schwidefsky <[email protected]>
Cc: Heiko Carstens <[email protected]>
Cc: Peter Oberparleiter <[email protected]>
Cc: Michael Holzheu <[email protected]>
Cc: Brian King <[email protected]>
Cc: James E.J. Bottomley <[email protected]>
Cc: Andrew Vasquez <[email protected]>
Cc: Seokmann Ju <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
fs/libfs.c
include/linux/fs.h

index b004dfadd8917d4cbf91d9994a9b4893ea6b3922..892d41cb3382842a8c1a4b205f6a67fbd38c888b 100644 (file)
@@ -528,6 +528,23 @@ ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos,
        return count;
 }
 
+ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
+                               const void *from, size_t available)
+{
+       loff_t pos = *ppos;
+
+       if (pos < 0)
+               return -EINVAL;
+       if (pos >= available)
+               return 0;
+       if (count > available - pos)
+               count = available - pos;
+       memcpy(to, from + pos, count);
+       *ppos = pos + count;
+
+       return count;
+}
+
 /*
  * Transaction based IO.
  * The file expects a single write which triggers the transaction, and then
@@ -800,6 +817,7 @@ EXPORT_SYMBOL(simple_statfs);
 EXPORT_SYMBOL(simple_sync_file);
 EXPORT_SYMBOL(simple_unlink);
 EXPORT_SYMBOL(simple_read_from_buffer);
+EXPORT_SYMBOL(memory_read_from_buffer);
 EXPORT_SYMBOL(simple_transaction_get);
 EXPORT_SYMBOL(simple_transaction_read);
 EXPORT_SYMBOL(simple_transaction_release);
index f413085f748e574140ca4216abbb303209cc7fb0..d490779f18d946e52d443148cb8501649aad9030 100644 (file)
@@ -2000,7 +2000,10 @@ extern int simple_fill_super(struct super_block *, int, struct tree_descr *);
 extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count);
 extern void simple_release_fs(struct vfsmount **mount, int *count);
 
-extern ssize_t simple_read_from_buffer(void __user *, size_t, loff_t *, const void *, size_t);
+extern ssize_t simple_read_from_buffer(void __user *to, size_t count,
+                       loff_t *ppos, const void *from, size_t available);
+extern ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
+                       const void *from, size_t available);
 
 #ifdef CONFIG_MIGRATION
 extern int buffer_migrate_page(struct address_space *,