btrfs: make send work with concurrent block group relocation
[platform/kernel/linux-rpi.git] / fs / btrfs / relocation.c
index a050f97..a6661f2 100644 (file)
@@ -3854,25 +3854,14 @@ out:
  *   0             success
  *   -EINPROGRESS  operation is already in progress, that's probably a bug
  *   -ECANCELED    cancellation request was set before the operation started
- *   -EAGAIN       can not start because there are ongoing send operations
  */
 static int reloc_chunk_start(struct btrfs_fs_info *fs_info)
 {
-       spin_lock(&fs_info->send_reloc_lock);
-       if (fs_info->send_in_progress) {
-               btrfs_warn_rl(fs_info,
-"cannot run relocation while send operations are in progress (%d in progress)",
-                             fs_info->send_in_progress);
-               spin_unlock(&fs_info->send_reloc_lock);
-               return -EAGAIN;
-       }
        if (test_and_set_bit(BTRFS_FS_RELOC_RUNNING, &fs_info->flags)) {
                /* This should not happen */
-               spin_unlock(&fs_info->send_reloc_lock);
                btrfs_err(fs_info, "reloc already running, cannot start");
                return -EINPROGRESS;
        }
-       spin_unlock(&fs_info->send_reloc_lock);
 
        if (atomic_read(&fs_info->reloc_cancel_req) > 0) {
                btrfs_info(fs_info, "chunk relocation canceled on start");
@@ -3894,9 +3883,7 @@ static void reloc_chunk_end(struct btrfs_fs_info *fs_info)
        /* Requested after start, clear bit first so any waiters can continue */
        if (atomic_read(&fs_info->reloc_cancel_req) > 0)
                btrfs_info(fs_info, "chunk relocation canceled during operation");
-       spin_lock(&fs_info->send_reloc_lock);
        clear_and_wake_up_bit(BTRFS_FS_RELOC_RUNNING, &fs_info->flags);
-       spin_unlock(&fs_info->send_reloc_lock);
        atomic_set(&fs_info->reloc_cancel_req, 0);
 }