Btrfs: fix ioctl-initiated transactions vs wait_current_trans()
[linux-2.6-block.git] / fs / btrfs / ioctl.c
index 224da287b3ed8b3cab67046d8b53949ae3480495..0b63c3c77cfde594653e4c0b1145cfd34acb98fa 100644 (file)
@@ -715,7 +715,12 @@ long btrfs_ioctl_trans_start(struct file *file)
                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
@@ -745,6 +750,11 @@ long btrfs_ioctl_trans_end(struct file *file)
        }
        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;
 }