@@ -1272,7 +1272,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;
@@ -1290,7 +1291,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;
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: Qu Wenruo <wqu@suse.com> --- fs/btrfs/ioctl.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)