From ea254a20fe3b065f806404c0963c5fd2dc7946a8 Mon Sep 17 00:00:00 2001 From: Marco Stornelli Date: Sat, 15 Dec 2012 11:58:36 +0100 Subject: [PATCH] --- yaml --- r: 347809 b: refs/heads/master c: 9014da7525dffef69131f717decf262e08ff3d58 h: refs/heads/master i: 347807: d0fe0ecc3a657913eaf54d809c4f64a5e56850fb v: v3 --- [refs] | 2 +- trunk/fs/ntfs/file.c | 16 +++++++++++++--- trunk/fs/ntfs/inode.c | 8 ++++++-- trunk/fs/ntfs/inode.h | 4 ++++ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 0de3b01b394e..1396437d1c31 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2d1b399b22a8042edbaf41b1f2086d4183422ce4 +refs/heads/master: 9014da7525dffef69131f717decf262e08ff3d58 diff --git a/trunk/fs/ntfs/file.c b/trunk/fs/ntfs/file.c index 1ecf46448f85..5b2d4f0853ac 100644 --- a/trunk/fs/ntfs/file.c +++ b/trunk/fs/ntfs/file.c @@ -1762,6 +1762,16 @@ static int ntfs_commit_pages_after_write(struct page **pages, return err; } +static void ntfs_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); + ntfs_truncate_vfs(inode); + } +} + /** * ntfs_file_buffered_write - * @@ -2022,8 +2032,9 @@ static ssize_t ntfs_file_buffered_write(struct kiocb *iocb, * allocated space, which is not a disaster. */ i_size = i_size_read(vi); - if (pos + bytes > i_size) - vmtruncate(vi, i_size); + if (pos + bytes > i_size) { + ntfs_write_failed(mapping, pos + bytes); + } break; } } @@ -2227,7 +2238,6 @@ const struct file_operations ntfs_file_ops = { const struct inode_operations ntfs_file_inode_ops = { #ifdef NTFS_RW - .truncate = ntfs_truncate_vfs, .setattr = ntfs_setattr, #endif /* NTFS_RW */ }; diff --git a/trunk/fs/ntfs/inode.c b/trunk/fs/ntfs/inode.c index 1d27331e6fc9..d3e118cc6ffa 100644 --- a/trunk/fs/ntfs/inode.c +++ b/trunk/fs/ntfs/inode.c @@ -2866,9 +2866,11 @@ int ntfs_truncate(struct inode *vi) * * See ntfs_truncate() description above for details. */ +#ifdef NTFS_RW void ntfs_truncate_vfs(struct inode *vi) { ntfs_truncate(vi); } +#endif /** * ntfs_setattr - called from notify_change() when an attribute is being changed @@ -2914,8 +2916,10 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr) NInoCompressed(ni) ? "compressed" : "encrypted"); err = -EOPNOTSUPP; - } else - err = vmtruncate(vi, attr->ia_size); + } else { + truncate_setsize(vi, attr->ia_size); + ntfs_truncate_vfs(vi); + } if (err || ia_valid == ATTR_SIZE) goto out; } else { diff --git a/trunk/fs/ntfs/inode.h b/trunk/fs/ntfs/inode.h index db29695f845c..76b6cfb579d7 100644 --- a/trunk/fs/ntfs/inode.h +++ b/trunk/fs/ntfs/inode.h @@ -316,6 +316,10 @@ static inline void ntfs_commit_inode(struct inode *vi) return; } +#else + +static inline void ntfs_truncate_vfs(struct inode *vi) {} + #endif /* NTFS_RW */ #endif /* _LINUX_NTFS_INODE_H */