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

Commit 5a7be515 authored by Yan Zheng's avatar Yan Zheng Committed by Chris Mason
Browse files

Btrfs: Fix infinite loop in btrfs_extent_post_op



btrfs_extent_post_op calls finish_current_insert and del_pending_extents. They
both may enter infinite loops.

finish_current_insert enters infinite loop if it only finds some backrefs to
update.  The fix is to check for pending backref updates before restarting the
loop.

The infinite loop in del_pending_extents is due to a the skipped variable
not being properly reset before looping around.

Signed-off-by: default avatarYan Zheng <zheng.yan@oracle.com>
parent 3dfdb934
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -2156,7 +2156,8 @@ static int finish_current_insert(struct btrfs_trans_handle *trans,
		ret = find_first_extent_bit(&info->extent_ins, search, &start,
					    &end, EXTENT_WRITEBACK);
		if (ret) {
			if (skipped && all && !num_inserts) {
			if (skipped && all && !num_inserts &&
			    list_empty(&update_list)) {
				skipped = 0;
				search = 0;
				continue;
@@ -2544,6 +2545,7 @@ static int del_pending_extents(struct btrfs_trans_handle *trans,
		if (ret) {
			if (all && skipped && !nr) {
				search = 0;
				skipped = 0;
				continue;
			}
			mutex_unlock(&info->extent_ins_mutex);