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

Commit ff9a28f6 authored by Jan Kara's avatar Jan Kara Committed by Ben Myers
Browse files

xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()



When a dirty page is truncated from a file but reclaim gets to it before
truncate_inode_pages(), we hit WARN_ON(delalloc) in
xfs_vm_releasepage(). This is because reclaim tries to write the page,
xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
thinks it can continue and calls xfs_vm_releasepage() on page with dirty
buffers.

Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
reclaim stop reclaiming the page and also logically it keeps page in a
more consistent state where page with dirty buffers has PageDirty set.

Signed-off-by: default avatarJan Kara <jack@suse.cz>
Reviewed-by: default avatarCarlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent 19cb7e38
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -953,13 +953,13 @@ xfs_vm_writepage(
		unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1);

		/*
		 * Just skip the page if it is fully outside i_size, e.g. due
		 * to a truncate operation that is in progress.
		 * Skip the page if it is fully outside i_size, e.g. due to a
		 * truncate operation that is in progress. We must redirty the
		 * page so that reclaim stops reclaiming it. Otherwise
		 * xfs_vm_releasepage() is called on it and gets confused.
		 */
		if (page->index >= end_index + 1 || offset_into_page == 0) {
			unlock_page(page);
			return 0;
		}
		if (page->index >= end_index + 1 || offset_into_page == 0)
			goto redirty;

		/*
		 * The page straddles i_size.  It must be zeroed out on each