diff options
Diffstat (limited to 'fs/jfs/inode.c')
| -rw-r--r-- | fs/jfs/inode.c | 40 | 
1 files changed, 24 insertions, 16 deletions
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 9978803ceed..bd3df1ca3c9 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c @@ -23,6 +23,7 @@  #include <linux/pagemap.h>  #include <linux/quotaops.h>  #include <linux/writeback.h> +#include <linux/aio.h>  #include "jfs_incore.h"  #include "jfs_inode.h"  #include "jfs_filsys.h" @@ -125,7 +126,7 @@ int jfs_write_inode(struct inode *inode, struct writeback_control *wbc)  {  	int wait = wbc->sync_mode == WB_SYNC_ALL; -	if (test_cflag(COMMIT_Nolink, inode)) +	if (inode->i_nlink == 0)  		return 0;  	/*  	 * If COMMIT_DIRTY is not set, the inode isn't really dirty. @@ -153,7 +154,7 @@ void jfs_evict_inode(struct inode *inode)  		dquot_initialize(inode);  		if (JFS_IP(inode)->fileset == FILESYSTEM_I) { -			truncate_inode_pages(&inode->i_data, 0); +			truncate_inode_pages_final(&inode->i_data);  			if (test_cflag(COMMIT_Freewmap, inode))  				jfs_free_zero_link(inode); @@ -167,13 +168,13 @@ void jfs_evict_inode(struct inode *inode)  			dquot_free_inode(inode);  		}  	} else { -		truncate_inode_pages(&inode->i_data, 0); +		truncate_inode_pages_final(&inode->i_data);  	} -	end_writeback(inode); +	clear_inode(inode);  	dquot_drop(inode);  } -void jfs_dirty_inode(struct inode *inode) +void jfs_dirty_inode(struct inode *inode, int flags)  {  	static int noisy = 5; @@ -300,6 +301,16 @@ static int jfs_readpages(struct file *file, struct address_space *mapping,  	return mpage_readpages(mapping, pages, nr_pages, jfs_get_block);  } +static void jfs_write_failed(struct address_space *mapping, loff_t to) +{ +	struct inode *inode = mapping->host; + +	if (to > inode->i_size) { +		truncate_pagecache(inode, inode->i_size); +		jfs_truncate(inode); +	} +} +  static int jfs_write_begin(struct file *file, struct address_space *mapping,  				loff_t pos, unsigned len, unsigned flags,  				struct page **pagep, void **fsdata) @@ -308,11 +319,8 @@ static int jfs_write_begin(struct file *file, struct address_space *mapping,  	ret = nobh_write_begin(mapping, pos, len, flags, pagep, fsdata,  				jfs_get_block); -	if (unlikely(ret)) { -		loff_t isize = mapping->host->i_size; -		if (pos + len > isize) -			vmtruncate(mapping->host, isize); -	} +	if (unlikely(ret)) +		jfs_write_failed(mapping, pos + len);  	return ret;  } @@ -323,14 +331,15 @@ static sector_t jfs_bmap(struct address_space *mapping, sector_t block)  }  static ssize_t jfs_direct_IO(int rw, struct kiocb *iocb, -	const struct iovec *iov, loff_t offset, unsigned long nr_segs) +	struct iov_iter *iter, loff_t offset)  {  	struct file *file = iocb->ki_filp; +	struct address_space *mapping = file->f_mapping;  	struct inode *inode = file->f_mapping->host; +	size_t count = iov_iter_count(iter);  	ssize_t ret; -	ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, -				offset, nr_segs, jfs_get_block, NULL); +	ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, jfs_get_block);  	/*  	 * In case of error extending write may have instantiated a few @@ -338,10 +347,10 @@ static ssize_t jfs_direct_IO(int rw, struct kiocb *iocb,  	 */  	if (unlikely((rw & WRITE) && ret < 0)) {  		loff_t isize = i_size_read(inode); -		loff_t end = offset + iov_length(iov, nr_segs); +		loff_t end = offset + count;  		if (end > isize) -			vmtruncate(inode, isize); +			jfs_write_failed(mapping, end);  	}  	return ret; @@ -352,7 +361,6 @@ const struct address_space_operations jfs_aops = {  	.readpages	= jfs_readpages,  	.writepage	= jfs_writepage,  	.writepages	= jfs_writepages, -	.sync_page	= block_sync_page,  	.write_begin	= jfs_write_begin,  	.write_end	= nobh_write_end,  	.bmap		= jfs_bmap,  | 
