aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/libfs.c18
-rw-r--r--include/linux/fs.h5
2 files changed, 22 insertions, 1 deletions
diff --git a/fs/libfs.c b/fs/libfs.c
index b004dfadd891..892d41cb3382 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -528,6 +528,23 @@ ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos,
528 return count; 528 return count;
529} 529}
530 530
531ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
532 const void *from, size_t available)
533{
534 loff_t pos = *ppos;
535
536 if (pos < 0)
537 return -EINVAL;
538 if (pos >= available)
539 return 0;
540 if (count > available - pos)
541 count = available - pos;
542 memcpy(to, from + pos, count);
543 *ppos = pos + count;
544
545 return count;
546}
547
531/* 548/*
532 * Transaction based IO. 549 * Transaction based IO.
533 * The file expects a single write which triggers the transaction, and then 550 * The file expects a single write which triggers the transaction, and then
@@ -800,6 +817,7 @@ EXPORT_SYMBOL(simple_statfs);
800EXPORT_SYMBOL(simple_sync_file); 817EXPORT_SYMBOL(simple_sync_file);
801EXPORT_SYMBOL(simple_unlink); 818EXPORT_SYMBOL(simple_unlink);
802EXPORT_SYMBOL(simple_read_from_buffer); 819EXPORT_SYMBOL(simple_read_from_buffer);
820EXPORT_SYMBOL(memory_read_from_buffer);
803EXPORT_SYMBOL(simple_transaction_get); 821EXPORT_SYMBOL(simple_transaction_get);
804EXPORT_SYMBOL(simple_transaction_read); 822EXPORT_SYMBOL(simple_transaction_read);
805EXPORT_SYMBOL(simple_transaction_release); 823EXPORT_SYMBOL(simple_transaction_release);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index f413085f748e..d490779f18d9 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2000,7 +2000,10 @@ extern int simple_fill_super(struct super_block *, int, struct tree_descr *);
2000extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count); 2000extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count);
2001extern void simple_release_fs(struct vfsmount **mount, int *count); 2001extern void simple_release_fs(struct vfsmount **mount, int *count);
2002 2002
2003extern ssize_t simple_read_from_buffer(void __user *, size_t, loff_t *, const void *, size_t); 2003extern ssize_t simple_read_from_buffer(void __user *to, size_t count,
2004 loff_t *ppos, const void *from, size_t available);
2005extern ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
2006 const void *from, size_t available);
2004 2007
2005#ifdef CONFIG_MIGRATION 2008#ifdef CONFIG_MIGRATION
2006extern int buffer_migrate_page(struct address_space *, 2009extern int buffer_migrate_page(struct address_space *,