1
0
Fork 0

dm writecache: handle DAX to partitions on persistent memory correctly

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: Mikulas Patocka <mpatocka@redhat.com>
Fixes: 48debafe4f ("dm: add writecache target")
Cc: stable@vger.kernel.org # 4.18+
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
zero-sugar-mainline-defconfig
Mikulas Patocka 2020-08-24 11:09:47 -04:00 committed by Mike Snitzer
parent f75aef392f
commit f9e040efcc
1 changed files with 10 additions and 2 deletions

View File

@ -231,6 +231,7 @@ static int persistent_memory_claim(struct dm_writecache *wc)
pfn_t pfn; pfn_t pfn;
int id; int id;
struct page **pages; struct page **pages;
sector_t offset;
wc->memory_vmapped = false; wc->memory_vmapped = false;
@ -245,9 +246,16 @@ static int persistent_memory_claim(struct dm_writecache *wc)
goto err1; 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(); 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) { if (da < 0) {
wc->memory_map = NULL; wc->memory_map = NULL;
r = da; r = da;
@ -269,7 +277,7 @@ static int persistent_memory_claim(struct dm_writecache *wc)
i = 0; i = 0;
do { do {
long daa; 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); NULL, &pfn);
if (daa <= 0) { if (daa <= 0) {
r = daa ? daa : -EINVAL; r = daa ? daa : -EINVAL;