diff options
Diffstat (limited to 'fs/ufs/inode.c')
-rw-r--r-- | fs/ufs/inode.c | 67 |
1 files changed, 39 insertions, 28 deletions
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 80b68c3702d1..2b251f2093af 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include <linux/smp_lock.h> | 37 | #include <linux/smp_lock.h> |
38 | #include <linux/buffer_head.h> | 38 | #include <linux/buffer_head.h> |
39 | #include <linux/writeback.h> | 39 | #include <linux/writeback.h> |
40 | #include <linux/quotaops.h> | ||
41 | 40 | ||
42 | #include "ufs_fs.h" | 41 | #include "ufs_fs.h" |
43 | #include "ufs.h" | 42 | #include "ufs.h" |
@@ -559,20 +558,26 @@ static int ufs_readpage(struct file *file, struct page *page) | |||
559 | return block_read_full_page(page,ufs_getfrag_block); | 558 | return block_read_full_page(page,ufs_getfrag_block); |
560 | } | 559 | } |
561 | 560 | ||
562 | int __ufs_write_begin(struct file *file, struct address_space *mapping, | 561 | int ufs_prepare_chunk(struct page *page, loff_t pos, unsigned len) |
563 | loff_t pos, unsigned len, unsigned flags, | ||
564 | struct page **pagep, void **fsdata) | ||
565 | { | 562 | { |
566 | return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata, | 563 | return __block_write_begin(page, pos, len, ufs_getfrag_block); |
567 | ufs_getfrag_block); | ||
568 | } | 564 | } |
569 | 565 | ||
570 | 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, |
571 | loff_t pos, unsigned len, unsigned flags, | 567 | loff_t pos, unsigned len, unsigned flags, |
572 | struct page **pagep, void **fsdata) | 568 | struct page **pagep, void **fsdata) |
573 | { | 569 | { |
574 | *pagep = NULL; | 570 | int ret; |
575 | 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; | ||
576 | } | 581 | } |
577 | 582 | ||
578 | 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) |
@@ -603,7 +608,7 @@ static void ufs_set_inode_ops(struct inode *inode) | |||
603 | if (!inode->i_blocks) | 608 | if (!inode->i_blocks) |
604 | inode->i_op = &ufs_fast_symlink_inode_operations; | 609 | inode->i_op = &ufs_fast_symlink_inode_operations; |
605 | else { | 610 | else { |
606 | inode->i_op = &page_symlink_inode_operations; | 611 | inode->i_op = &ufs_symlink_inode_operations; |
607 | inode->i_mapping->a_ops = &ufs_aops; | 612 | inode->i_mapping->a_ops = &ufs_aops; |
608 | } | 613 | } |
609 | } else | 614 | } else |
@@ -906,27 +911,33 @@ int ufs_sync_inode (struct inode *inode) | |||
906 | return ufs_update_inode (inode, 1); | 911 | return ufs_update_inode (inode, 1); |
907 | } | 912 | } |
908 | 913 | ||
909 | void ufs_delete_inode (struct inode * inode) | 914 | void ufs_evict_inode(struct inode * inode) |
910 | { | 915 | { |
911 | loff_t old_i_size; | 916 | int want_delete = 0; |
912 | 917 | ||
913 | if (!is_bad_inode(inode)) | 918 | if (!inode->i_nlink && !is_bad_inode(inode)) |
914 | dquot_initialize(inode); | 919 | want_delete = 1; |
915 | 920 | ||
916 | truncate_inode_pages(&inode->i_data, 0); | 921 | truncate_inode_pages(&inode->i_data, 0); |
917 | if (is_bad_inode(inode)) | 922 | if (want_delete) { |
918 | goto no_delete; | 923 | loff_t old_i_size; |
919 | /*UFS_I(inode)->i_dtime = CURRENT_TIME;*/ | 924 | /*UFS_I(inode)->i_dtime = CURRENT_TIME;*/ |
920 | lock_kernel(); | 925 | lock_kernel(); |
921 | mark_inode_dirty(inode); | 926 | mark_inode_dirty(inode); |
922 | ufs_update_inode(inode, IS_SYNC(inode)); | 927 | ufs_update_inode(inode, IS_SYNC(inode)); |
923 | old_i_size = inode->i_size; | 928 | old_i_size = inode->i_size; |
924 | inode->i_size = 0; | 929 | inode->i_size = 0; |
925 | if (inode->i_blocks && ufs_truncate(inode, old_i_size)) | 930 | if (inode->i_blocks && ufs_truncate(inode, old_i_size)) |
926 | ufs_warning(inode->i_sb, __func__, "ufs_truncate failed\n"); | 931 | ufs_warning(inode->i_sb, __func__, "ufs_truncate failed\n"); |
927 | ufs_free_inode (inode); | 932 | unlock_kernel(); |
928 | unlock_kernel(); | 933 | } |
929 | return; | 934 | |
930 | no_delete: | 935 | invalidate_inode_buffers(inode); |
931 | 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 | } | ||
932 | } | 943 | } |