|
@@ -3818,6 +3818,7 @@ void close_ctree(struct btrfs_fs_info *fs_info)
|
|
|
set_bit(BTRFS_FS_CLOSING_DONE, &fs_info->flags);
|
|
|
|
|
|
btrfs_free_qgroup_config(fs_info);
|
|
|
+ ASSERT(list_empty(&fs_info->delalloc_roots));
|
|
|
|
|
|
if (percpu_counter_sum(&fs_info->delalloc_bytes)) {
|
|
|
btrfs_info(fs_info, "at unmount delalloc count %lld",
|
|
@@ -4125,15 +4126,15 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info)
|
|
|
|
|
|
static void btrfs_error_commit_super(struct btrfs_fs_info *fs_info)
|
|
|
{
|
|
|
+ /* cleanup FS via transaction */
|
|
|
+ btrfs_cleanup_transaction(fs_info);
|
|
|
+
|
|
|
mutex_lock(&fs_info->cleaner_mutex);
|
|
|
btrfs_run_delayed_iputs(fs_info);
|
|
|
mutex_unlock(&fs_info->cleaner_mutex);
|
|
|
|
|
|
down_write(&fs_info->cleanup_work_sem);
|
|
|
up_write(&fs_info->cleanup_work_sem);
|
|
|
-
|
|
|
- /* cleanup FS via transaction */
|
|
|
- btrfs_cleanup_transaction(fs_info);
|
|
|
}
|
|
|
|
|
|
static void btrfs_destroy_ordered_extents(struct btrfs_root *root)
|
|
@@ -4258,19 +4259,23 @@ static void btrfs_destroy_delalloc_inodes(struct btrfs_root *root)
|
|
|
list_splice_init(&root->delalloc_inodes, &splice);
|
|
|
|
|
|
while (!list_empty(&splice)) {
|
|
|
+ struct inode *inode = NULL;
|
|
|
btrfs_inode = list_first_entry(&splice, struct btrfs_inode,
|
|
|
delalloc_inodes);
|
|
|
-
|
|
|
- list_del_init(&btrfs_inode->delalloc_inodes);
|
|
|
- clear_bit(BTRFS_INODE_IN_DELALLOC_LIST,
|
|
|
- &btrfs_inode->runtime_flags);
|
|
|
+ __btrfs_del_delalloc_inode(root, btrfs_inode);
|
|
|
spin_unlock(&root->delalloc_lock);
|
|
|
|
|
|
- btrfs_invalidate_inodes(btrfs_inode->root);
|
|
|
-
|
|
|
+ /*
|
|
|
+ * Make sure we get a live inode and that it'll not disappear
|
|
|
+ * meanwhile.
|
|
|
+ */
|
|
|
+ inode = igrab(&btrfs_inode->vfs_inode);
|
|
|
+ if (inode) {
|
|
|
+ invalidate_inode_pages2(inode->i_mapping);
|
|
|
+ iput(inode);
|
|
|
+ }
|
|
|
spin_lock(&root->delalloc_lock);
|
|
|
}
|
|
|
-
|
|
|
spin_unlock(&root->delalloc_lock);
|
|
|
}
|
|
|
|
|
@@ -4286,7 +4291,6 @@ static void btrfs_destroy_all_delalloc_inodes(struct btrfs_fs_info *fs_info)
|
|
|
while (!list_empty(&splice)) {
|
|
|
root = list_first_entry(&splice, struct btrfs_root,
|
|
|
delalloc_root);
|
|
|
- list_del_init(&root->delalloc_root);
|
|
|
root = btrfs_grab_fs_root(root);
|
|
|
BUG_ON(!root);
|
|
|
spin_unlock(&fs_info->delalloc_root_lock);
|