Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37c4146d authored by Liu Bo's avatar Liu Bo Committed by Josef Bacik
Browse files

Btrfs: fix a deadlock in aborting transaction due to ENOSPC



When committing a transaction, we may bail out of running delayed refs
due to ENOSPC, and then abort the current transaction to flip into readonly.

But we'll hit a deadlock on ref head's lock since we forget to release
its lock and other cleanup stuff.

Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
parent 6c1500f2
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2297,6 +2297,9 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans,
				kfree(extent_op);

				if (ret) {
					list_del_init(&locked_ref->cluster);
					mutex_unlock(&locked_ref->mutex);

					printk(KERN_DEBUG "btrfs: run_delayed_extent_op returned %d\n", ret);
					spin_lock(&delayed_refs->lock);
					return ret;
@@ -2339,6 +2342,10 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans,
		count++;

		if (ret) {
			if (locked_ref) {
				list_del_init(&locked_ref->cluster);
				mutex_unlock(&locked_ref->mutex);
			}
			printk(KERN_DEBUG "btrfs: run_one_delayed_ref returned %d\n", ret);
			spin_lock(&delayed_refs->lock);
			return ret;