aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 29c20092847..394d5422ab6 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 95eac011696..ce02199ec4e 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 f2393b39031..1776dbd8dc9 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,