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

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

Btrfs: fix balancing oops when invalidate_inode_pages2 returns EBUSY



invalidate_inode_pages2_range may return -EBUSY occasionally
which results Oops. This patch fixes the issue by moving
invalidate_inode_pages2_range into a loop and keeping calling
it until the return value is not -EBUSY.

The EBUSY return is temporary, and can happen when the btrfs release page
function is unable to release a page because the EXTENT_LOCK
bit is set.

Signed-off-by: default avatarYan Zheng <zheng.yan@oracle.com>
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 60f2e8f8
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -2553,8 +2553,13 @@ int relocate_inode_pages(struct inode *inode, u64 start, u64 len)
	last_index = (start + len - 1) >> PAGE_CACHE_SHIFT;

	/* make sure the dirty trick played by the caller work */
	while (1) {
		ret = invalidate_inode_pages2_range(inode->i_mapping,
						    first_index, last_index);
		if (ret != -EBUSY)
			break;
		schedule_timeout(HZ/10);
	}
	if (ret)
		goto out_unlock;