Btrfs: fix deadlock running delayed iputs at transaction commit time
[firefly-linux-kernel-4.4.55.git] / fs / btrfs / extent-tree.c
index c4661db2b72ae4c412adaaecb7cbc236fbe1e7cf..470ea9b321a4feed5807e316311e737345ff0c6b 100644 (file)
@@ -4100,11 +4100,12 @@ commit_trans:
                                if (ret)
                                        return ret;
                                /*
-                                * make sure that all running delayed iput are
-                                * done
+                                * The cleaner kthread might still be doing iput
+                                * operations. Wait for it to finish so that
+                                * more space is released.
                                 */
-                               down_write(&root->fs_info->delayed_iput_sem);
-                               up_write(&root->fs_info->delayed_iput_sem);
+                               mutex_lock(&root->fs_info->cleaner_delayed_iput_mutex);
+                               mutex_unlock(&root->fs_info->cleaner_delayed_iput_mutex);
                                goto again;
                        } else {
                                btrfs_end_transaction(trans, root);