diff options
| author | Marco Stornelli <marco.stornelli@gmail.com> | 2012-12-15 11:55:07 +0100 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-12-20 18:40:52 -0500 | 
| commit | d506848567b529e57dfbcc4e28747b9211ffb7e5 (patch) | |
| tree | 7f8524976cc8ab1f04abe2701150cd3f43d81e9c | |
| parent | 86dd07d66a2f7284cfe2b771d062dd6c0e331766 (diff) | |
| download | olio-linux-3.10-d506848567b529e57dfbcc4e28747b9211ffb7e5.tar.xz olio-linux-3.10-d506848567b529e57dfbcc4e28747b9211ffb7e5.zip  | |
hfsplus: drop vmtruncate
Removed vmtruncate
Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| -rw-r--r-- | fs/hfsplus/inode.c | 27 | 
1 files changed, 16 insertions, 11 deletions
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index 2172aa5976f..799b336b59f 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c @@ -28,6 +28,16 @@ static int hfsplus_writepage(struct page *page, struct writeback_control *wbc)  	return block_write_full_page(page, hfsplus_get_block, wbc);  } +static void hfsplus_write_failed(struct address_space *mapping, loff_t to) +{ +	struct inode *inode = mapping->host; + +	if (to > inode->i_size) { +		truncate_pagecache(inode, to, inode->i_size); +		hfsplus_file_truncate(inode); +	} +} +  static int hfsplus_write_begin(struct file *file, struct address_space *mapping,  			loff_t pos, unsigned len, unsigned flags,  			struct page **pagep, void **fsdata) @@ -38,11 +48,8 @@ static int hfsplus_write_begin(struct file *file, struct address_space *mapping,  	ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata,  				hfsplus_get_block,  				&HFSPLUS_I(mapping->host)->phys_size); -	if (unlikely(ret)) { -		loff_t isize = mapping->host->i_size; -		if (pos + len > isize) -			vmtruncate(mapping->host, isize); -	} +	if (unlikely(ret)) +		hfsplus_write_failed(mapping, pos + len);  	return ret;  } @@ -116,6 +123,7 @@ static ssize_t hfsplus_direct_IO(int rw, struct kiocb *iocb,  		const struct iovec *iov, loff_t offset, unsigned long nr_segs)  {  	struct file *file = iocb->ki_filp; +	struct address_space *mapping = file->f_mapping;  	struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host;  	ssize_t ret; @@ -131,7 +139,7 @@ static ssize_t hfsplus_direct_IO(int rw, struct kiocb *iocb,  		loff_t end = offset + iov_length(iov, nr_segs);  		if (end > isize) -			vmtruncate(inode, isize); +			hfsplus_write_failed(mapping, end);  	}  	return ret; @@ -300,10 +308,8 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr)  	if ((attr->ia_valid & ATTR_SIZE) &&  	    attr->ia_size != i_size_read(inode)) {  		inode_dio_wait(inode); - -		error = vmtruncate(inode, attr->ia_size); -		if (error) -			return error; +		truncate_setsize(inode, attr->ia_size); +		hfsplus_file_truncate(inode);  	}  	setattr_copy(inode, attr); @@ -358,7 +364,6 @@ int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end,  static const struct inode_operations hfsplus_file_inode_operations = {  	.lookup		= hfsplus_file_lookup, -	.truncate	= hfsplus_file_truncate,  	.setattr	= hfsplus_setattr,  	.setxattr	= hfsplus_setxattr,  	.getxattr	= hfsplus_getxattr,  |