diff options
Diffstat (limited to 'fs/ufs/inode.c')
-rw-r--r-- | fs/ufs/inode.c | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 73fe773aa034..2b251f2093af 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -558,20 +558,26 @@ static int ufs_readpage(struct file *file, struct page *page) | |||
558 | return block_read_full_page(page,ufs_getfrag_block); | 558 | return block_read_full_page(page,ufs_getfrag_block); |
559 | } | 559 | } |
560 | 560 | ||
561 | int __ufs_write_begin(struct file *file, struct address_space *mapping, | 561 | int ufs_prepare_chunk(struct page *page, loff_t pos, unsigned len) |
562 | loff_t pos, unsigned len, unsigned flags, | ||
563 | struct page **pagep, void **fsdata) | ||
564 | { | 562 | { |
565 | return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata, | 563 | return __block_write_begin(page, pos, len, ufs_getfrag_block); |
566 | ufs_getfrag_block); | ||
567 | } | 564 | } |
568 | 565 | ||
569 | static int ufs_write_begin(struct file *file, struct address_space *mapping, | 566 | static int ufs_write_begin(struct file *file, struct address_space *mapping, |
570 | loff_t pos, unsigned len, unsigned flags, | 567 | loff_t pos, unsigned len, unsigned flags, |
571 | struct page **pagep, void **fsdata) | 568 | struct page **pagep, void **fsdata) |
572 | { | 569 | { |
573 | *pagep = NULL; | 570 | int ret; |
574 | return __ufs_write_begin(file, mapping, pos, len, flags, pagep, fsdata); | 571 | |
572 | ret = block_write_begin(mapping, pos, len, flags, pagep, | ||
573 | ufs_getfrag_block); | ||
574 | if (unlikely(ret)) { | ||
575 | loff_t isize = mapping->host->i_size; | ||
576 | if (pos + len > isize) | ||
577 | vmtruncate(mapping->host, isize); | ||
578 | } | ||
579 | |||
580 | return ret; | ||
575 | } | 581 | } |
576 | 582 | ||
577 | static sector_t ufs_bmap(struct address_space *mapping, sector_t block) | 583 | static sector_t ufs_bmap(struct address_space *mapping, sector_t block) |
@@ -905,24 +911,33 @@ int ufs_sync_inode (struct inode *inode) | |||
905 | return ufs_update_inode (inode, 1); | 911 | return ufs_update_inode (inode, 1); |
906 | } | 912 | } |
907 | 913 | ||
908 | void ufs_delete_inode (struct inode * inode) | 914 | void ufs_evict_inode(struct inode * inode) |
909 | { | 915 | { |
910 | loff_t old_i_size; | 916 | int want_delete = 0; |
917 | |||
918 | if (!inode->i_nlink && !is_bad_inode(inode)) | ||
919 | want_delete = 1; | ||
911 | 920 | ||
912 | truncate_inode_pages(&inode->i_data, 0); | 921 | truncate_inode_pages(&inode->i_data, 0); |
913 | if (is_bad_inode(inode)) | 922 | if (want_delete) { |
914 | goto no_delete; | 923 | loff_t old_i_size; |
915 | /*UFS_I(inode)->i_dtime = CURRENT_TIME;*/ | 924 | /*UFS_I(inode)->i_dtime = CURRENT_TIME;*/ |
916 | lock_kernel(); | 925 | lock_kernel(); |
917 | mark_inode_dirty(inode); | 926 | mark_inode_dirty(inode); |
918 | ufs_update_inode(inode, IS_SYNC(inode)); | 927 | ufs_update_inode(inode, IS_SYNC(inode)); |
919 | old_i_size = inode->i_size; | 928 | old_i_size = inode->i_size; |
920 | inode->i_size = 0; | 929 | inode->i_size = 0; |
921 | if (inode->i_blocks && ufs_truncate(inode, old_i_size)) | 930 | if (inode->i_blocks && ufs_truncate(inode, old_i_size)) |
922 | ufs_warning(inode->i_sb, __func__, "ufs_truncate failed\n"); | 931 | ufs_warning(inode->i_sb, __func__, "ufs_truncate failed\n"); |
923 | ufs_free_inode (inode); | 932 | unlock_kernel(); |
924 | unlock_kernel(); | 933 | } |
925 | return; | 934 | |
926 | no_delete: | 935 | invalidate_inode_buffers(inode); |
927 | clear_inode(inode); /* We must guarantee clearing of inode... */ | 936 | end_writeback(inode); |
937 | |||
938 | if (want_delete) { | ||
939 | lock_kernel(); | ||
940 | ufs_free_inode (inode); | ||
941 | unlock_kernel(); | ||
942 | } | ||
928 | } | 943 | } |