switch ufs to ->evict_inode()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 5 Jun 2010 23:40:56 +0000 (19:40 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 9 Aug 2010 20:48:02 +0000 (16:48 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/ufs/ialloc.c
fs/ufs/inode.c
fs/ufs/super.c
fs/ufs/ufs.h

index 594480e..428017e 100644 (file)
@@ -94,8 +94,6 @@ void ufs_free_inode (struct inode * inode)
 
        is_directory = S_ISDIR(inode->i_mode);
 
-       clear_inode (inode);
-
        if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit))
                ufs_error(sb, "ufs_free_inode", "bit already cleared for inode %u", ino);
        else {
index 45cafa9..2b251f2 100644 (file)
@@ -911,24 +911,33 @@ int ufs_sync_inode (struct inode *inode)
        return ufs_update_inode (inode, 1);
 }
 
-void ufs_delete_inode (struct inode * inode)
+void ufs_evict_inode(struct inode * inode)
 {
-       loff_t old_i_size;
+       int want_delete = 0;
+
+       if (!inode->i_nlink && !is_bad_inode(inode))
+               want_delete = 1;
 
        truncate_inode_pages(&inode->i_data, 0);
-       if (is_bad_inode(inode))
-               goto no_delete;
-       /*UFS_I(inode)->i_dtime = CURRENT_TIME;*/
-       lock_kernel();
-       mark_inode_dirty(inode);
-       ufs_update_inode(inode, IS_SYNC(inode));
-       old_i_size = inode->i_size;
-       inode->i_size = 0;
-       if (inode->i_blocks && ufs_truncate(inode, old_i_size))
-               ufs_warning(inode->i_sb, __func__, "ufs_truncate failed\n");
-       ufs_free_inode (inode);
-       unlock_kernel();
-       return;
-no_delete:
-       clear_inode(inode);     /* We must guarantee clearing of inode... */
+       if (want_delete) {
+               loff_t old_i_size;
+               /*UFS_I(inode)->i_dtime = CURRENT_TIME;*/
+               lock_kernel();
+               mark_inode_dirty(inode);
+               ufs_update_inode(inode, IS_SYNC(inode));
+               old_i_size = inode->i_size;
+               inode->i_size = 0;
+               if (inode->i_blocks && ufs_truncate(inode, old_i_size))
+                       ufs_warning(inode->i_sb, __func__, "ufs_truncate failed\n");
+               unlock_kernel();
+       }
+
+       invalidate_inode_buffers(inode);
+       end_writeback(inode);
+
+       if (want_delete) {
+               lock_kernel();
+               ufs_free_inode (inode);
+               unlock_kernel();
+       }
 }
index 3ec5a9e..d510c1b 100644 (file)
@@ -1440,7 +1440,7 @@ static const struct super_operations ufs_super_ops = {
        .alloc_inode    = ufs_alloc_inode,
        .destroy_inode  = ufs_destroy_inode,
        .write_inode    = ufs_write_inode,
-       .delete_inode   = ufs_delete_inode,
+       .evict_inode    = ufs_evict_inode,
        .put_super      = ufs_put_super,
        .write_super    = ufs_write_super,
        .sync_fs        = ufs_sync_fs,
index 179ae6b..c08782e 100644 (file)
@@ -108,7 +108,7 @@ extern struct inode * ufs_new_inode (struct inode *, int);
 extern struct inode *ufs_iget(struct super_block *, unsigned long);
 extern int ufs_write_inode (struct inode *, struct writeback_control *);
 extern int ufs_sync_inode (struct inode *);
-extern void ufs_delete_inode (struct inode *);
+extern void ufs_evict_inode (struct inode *);
 extern struct buffer_head * ufs_bread (struct inode *, unsigned, int, int *);
 extern int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_head *bh_result, int create);