summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@digeo.com>2002-10-28 16:22:02 -0800
committerJens Axboe <axboe@suse.de>2002-10-28 16:22:02 -0800
commit3ee477f0d419d10cdd72ac9b7d7e9e7cc95e99f0 (patch)
treef9a50299ae38140304118944d25d1568584bae5d
parentf596aeef33216568838b32a0bd47273ff60e57d7 (diff)
[PATCH] move ramfs a_ops into libfs
From Bill Irwin. Abstract out ramfs readpage(), prepare_write(), and commit_write() operations. Ram-backed filesystems are going to be doing a lot of zero-filled read and write operations. So in this patch, ramfs' implementations are moved to libfs in anticipation of other callers.
-rw-r--r--fs/libfs.c44
-rw-r--r--fs/ramfs/inode.c48
-rw-r--r--include/linux/fs.h6
-rw-r--r--kernel/ksyms.c3
4 files changed, 56 insertions, 45 deletions
diff --git a/fs/libfs.c b/fs/libfs.c
index 5f66993870d4..98c1968b7155 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -277,3 +277,47 @@ int simple_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode
}
return 0;
}
+
+int simple_readpage(struct file *file, struct page *page)
+{
+ void *kaddr;
+
+ if (PageUptodate(page))
+ goto out;
+
+ kaddr = kmap_atomic(page, KM_USER0);
+ memset(kaddr, 0, PAGE_CACHE_SIZE);
+ kunmap_atomic(kaddr, KM_USER0);
+ flush_dcache_page(page);
+ SetPageUptodate(page);
+out:
+ unlock_page(page);
+ return 0;
+}
+
+int simple_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
+{
+ void *kaddr;
+
+ if (PageUptodate(page))
+ goto out;
+
+ kaddr = kmap_atomic(page, KM_USER0);
+ memset(kaddr, 0, PAGE_CACHE_SIZE);
+ kunmap_atomic(kaddr, KM_USER0);
+ SetPageUptodate(page);
+out:
+ set_page_dirty(page);
+ return 0;
+}
+
+int simple_commit_write(struct file *file, struct page *page, unsigned offset, unsigned to)
+{
+ struct inode *inode = page->mapping->host;
+ loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
+
+ if (pos > inode->i_size)
+ inode->i_size = pos;
+
+ return 0;
+}
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c
index 55e1a36d252f..dea3cdd2bd1f 100644
--- a/fs/ramfs/inode.c
+++ b/fs/ramfs/inode.c
@@ -47,48 +47,6 @@ static struct backing_dev_info ramfs_backing_dev_info = {
.memory_backed = 1, /* Does not contribute to dirty memory */
};
-/*
- * Read a page. Again trivial. If it didn't already exist
- * in the page cache, it is zero-filled.
- */
-static int ramfs_readpage(struct file *file, struct page * page)
-{
- if (!PageUptodate(page)) {
- char *kaddr = kmap_atomic(page, KM_USER0);
-
- memset(kaddr, 0, PAGE_CACHE_SIZE);
- kunmap_atomic(kaddr, KM_USER0);
- flush_dcache_page(page);
- SetPageUptodate(page);
- }
- unlock_page(page);
- return 0;
-}
-
-static int ramfs_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
-{
- if (!PageUptodate(page)) {
- char *kaddr = kmap_atomic(page, KM_USER0);
-
- memset(kaddr, 0, PAGE_CACHE_SIZE);
- flush_dcache_page(page);
- kunmap_atomic(kaddr, KM_USER0);
- SetPageUptodate(page);
- }
- set_page_dirty(page);
- return 0;
-}
-
-static int ramfs_commit_write(struct file *file, struct page *page, unsigned offset, unsigned to)
-{
- struct inode *inode = page->mapping->host;
- loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
-
- if (pos > inode->i_size)
- inode->i_size = pos;
- return 0;
-}
-
struct inode *ramfs_get_inode(struct super_block *sb, int mode, int dev)
{
struct inode * inode = new_inode(sb);
@@ -175,10 +133,10 @@ static int ramfs_symlink(struct inode * dir, struct dentry *dentry, const char *
}
static struct address_space_operations ramfs_aops = {
- .readpage = ramfs_readpage,
+ .readpage = simple_readpage,
.writepage = fail_writepage,
- .prepare_write = ramfs_prepare_write,
- .commit_write = ramfs_commit_write
+ .prepare_write = simple_prepare_write,
+ .commit_write = simple_commit_write
};
static struct file_operations ramfs_file_operations = {
diff --git a/include/linux/fs.h b/include/linux/fs.h
index d039e51f5b81..d6d1e30c01dd 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1311,6 +1311,12 @@ extern int simple_rmdir(struct inode *, struct dentry *);
extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
extern int simple_sync_file(struct file *, struct dentry *, int);
extern int simple_empty(struct dentry *);
+extern int simple_readpage(struct file *file, struct page *page);
+extern int simple_prepare_write(struct file *file, struct page *page,
+ unsigned offset, unsigned to);
+extern int simple_commit_write(struct file *file, struct page *page,
+ unsigned offset, unsigned to);
+
extern struct dentry *simple_lookup(struct inode *, struct dentry *);
extern ssize_t generic_read_dir(struct file *, char *, size_t, loff_t *);
extern struct file_operations simple_dir_operations;
diff --git a/kernel/ksyms.c b/kernel/ksyms.c
index 2110508c2b82..a595cc65382d 100644
--- a/kernel/ksyms.c
+++ b/kernel/ksyms.c
@@ -306,6 +306,9 @@ EXPORT_SYMBOL(simple_unlink);
EXPORT_SYMBOL(simple_rmdir);
EXPORT_SYMBOL(simple_rename);
EXPORT_SYMBOL(simple_sync_file);
+EXPORT_SYMBOL(simple_readpage);
+EXPORT_SYMBOL(simple_prepare_write);
+EXPORT_SYMBOL(simple_commit_write);
EXPORT_SYMBOL(simple_empty);
EXPORT_SYMBOL(fd_install);
EXPORT_SYMBOL(put_unused_fd);