diff options
Diffstat (limited to 'fs/bfs/file.c')
| -rw-r--r-- | fs/bfs/file.c | 24 | 
1 files changed, 14 insertions, 10 deletions
diff --git a/fs/bfs/file.c b/fs/bfs/file.c index eb67edd0f8e..e7f88ace1a2 100644 --- a/fs/bfs/file.c +++ b/fs/bfs/file.c @@ -23,10 +23,10 @@  const struct file_operations bfs_file_operations = {  	.llseek 	= generic_file_llseek, -	.read		= do_sync_read, -	.aio_read	= generic_file_aio_read, -	.write		= do_sync_write, -	.aio_write	= generic_file_aio_write, +	.read		= new_sync_read, +	.read_iter	= generic_file_read_iter, +	.write		= new_sync_write, +	.write_iter	= generic_file_write_iter,  	.mmap		= generic_file_mmap,  	.splice_read	= generic_file_splice_read,  }; @@ -161,6 +161,14 @@ static int bfs_readpage(struct file *file, struct page *page)  	return block_read_full_page(page, bfs_get_block);  } +static void bfs_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); +} +  static int bfs_write_begin(struct file *file, struct address_space *mapping,  			loff_t pos, unsigned len, unsigned flags,  			struct page **pagep, void **fsdata) @@ -169,11 +177,8 @@ static int bfs_write_begin(struct file *file, struct address_space *mapping,  	ret = block_write_begin(mapping, pos, len, flags, pagep,  				bfs_get_block); -	if (unlikely(ret)) { -		loff_t isize = mapping->host->i_size; -		if (pos + len > isize) -			vmtruncate(mapping->host, isize); -	} +	if (unlikely(ret)) +		bfs_write_failed(mapping, pos + len);  	return ret;  } @@ -186,7 +191,6 @@ static sector_t bfs_bmap(struct address_space *mapping, sector_t block)  const struct address_space_operations bfs_aops = {  	.readpage	= bfs_readpage,  	.writepage	= bfs_writepage, -	.sync_page	= block_sync_page,  	.write_begin	= bfs_write_begin,  	.write_end	= generic_write_end,  	.bmap		= bfs_bmap,  | 
