aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2/inode.c
diff options
context:
space:
mode:
authorMarco Stornelli <marco.stornelli@gmail.com>2012-12-15 05:57:37 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2012-12-20 18:40:54 -0500
commit2d1b399b22a8042edbaf41b1f2086d4183422ce4 (patch)
treee8d0b0799ae88766a41f27eb9ce0de5664b381bd /fs/nilfs2/inode.c
parent3e7a806928ac2dcae1423d6879e4f7e86e59bb9e (diff)
nilfs2: drop vmtruncate
Removed vmtruncate Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/nilfs2/inode.c')
-rw-r--r--fs/nilfs2/inode.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c
index 4d31d2cca7fd..6b49f14eac8c 100644
--- a/fs/nilfs2/inode.c
+++ b/fs/nilfs2/inode.c
@@ -213,6 +213,16 @@ static int nilfs_set_page_dirty(struct page *page)
213 return ret; 213 return ret;
214} 214}
215 215
216void nilfs_write_failed(struct address_space *mapping, loff_t to)
217{
218 struct inode *inode = mapping->host;
219
220 if (to > inode->i_size) {
221 truncate_pagecache(inode, to, inode->i_size);
222 nilfs_truncate(inode);
223 }
224}
225
216static int nilfs_write_begin(struct file *file, struct address_space *mapping, 226static int nilfs_write_begin(struct file *file, struct address_space *mapping,
217 loff_t pos, unsigned len, unsigned flags, 227 loff_t pos, unsigned len, unsigned flags,
218 struct page **pagep, void **fsdata) 228 struct page **pagep, void **fsdata)
@@ -227,10 +237,7 @@ static int nilfs_write_begin(struct file *file, struct address_space *mapping,
227 err = block_write_begin(mapping, pos, len, flags, pagep, 237 err = block_write_begin(mapping, pos, len, flags, pagep,
228 nilfs_get_block); 238 nilfs_get_block);
229 if (unlikely(err)) { 239 if (unlikely(err)) {
230 loff_t isize = mapping->host->i_size; 240 nilfs_write_failed(mapping, pos + len);
231 if (pos + len > isize)
232 vmtruncate(mapping->host, isize);
233
234 nilfs_transaction_abort(inode->i_sb); 241 nilfs_transaction_abort(inode->i_sb);
235 } 242 }
236 return err; 243 return err;
@@ -259,6 +266,7 @@ nilfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
259 loff_t offset, unsigned long nr_segs) 266 loff_t offset, unsigned long nr_segs)
260{ 267{
261 struct file *file = iocb->ki_filp; 268 struct file *file = iocb->ki_filp;
269 struct address_space *mapping = file->f_mapping;
262 struct inode *inode = file->f_mapping->host; 270 struct inode *inode = file->f_mapping->host;
263 ssize_t size; 271 ssize_t size;
264 272
@@ -278,7 +286,7 @@ nilfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
278 loff_t end = offset + iov_length(iov, nr_segs); 286 loff_t end = offset + iov_length(iov, nr_segs);
279 287
280 if (end > isize) 288 if (end > isize)
281 vmtruncate(inode, isize); 289 nilfs_write_failed(mapping, end);
282 } 290 }
283 291
284 return size; 292 return size;
@@ -786,10 +794,8 @@ int nilfs_setattr(struct dentry *dentry, struct iattr *iattr)
786 if ((iattr->ia_valid & ATTR_SIZE) && 794 if ((iattr->ia_valid & ATTR_SIZE) &&
787 iattr->ia_size != i_size_read(inode)) { 795 iattr->ia_size != i_size_read(inode)) {
788 inode_dio_wait(inode); 796 inode_dio_wait(inode);
789 797 truncate_setsize(inode, iattr->ia_size);
790 err = vmtruncate(inode, iattr->ia_size); 798 nilfs_truncate(inode);
791 if (unlikely(err))
792 goto out_err;
793 } 799 }
794 800
795 setattr_copy(inode, iattr); 801 setattr_copy(inode, iattr);