ret = -EINPROGRESS;
                goto out;
        }
-       trans = btrfs_start_transaction(root, 0);
+
+       mutex_lock(&root->fs_info->trans_mutex);
+       root->fs_info->open_ioctl_trans++;
+       mutex_unlock(&root->fs_info->trans_mutex);
+
+       trans = btrfs_start_ioctl_transaction(root, 0);
        if (trans)
                file->private_data = trans;
        else
        }
        btrfs_end_transaction(trans, root);
        file->private_data = 0;
+
+       mutex_lock(&root->fs_info->trans_mutex);
+       root->fs_info->open_ioctl_trans--;
+       mutex_unlock(&root->fs_info->trans_mutex);
+
 out:
        return ret;
 }
 
 }
 
 struct btrfs_trans_handle *start_transaction(struct btrfs_root *root,
-                                            int num_blocks, int join)
+                                            int num_blocks, int wait)
 {
        struct btrfs_trans_handle *h =
                kmem_cache_alloc(btrfs_trans_handle_cachep, GFP_NOFS);
        int ret;
 
        mutex_lock(&root->fs_info->trans_mutex);
-       if (!join)
+       if ((wait == 1 && !root->fs_info->open_ioctl_trans) || wait == 2)
                wait_current_trans(root);
        ret = join_transaction(root);
        BUG_ON(ret);
 struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root,
                                                   int num_blocks)
 {
-       return start_transaction(root, num_blocks, 0);
+       return start_transaction(root, num_blocks, 1);
 }
 struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root,
                                                   int num_blocks)
 {
-       return start_transaction(root, num_blocks, 1);
+       return start_transaction(root, num_blocks, 0);
 }
 
+struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *r,
+                                                        int num_blocks)
+{
+       return start_transaction(r, num_blocks, 2);
+}
+
+
 static noinline int wait_for_commit(struct btrfs_root *root,
                                    struct btrfs_transaction *commit)
 {
 void btrfs_throttle(struct btrfs_root *root)
 {
        mutex_lock(&root->fs_info->trans_mutex);
-       wait_current_trans(root);
+       if (!root->fs_info->open_ioctl_trans)
+               wait_current_trans(root);
        mutex_unlock(&root->fs_info->trans_mutex);
 
        throttle_on_drops(root);
 
                                                   int num_blocks);
 struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root,
                                                   int num_blocks);
+struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *r,
+                                                  int num_blocks);
 int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
                                     struct btrfs_root *root);
 int btrfs_commit_tree_roots(struct btrfs_trans_handle *trans,