diff options
| author | Andrew Morton <akpm@digeo.com> | 2002-10-28 16:22:02 -0800 |
|---|---|---|
| committer | Jens Axboe <axboe@suse.de> | 2002-10-28 16:22:02 -0800 |
| commit | 3ee477f0d419d10cdd72ac9b7d7e9e7cc95e99f0 (patch) | |
| tree | f9a50299ae38140304118944d25d1568584bae5d | |
| parent | f596aeef33216568838b32a0bd47273ff60e57d7 (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.c | 44 | ||||
| -rw-r--r-- | fs/ramfs/inode.c | 48 | ||||
| -rw-r--r-- | include/linux/fs.h | 6 | ||||
| -rw-r--r-- | kernel/ksyms.c | 3 |
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); |
