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: 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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
a8bb7740aa
commit
154096e996
1 changed files with 10 additions and 2 deletions
|
@ -226,6 +226,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;
|
||||
|
||||
|
@ -244,9 +245,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;
|
||||
|
@ -268,7 +276,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;
|
||||
|
|
Loading…
Add table
Reference in a new issue