diff options
Diffstat (limited to 'fs/hfs/extent.c')
-rw-r--r-- | fs/hfs/extent.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/fs/hfs/extent.c b/fs/hfs/extent.c index 5ea6b3d45eaa..c176f67ba0a5 100644 --- a/fs/hfs/extent.c +++ b/fs/hfs/extent.c | |||
@@ -464,23 +464,20 @@ void hfs_file_truncate(struct inode *inode) | |||
464 | (long long)HFS_I(inode)->phys_size, inode->i_size); | 464 | (long long)HFS_I(inode)->phys_size, inode->i_size); |
465 | if (inode->i_size > HFS_I(inode)->phys_size) { | 465 | if (inode->i_size > HFS_I(inode)->phys_size) { |
466 | struct address_space *mapping = inode->i_mapping; | 466 | struct address_space *mapping = inode->i_mapping; |
467 | void *fsdata; | ||
467 | struct page *page; | 468 | struct page *page; |
468 | int res; | 469 | int res; |
469 | 470 | ||
471 | /* XXX: Can use generic_cont_expand? */ | ||
470 | size = inode->i_size - 1; | 472 | size = inode->i_size - 1; |
471 | page = grab_cache_page(mapping, size >> PAGE_CACHE_SHIFT); | 473 | res = pagecache_write_begin(NULL, mapping, size+1, 0, |
472 | if (!page) | 474 | AOP_FLAG_UNINTERRUPTIBLE, &page, &fsdata); |
473 | return; | 475 | if (!res) { |
474 | size &= PAGE_CACHE_SIZE - 1; | 476 | res = pagecache_write_end(NULL, mapping, size+1, 0, 0, |
475 | size++; | 477 | page, fsdata); |
476 | res = mapping->a_ops->prepare_write(NULL, page, size, size); | 478 | } |
477 | if (!res) | ||
478 | res = mapping->a_ops->commit_write(NULL, page, size, size); | ||
479 | if (res) | 479 | if (res) |
480 | inode->i_size = HFS_I(inode)->phys_size; | 480 | inode->i_size = HFS_I(inode)->phys_size; |
481 | unlock_page(page); | ||
482 | page_cache_release(page); | ||
483 | mark_inode_dirty(inode); | ||
484 | return; | 481 | return; |
485 | } else if (inode->i_size == HFS_I(inode)->phys_size) | 482 | } else if (inode->i_size == HFS_I(inode)->phys_size) |
486 | return; | 483 | return; |