Commit cae79686 authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba
Browse files

btrfs: defrag: also check PagePrivate for subpage cases in cluster_pages_for_defrag()



In function cluster_pages_for_defrag() we have a window where we unlock
page, either start the ordered range or read the content from disk.

When we re-lock the page, we need to make sure it still has the correct
page->private for subpage.

Thus add the extra PagePrivate check here to handle subpage cases
properly.

Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 1ccc2e8a
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1278,7 +1278,8 @@ static int cluster_pages_for_defrag(struct inode *inode,
			 * we unlocked the page above, so we need check if
			 * it was released or not.
			 */
			if (page->mapping != inode->i_mapping) {
			if (page->mapping != inode->i_mapping ||
			    !PagePrivate(page)) {
				unlock_page(page);
				put_page(page);
				goto again;
@@ -1296,7 +1297,7 @@ static int cluster_pages_for_defrag(struct inode *inode,
			}
		}

		if (page->mapping != inode->i_mapping) {
		if (page->mapping != inode->i_mapping || !PagePrivate(page)) {
			unlock_page(page);
			put_page(page);
			goto again;