projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dax: enable dax in the presence of known media errors (badblocks)
[deliverable/linux.git]
/
drivers
/
nvdimm
/
pmem.c
diff --git
a/drivers/nvdimm/pmem.c
b/drivers/nvdimm/pmem.c
index f798899338eddb6955c06f5b44c26c405dffdade..c447579bd853cfccd55303fb3d623435b6d965ab 100644
(file)
--- a/
drivers/nvdimm/pmem.c
+++ b/
drivers/nvdimm/pmem.c
@@
-182,14
+182,22
@@
static int pmem_rw_page(struct block_device *bdev, sector_t sector,
}
static long pmem_direct_access(struct block_device *bdev, sector_t sector,
}
static long pmem_direct_access(struct block_device *bdev, sector_t sector,
- void __pmem **kaddr, pfn_t *pfn)
+ void __pmem **kaddr, pfn_t *pfn
, long size
)
{
struct pmem_device *pmem = bdev->bd_disk->private_data;
resource_size_t offset = sector * 512 + pmem->data_offset;
{
struct pmem_device *pmem = bdev->bd_disk->private_data;
resource_size_t offset = sector * 512 + pmem->data_offset;
+ if (unlikely(is_bad_pmem(&pmem->bb, sector, size)))
+ return -EIO;
*kaddr = pmem->virt_addr + offset;
*pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags);
*kaddr = pmem->virt_addr + offset;
*pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags);
+ /*
+ * If badblocks are present, limit known good range to the
+ * requested range.
+ */
+ if (unlikely(pmem->bb.count))
+ return size;
return pmem->size - pmem->pfn_pad - offset;
}
return pmem->size - pmem->pfn_pad - offset;
}
This page took
0.028372 seconds
and
5
git commands to generate.