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

Commit 226fb99e authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Greg Kroah-Hartman
Browse files

dm writecache: handle DAX to partitions on persistent memory correctly



commit f9e040efcc28309e5c592f7e79085a9a52e31f58 upstream.

The function dax_direct_access doesn't take partitions into account,
it always maps pages from the beginning of the device. Therefore,
persistent_memory_claim() must get the partition offset using
get_start_sect() and add it to the page offsets passed to
dax_direct_access().

Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Fixes: 48debafe ("dm: add writecache target")
Cc: stable@vger.kernel.org # 4.18+
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6fb192c0
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -224,6 +224,7 @@ static int persistent_memory_claim(struct dm_writecache *wc)
	pfn_t pfn;
	int id;
	struct page **pages;
	sector_t offset;

	wc->memory_vmapped = false;

@@ -242,9 +243,16 @@ static int persistent_memory_claim(struct dm_writecache *wc)
		goto err1;
	}

	offset = get_start_sect(wc->ssd_dev->bdev);
	if (offset & (PAGE_SIZE / 512 - 1)) {
		r = -EINVAL;
		goto err1;
	}
	offset >>= PAGE_SHIFT - 9;

	id = dax_read_lock();

	da = dax_direct_access(wc->ssd_dev->dax_dev, 0, p, &wc->memory_map, &pfn);
	da = dax_direct_access(wc->ssd_dev->dax_dev, offset, p, &wc->memory_map, &pfn);
	if (da < 0) {
		wc->memory_map = NULL;
		r = da;
@@ -266,7 +274,7 @@ static int persistent_memory_claim(struct dm_writecache *wc)
		i = 0;
		do {
			long daa;
			daa = dax_direct_access(wc->ssd_dev->dax_dev, i, p - i,
			daa = dax_direct_access(wc->ssd_dev->dax_dev, offset + i, p - i,
						NULL, &pfn);
			if (daa <= 0) {
				r = daa ? daa : -EINVAL;