diff options
| author | Nick Piggin <npiggin@suse.de> | 2007-10-16 01:25:21 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-16 09:42:57 -0700 | 
| commit | 26a6441aadde864132672750b3cf0892e5acaaf4 (patch) | |
| tree | 2e85db7e46c956f5e0d7150e09accb67235983b6 /fs/sysv | |
| parent | be021ee41a8b65d181fe22799de6be62adf72efb (diff) | |
| download | linux-26a6441aadde864132672750b3cf0892e5acaaf4.tar.bz2 | |
sysv: convert to new aops
Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/sysv')
| -rw-r--r-- | fs/sysv/dir.c | 50 | ||||
| -rw-r--r-- | fs/sysv/itree.c | 23 | ||||
| -rw-r--r-- | fs/sysv/sysv.h | 3 | 
3 files changed, 52 insertions, 24 deletions
diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index e566b387fcf9..56f655254bfe 100644 --- a/fs/sysv/dir.c +++ b/fs/sysv/dir.c @@ -16,6 +16,7 @@  #include <linux/pagemap.h>  #include <linux/highmem.h>  #include <linux/smp_lock.h> +#include <linux/swap.h>  #include "sysv.h"  static int sysv_readdir(struct file *, void *, filldir_t); @@ -37,12 +38,17 @@ static inline unsigned long dir_pages(struct inode *inode)  	return (inode->i_size+PAGE_CACHE_SIZE-1)>>PAGE_CACHE_SHIFT;  } -static int dir_commit_chunk(struct page *page, unsigned from, unsigned to) +static int dir_commit_chunk(struct page *page, loff_t pos, unsigned len)  { -	struct inode *dir = (struct inode *)page->mapping->host; +	struct address_space *mapping = page->mapping; +	struct inode *dir = mapping->host;  	int err = 0; -	page->mapping->a_ops->commit_write(NULL, page, from, to); +	block_write_end(NULL, mapping, pos, len, len, page, NULL); +	if (pos+len > dir->i_size) { +		i_size_write(dir, pos+len); +		mark_inode_dirty(dir); +	}  	if (IS_DIRSYNC(dir))  		err = write_one_page(page, 1);  	else @@ -186,7 +192,7 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode)  	unsigned long npages = dir_pages(dir);  	unsigned long n;  	char *kaddr; -	unsigned from, to; +	loff_t pos;  	int err;  	/* We take care of directory expansion in the same loop */ @@ -212,16 +218,17 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode)  	return -EINVAL;  got_it: -	from = (char*)de - (char*)page_address(page); -	to = from + SYSV_DIRSIZE; +	pos = page_offset(page) + +			(char*)de - (char*)page_address(page);  	lock_page(page); -	err = page->mapping->a_ops->prepare_write(NULL, page, from, to); +	err = __sysv_write_begin(NULL, page->mapping, pos, SYSV_DIRSIZE, +				AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);  	if (err)  		goto out_unlock;  	memcpy (de->name, name, namelen);  	memset (de->name + namelen, 0, SYSV_DIRSIZE - namelen - 2);  	de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), inode->i_ino); -	err = dir_commit_chunk(page, from, to); +	err = dir_commit_chunk(page, pos, SYSV_DIRSIZE);  	dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;  	mark_inode_dirty(dir);  out_page: @@ -238,15 +245,15 @@ int sysv_delete_entry(struct sysv_dir_entry *de, struct page *page)  	struct address_space *mapping = page->mapping;  	struct inode *inode = (struct inode*)mapping->host;  	char *kaddr = (char*)page_address(page); -	unsigned from = (char*)de - kaddr; -	unsigned to = from + SYSV_DIRSIZE; +	loff_t pos = page_offset(page) + (char *)de - kaddr;  	int err;  	lock_page(page); -	err = mapping->a_ops->prepare_write(NULL, page, from, to); +	err = __sysv_write_begin(NULL, mapping, pos, SYSV_DIRSIZE, +				AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);  	BUG_ON(err);  	de->inode = 0; -	err = dir_commit_chunk(page, from, to); +	err = dir_commit_chunk(page, pos, SYSV_DIRSIZE);  	dir_put_page(page);  	inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC;  	mark_inode_dirty(inode); @@ -263,12 +270,13 @@ int sysv_make_empty(struct inode *inode, struct inode *dir)  	if (!page)  		return -ENOMEM; -	kmap(page); -	err = mapping->a_ops->prepare_write(NULL, page, 0, 2 * SYSV_DIRSIZE); +	err = __sysv_write_begin(NULL, mapping, 0, 2 * SYSV_DIRSIZE, +				AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);  	if (err) {  		unlock_page(page);  		goto fail;  	} +	kmap(page);  	base = (char*)page_address(page);  	memset(base, 0, PAGE_CACHE_SIZE); @@ -280,9 +288,9 @@ int sysv_make_empty(struct inode *inode, struct inode *dir)  	de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), dir->i_ino);  	strcpy(de->name,".."); +	kunmap(page);  	err = dir_commit_chunk(page, 0, 2 * SYSV_DIRSIZE);  fail: -	kunmap(page);  	page_cache_release(page);  	return err;  } @@ -336,16 +344,18 @@ not_empty:  void sysv_set_link(struct sysv_dir_entry *de, struct page *page,  	struct inode *inode)  { -	struct inode *dir = (struct inode*)page->mapping->host; -	unsigned from = (char *)de-(char*)page_address(page); -	unsigned to = from + SYSV_DIRSIZE; +	struct address_space *mapping = page->mapping; +	struct inode *dir = mapping->host; +	loff_t pos = page_offset(page) + +			(char *)de-(char*)page_address(page);  	int err;  	lock_page(page); -	err = page->mapping->a_ops->prepare_write(NULL, page, from, to); +	err = __sysv_write_begin(NULL, mapping, pos, SYSV_DIRSIZE, +				AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);  	BUG_ON(err);  	de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), inode->i_ino); -	err = dir_commit_chunk(page, from, to); +	err = dir_commit_chunk(page, pos, SYSV_DIRSIZE);  	dir_put_page(page);  	dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;  	mark_inode_dirty(dir); diff --git a/fs/sysv/itree.c b/fs/sysv/itree.c index f2bcccd1d6fc..f042eec464c2 100644 --- a/fs/sysv/itree.c +++ b/fs/sysv/itree.c @@ -453,23 +453,38 @@ static int sysv_writepage(struct page *page, struct writeback_control *wbc)  {  	return block_write_full_page(page,get_block,wbc);  } +  static int sysv_readpage(struct file *file, struct page *page)  {  	return block_read_full_page(page,get_block);  } -static int sysv_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to) + +int __sysv_write_begin(struct file *file, struct address_space *mapping, +			loff_t pos, unsigned len, unsigned flags, +			struct page **pagep, void **fsdata)  { -	return block_prepare_write(page,from,to,get_block); +	return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata, +				get_block);  } + +static int sysv_write_begin(struct file *file, struct address_space *mapping, +			loff_t pos, unsigned len, unsigned flags, +			struct page **pagep, void **fsdata) +{ +	*pagep = NULL; +	return __sysv_write_begin(file, mapping, pos, len, flags, pagep, fsdata); +} +  static sector_t sysv_bmap(struct address_space *mapping, sector_t block)  {  	return generic_block_bmap(mapping,block,get_block);  } +  const struct address_space_operations sysv_aops = {  	.readpage = sysv_readpage,  	.writepage = sysv_writepage,  	.sync_page = block_sync_page, -	.prepare_write = sysv_prepare_write, -	.commit_write = generic_commit_write, +	.write_begin = sysv_write_begin, +	.write_end = generic_write_end,  	.bmap = sysv_bmap  }; diff --git a/fs/sysv/sysv.h b/fs/sysv/sysv.h index 5b4fedf17cc4..64c03bdf06a5 100644 --- a/fs/sysv/sysv.h +++ b/fs/sysv/sysv.h @@ -136,6 +136,9 @@ extern unsigned long sysv_count_free_blocks(struct super_block *);  /* itree.c */  extern void sysv_truncate(struct inode *); +extern int __sysv_write_begin(struct file *file, struct address_space *mapping, +			loff_t pos, unsigned len, unsigned flags, +			struct page **pagep, void **fsdata);  /* inode.c */  extern int sysv_write_inode(struct inode *, int);  |