aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2010-06-07 11:35:40 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2010-08-09 16:48:22 -0400
commitbd55597520a2eaa0d71dd7683513a14bfd1bdf5c (patch)
treeb99685fe2d9b6c9ad87b7d3e6a8fc47a5ac248ce
parentd5c1515cf374951f07e5bf97b6ff3718d3401b6f (diff)
convert btrfs to ->evict_inode()
NB: do we want btrfs_wait_ordered_range() on eviction of inodes with positive i_nlink on subvolume with zero root_refs? If not, btrfs_evict_inode() can be simplified by unconditionally bailing out in case of i_nlink > 0 in the very beginning... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/btrfs/ctree.h2
-rw-r--r--fs/btrfs/inode.c8
-rw-r--r--fs/btrfs/super.c2
3 files changed, 8 insertions, 4 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 29c20092847e..394d5422ab6a 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -2389,7 +2389,7 @@ unsigned long btrfs_force_ra(struct address_space *mapping,
2389 pgoff_t offset, pgoff_t last_index); 2389 pgoff_t offset, pgoff_t last_index);
2390int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); 2390int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf);
2391int btrfs_readpage(struct file *file, struct page *page); 2391int btrfs_readpage(struct file *file, struct page *page);
2392void btrfs_delete_inode(struct inode *inode); 2392void btrfs_evict_inode(struct inode *inode);
2393void btrfs_put_inode(struct inode *inode); 2393void btrfs_put_inode(struct inode *inode);
2394int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc); 2394int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc);
2395void btrfs_dirty_inode(struct inode *inode); 2395void btrfs_dirty_inode(struct inode *inode);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 95eac0116963..ce02199ec4e5 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3668,7 +3668,7 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr)
3668 return err; 3668 return err;
3669} 3669}
3670 3670
3671void btrfs_delete_inode(struct inode *inode) 3671void btrfs_evict_inode(struct inode *inode)
3672{ 3672{
3673 struct btrfs_trans_handle *trans; 3673 struct btrfs_trans_handle *trans;
3674 struct btrfs_root *root = BTRFS_I(inode)->root; 3674 struct btrfs_root *root = BTRFS_I(inode)->root;
@@ -3676,10 +3676,14 @@ void btrfs_delete_inode(struct inode *inode)
3676 int ret; 3676 int ret;
3677 3677
3678 truncate_inode_pages(&inode->i_data, 0); 3678 truncate_inode_pages(&inode->i_data, 0);
3679 if (inode->i_nlink && btrfs_root_refs(&root->root_item) != 0)
3680 goto no_delete;
3681
3679 if (is_bad_inode(inode)) { 3682 if (is_bad_inode(inode)) {
3680 btrfs_orphan_del(NULL, inode); 3683 btrfs_orphan_del(NULL, inode);
3681 goto no_delete; 3684 goto no_delete;
3682 } 3685 }
3686 /* do we really want it for ->i_nlink > 0 and zero btrfs_root_refs? */
3683 btrfs_wait_ordered_range(inode, 0, (u64)-1); 3687 btrfs_wait_ordered_range(inode, 0, (u64)-1);
3684 3688
3685 if (root->fs_info->log_root_recovering) { 3689 if (root->fs_info->log_root_recovering) {
@@ -3729,7 +3733,7 @@ void btrfs_delete_inode(struct inode *inode)
3729 btrfs_end_transaction(trans, root); 3733 btrfs_end_transaction(trans, root);
3730 btrfs_btree_balance_dirty(root, nr); 3734 btrfs_btree_balance_dirty(root, nr);
3731no_delete: 3735no_delete:
3732 clear_inode(inode); 3736 end_writeback(inode);
3733 return; 3737 return;
3734} 3738}
3735 3739
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index f2393b390318..1776dbd8dc98 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -797,7 +797,7 @@ static int btrfs_unfreeze(struct super_block *sb)
797 797
798static const struct super_operations btrfs_super_ops = { 798static const struct super_operations btrfs_super_ops = {
799 .drop_inode = btrfs_drop_inode, 799 .drop_inode = btrfs_drop_inode,
800 .delete_inode = btrfs_delete_inode, 800 .evict_inode = btrfs_evict_inode,
801 .put_super = btrfs_put_super, 801 .put_super = btrfs_put_super,
802 .sync_fs = btrfs_sync_fs, 802 .sync_fs = btrfs_sync_fs,
803 .show_options = btrfs_show_options, 803 .show_options = btrfs_show_options,