diff options
Diffstat (limited to 'fs/omfs/file.c')
| -rw-r--r-- | fs/omfs/file.c | 37 | 
1 files changed, 21 insertions, 16 deletions
diff --git a/fs/omfs/file.c b/fs/omfs/file.c index 8a6d34fa668..902e88527fc 100644 --- a/fs/omfs/file.c +++ b/fs/omfs/file.c @@ -4,7 +4,6 @@   * Released under GPL v2.   */ -#include <linux/version.h>  #include <linux/module.h>  #include <linux/fs.h>  #include <linux/buffer_head.h> @@ -147,8 +146,7 @@ static int omfs_grow_extent(struct inode *inode, struct omfs_extent *oe,  			be64_to_cpu(entry->e_blocks);  		if (omfs_allocate_block(inode->i_sb, new_block)) { -			entry->e_blocks = -				cpu_to_be64(be64_to_cpu(entry->e_blocks) + 1); +			be64_add_cpu(&entry->e_blocks, 1);  			terminator->e_blocks = ~(cpu_to_be64(  				be64_to_cpu(~terminator->e_blocks) + 1));  			goto out; @@ -178,7 +176,7 @@ static int omfs_grow_extent(struct inode *inode, struct omfs_extent *oe,  		be64_to_cpu(~terminator->e_blocks) + (u64) new_count));  	/* write in new entry */ -	oe->e_extent_count = cpu_to_be32(1 + be32_to_cpu(oe->e_extent_count)); +	be32_add_cpu(&oe->e_extent_count, 1);  out:  	*ret_block = new_block; @@ -308,6 +306,16 @@ omfs_writepages(struct address_space *mapping, struct writeback_control *wbc)  	return mpage_writepages(mapping, wbc, omfs_get_block);  } +static void omfs_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); +		omfs_truncate(inode); +	} +} +  static int omfs_write_begin(struct file *file, struct address_space *mapping,  			loff_t pos, unsigned len, unsigned flags,  			struct page **pagep, void **fsdata) @@ -316,11 +324,8 @@ static int omfs_write_begin(struct file *file, struct address_space *mapping,  	ret = block_write_begin(mapping, pos, len, flags, pagep,  				omfs_get_block); -	if (unlikely(ret)) { -		loff_t isize = mapping->host->i_size; -		if (pos + len > isize) -			vmtruncate(mapping->host, isize); -	} +	if (unlikely(ret)) +		omfs_write_failed(mapping, pos + len);  	return ret;  } @@ -332,10 +337,10 @@ static sector_t omfs_bmap(struct address_space *mapping, sector_t block)  const struct file_operations omfs_file_operations = {  	.llseek = generic_file_llseek, -	.read = do_sync_read, -	.write = do_sync_write, -	.aio_read = generic_file_aio_read, -	.aio_write = generic_file_aio_write, +	.read = new_sync_read, +	.write = new_sync_write, +	.read_iter = generic_file_read_iter, +	.write_iter = generic_file_write_iter,  	.mmap = generic_file_mmap,  	.fsync = generic_file_fsync,  	.splice_read = generic_file_splice_read, @@ -352,9 +357,11 @@ static int omfs_setattr(struct dentry *dentry, struct iattr *attr)  	if ((attr->ia_valid & ATTR_SIZE) &&  	    attr->ia_size != i_size_read(inode)) { -		error = vmtruncate(inode, attr->ia_size); +		error = inode_newsize_ok(inode, attr->ia_size);  		if (error)  			return error; +		truncate_setsize(inode, attr->ia_size); +		omfs_truncate(inode);  	}  	setattr_copy(inode, attr); @@ -364,7 +371,6 @@ static int omfs_setattr(struct dentry *dentry, struct iattr *attr)  const struct inode_operations omfs_file_inops = {  	.setattr = omfs_setattr, -	.truncate = omfs_truncate  };  const struct address_space_operations omfs_aops = { @@ -372,7 +378,6 @@ const struct address_space_operations omfs_aops = {  	.readpages = omfs_readpages,  	.writepage = omfs_writepage,  	.writepages = omfs_writepages, -	.sync_page = block_sync_page,  	.write_begin = omfs_write_begin,  	.write_end = generic_write_end,  	.bmap = omfs_bmap,  | 
