btrfs: fix iterator with update error in backref.c
[deliverable/linux.git] / fs / btrfs / transaction.c
index 418c6a2ad7d88658f8624d99a1ba0e9e84c13d45..fc82b02aff5cc9f8a8bb81b3bb2e6569e0fb8aab 100644 (file)
@@ -274,7 +274,6 @@ loop:
        cur_trans->num_dirty_bgs = 0;
        spin_lock_init(&cur_trans->dirty_bgs_lock);
        INIT_LIST_HEAD(&cur_trans->deleted_bgs);
-       spin_lock_init(&cur_trans->deleted_bgs_lock);
        spin_lock_init(&cur_trans->dropped_roots_lock);
        list_add_tail(&cur_trans->list, &fs_info->trans_list);
        extent_io_tree_init(&cur_trans->dirty_pages,
@@ -592,6 +591,38 @@ struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root,
        return start_transaction(root, num_items, TRANS_START,
                                 BTRFS_RESERVE_FLUSH_ALL);
 }
+struct btrfs_trans_handle *btrfs_start_transaction_fallback_global_rsv(
+                                       struct btrfs_root *root,
+                                       unsigned int num_items,
+                                       int min_factor)
+{
+       struct btrfs_trans_handle *trans;
+       u64 num_bytes;
+       int ret;
+
+       trans = btrfs_start_transaction(root, num_items);
+       if (!IS_ERR(trans) || PTR_ERR(trans) != -ENOSPC)
+               return trans;
+
+       trans = btrfs_start_transaction(root, 0);
+       if (IS_ERR(trans))
+               return trans;
+
+       num_bytes = btrfs_calc_trans_metadata_size(root, num_items);
+       ret = btrfs_cond_migrate_bytes(root->fs_info,
+                                      &root->fs_info->trans_block_rsv,
+                                      num_bytes,
+                                      min_factor);
+       if (ret) {
+               btrfs_end_transaction(trans, root);
+               return ERR_PTR(ret);
+       }
+
+       trans->block_rsv = &root->fs_info->trans_block_rsv;
+       trans->bytes_reserved = num_bytes;
+
+       return trans;
+}
 
 struct btrfs_trans_handle *btrfs_start_transaction_lflush(
                                        struct btrfs_root *root,
@@ -603,17 +634,20 @@ struct btrfs_trans_handle *btrfs_start_transaction_lflush(
 
 struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root)
 {
-       return start_transaction(root, 0, TRANS_JOIN, 0);
+       return start_transaction(root, 0, TRANS_JOIN,
+                                BTRFS_RESERVE_NO_FLUSH);
 }
 
 struct btrfs_trans_handle *btrfs_join_transaction_nolock(struct btrfs_root *root)
 {
-       return start_transaction(root, 0, TRANS_JOIN_NOLOCK, 0);
+       return start_transaction(root, 0, TRANS_JOIN_NOLOCK,
+                                BTRFS_RESERVE_NO_FLUSH);
 }
 
 struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *root)
 {
-       return start_transaction(root, 0, TRANS_USERSPACE, 0);
+       return start_transaction(root, 0, TRANS_USERSPACE,
+                                BTRFS_RESERVE_NO_FLUSH);
 }
 
 /*
@@ -631,7 +665,8 @@ struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *root
  */
 struct btrfs_trans_handle *btrfs_attach_transaction(struct btrfs_root *root)
 {
-       return start_transaction(root, 0, TRANS_ATTACH, 0);
+       return start_transaction(root, 0, TRANS_ATTACH,
+                                BTRFS_RESERVE_NO_FLUSH);
 }
 
 /*
@@ -646,7 +681,8 @@ btrfs_attach_transaction_barrier(struct btrfs_root *root)
 {
        struct btrfs_trans_handle *trans;
 
-       trans = start_transaction(root, 0, TRANS_ATTACH, 0);
+       trans = start_transaction(root, 0, TRANS_ATTACH,
+                                 BTRFS_RESERVE_NO_FLUSH);
        if (IS_ERR(trans) && PTR_ERR(trans) == -ENOENT)
                btrfs_wait_for_commit(root, 0);
 
This page took 0.041911 seconds and 5 git commands to generate.