aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ufs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ufs/inode.c')
-rw-r--r--fs/ufs/inode.c67
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
562int __ufs_write_begin(struct file *file, struct address_space *mapping, 561int 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
570static int ufs_write_begin(struct file *file, struct address_space *mapping, 566static 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
578static sector_t ufs_bmap(struct address_space *mapping, sector_t block) 583static 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
909void ufs_delete_inode (struct inode * inode) 914void 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
930no_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}