diff options
Diffstat (limited to 'fs/hpfs')
| -rw-r--r-- | fs/hpfs/file.c | 11 | ||||
| -rw-r--r-- | fs/hpfs/hpfs_fn.h | 2 | ||||
| -rw-r--r-- | fs/hpfs/inode.c | 24 | ||||
| -rw-r--r-- | fs/hpfs/super.c | 2 |
4 files changed, 28 insertions, 11 deletions
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index a9ae9bfa752f..c0340887c7ea 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c | |||
| @@ -97,10 +97,19 @@ static int hpfs_write_begin(struct file *file, struct address_space *mapping, | |||
| 97 | loff_t pos, unsigned len, unsigned flags, | 97 | loff_t pos, unsigned len, unsigned flags, |
| 98 | struct page **pagep, void **fsdata) | 98 | struct page **pagep, void **fsdata) |
| 99 | { | 99 | { |
| 100 | int ret; | ||
| 101 | |||
| 100 | *pagep = NULL; | 102 | *pagep = NULL; |
| 101 | return cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, | 103 | ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, |
| 102 | hpfs_get_block, | 104 | hpfs_get_block, |
| 103 | &hpfs_i(mapping->host)->mmu_private); | 105 | &hpfs_i(mapping->host)->mmu_private); |
| 106 | if (unlikely(ret)) { | ||
| 107 | loff_t isize = mapping->host->i_size; | ||
| 108 | if (pos + len > isize) | ||
| 109 | vmtruncate(mapping->host, isize); | ||
| 110 | } | ||
| 111 | |||
| 112 | return ret; | ||
| 104 | } | 113 | } |
| 105 | 114 | ||
| 106 | static sector_t _hpfs_bmap(struct address_space *mapping, sector_t block) | 115 | static sector_t _hpfs_bmap(struct address_space *mapping, sector_t block) |
diff --git a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h index 75f9d4324851..b59eac0232a0 100644 --- a/fs/hpfs/hpfs_fn.h +++ b/fs/hpfs/hpfs_fn.h | |||
| @@ -281,7 +281,7 @@ void hpfs_write_inode(struct inode *); | |||
| 281 | void hpfs_write_inode_nolock(struct inode *); | 281 | void hpfs_write_inode_nolock(struct inode *); |
| 282 | int hpfs_setattr(struct dentry *, struct iattr *); | 282 | int hpfs_setattr(struct dentry *, struct iattr *); |
| 283 | void hpfs_write_if_changed(struct inode *); | 283 | void hpfs_write_if_changed(struct inode *); |
| 284 | void hpfs_delete_inode(struct inode *); | 284 | void hpfs_evict_inode(struct inode *); |
| 285 | 285 | ||
| 286 | /* map.c */ | 286 | /* map.c */ |
| 287 | 287 | ||
diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index 1042a9bc97f3..56f0da1cfd10 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c | |||
| @@ -277,9 +277,15 @@ int hpfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 277 | if (error) | 277 | if (error) |
| 278 | goto out_unlock; | 278 | goto out_unlock; |
| 279 | 279 | ||
| 280 | error = inode_setattr(inode, attr); | 280 | if ((attr->ia_valid & ATTR_SIZE) && |
| 281 | if (error) | 281 | attr->ia_size != i_size_read(inode)) { |
| 282 | goto out_unlock; | 282 | error = vmtruncate(inode, attr->ia_size); |
| 283 | if (error) | ||
| 284 | return error; | ||
| 285 | } | ||
| 286 | |||
| 287 | setattr_copy(inode, attr); | ||
| 288 | mark_inode_dirty(inode); | ||
| 283 | 289 | ||
| 284 | hpfs_write_inode(inode); | 290 | hpfs_write_inode(inode); |
| 285 | 291 | ||
| @@ -296,11 +302,13 @@ void hpfs_write_if_changed(struct inode *inode) | |||
| 296 | hpfs_write_inode(inode); | 302 | hpfs_write_inode(inode); |
| 297 | } | 303 | } |
| 298 | 304 | ||
| 299 | void hpfs_delete_inode(struct inode *inode) | 305 | void hpfs_evict_inode(struct inode *inode) |
| 300 | { | 306 | { |
| 301 | truncate_inode_pages(&inode->i_data, 0); | 307 | truncate_inode_pages(&inode->i_data, 0); |
| 302 | lock_kernel(); | 308 | end_writeback(inode); |
| 303 | hpfs_remove_fnode(inode->i_sb, inode->i_ino); | 309 | if (!inode->i_nlink) { |
| 304 | unlock_kernel(); | 310 | lock_kernel(); |
| 305 | clear_inode(inode); | 311 | hpfs_remove_fnode(inode->i_sb, inode->i_ino); |
| 312 | unlock_kernel(); | ||
| 313 | } | ||
| 306 | } | 314 | } |
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index aa53842c599c..2607010be2fe 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c | |||
| @@ -450,7 +450,7 @@ static const struct super_operations hpfs_sops = | |||
| 450 | { | 450 | { |
| 451 | .alloc_inode = hpfs_alloc_inode, | 451 | .alloc_inode = hpfs_alloc_inode, |
| 452 | .destroy_inode = hpfs_destroy_inode, | 452 | .destroy_inode = hpfs_destroy_inode, |
| 453 | .delete_inode = hpfs_delete_inode, | 453 | .evict_inode = hpfs_evict_inode, |
| 454 | .put_super = hpfs_put_super, | 454 | .put_super = hpfs_put_super, |
| 455 | .statfs = hpfs_statfs, | 455 | .statfs = hpfs_statfs, |
| 456 | .remount_fs = hpfs_remount_fs, | 456 | .remount_fs = hpfs_remount_fs, |
