diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
| -rw-r--r-- | fs/btrfs/extent_io.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 409bad3928db..4c91060d103a 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -6841,14 +6841,24 @@ static void assert_eb_page_uptodate(const struct extent_buffer *eb,  {  	struct btrfs_fs_info *fs_info = eb->fs_info; +	/* +	 * If we are using the commit root we could potentially clear a page +	 * Uptodate while we're using the extent buffer that we've previously +	 * looked up.  We don't want to complain in this case, as the page was +	 * valid before, we just didn't write it out.  Instead we want to catch +	 * the case where we didn't actually read the block properly, which +	 * would have !PageUptodate && !PageError, as we clear PageError before +	 * reading. +	 */  	if (fs_info->sectorsize < PAGE_SIZE) { -		bool uptodate; +		bool uptodate, error;  		uptodate = btrfs_subpage_test_uptodate(fs_info, page,  						       eb->start, eb->len); -		WARN_ON(!uptodate); +		error = btrfs_subpage_test_error(fs_info, page, eb->start, eb->len); +		WARN_ON(!uptodate && !error);  	} else { -		WARN_ON(!PageUptodate(page)); +		WARN_ON(!PageUptodate(page) && !PageError(page));  	}  }  |