diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-26 22:34:26 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-26 22:34:26 -0400 |
commit | 315227f6da389f3a560f27f7777080857278e1b4 (patch) | |
tree | 11306e1e8d8b66044ab48901b90141b5362c12e3 /drivers | |
parent | a10c38a4f385f5d7c173a263ff6bb2d36021b3bb (diff) | |
parent | 40543f62cbdce42633e3fe10923099feee272e1f (diff) |
Merge tag 'dax-misc-for-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm
Pull misc DAX updates from Vishal Verma:
"DAX error handling for 4.7
- Until now, dax has been disabled if media errors were found on any
device. This enables the use of DAX in the presence of these
errors by making all sector-aligned zeroing go through the driver.
- The driver (already) has the ability to clear errors on writes that
are sent through the block layer using 'DSMs' defined in ACPI 6.1.
Other misc changes:
- When mounting DAX filesystems, check to make sure the partition is
page aligned. This is a requirement for DAX, and previously, we
allowed such unaligned mounts to succeed, but subsequent
reads/writes would fail.
- Misc/cleanup fixes from Jan that remove unused code from DAX
related to zeroing, writeback, and some size checks"
* tag 'dax-misc-for-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm:
dax: fix a comment in dax_zero_page_range and dax_truncate_page
dax: for truncate/hole-punch, do zeroing through the driver if possible
dax: export a low-level __dax_zero_page_range helper
dax: use sb_issue_zerout instead of calling dax_clear_sectors
dax: enable dax in the presence of known media errors (badblocks)
dax: fallback from pmd to pte on error
block: Update blkdev_dax_capable() for consistency
xfs: Add alignment check for DAX mount
ext2: Add alignment check for DAX mount
ext4: Add alignment check for DAX mount
block: Add bdev_dax_supported() for dax mount checks
block: Add vfs_msg() interface
dax: Remove redundant inode size checks
dax: Remove pointless writeback from dax_do_io()
dax: Remove zeroing from dax_io()
dax: Remove dead zeroing code from fault handlers
ext2: Avoid DAX zeroing to corrupt data
ext2: Fix block zeroing in ext2_get_blocks() for DAX
dax: Remove complete_unwritten argument
DAX: move RADIX_DAX_ definitions to dax.c
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/brd.c | 2 | ||||
-rw-r--r-- | drivers/nvdimm/pmem.c | 10 | ||||
-rw-r--r-- | drivers/s390/block/dcssblk.c | 4 |
3 files changed, 12 insertions, 4 deletions
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 51a071e32221..c04bd9bc39fd 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c | |||
@@ -381,7 +381,7 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector, | |||
381 | 381 | ||
382 | #ifdef CONFIG_BLK_DEV_RAM_DAX | 382 | #ifdef CONFIG_BLK_DEV_RAM_DAX |
383 | static long brd_direct_access(struct block_device *bdev, sector_t sector, | 383 | static long brd_direct_access(struct block_device *bdev, sector_t sector, |
384 | void __pmem **kaddr, pfn_t *pfn) | 384 | void __pmem **kaddr, pfn_t *pfn, long size) |
385 | { | 385 | { |
386 | struct brd_device *brd = bdev->bd_disk->private_data; | 386 | struct brd_device *brd = bdev->bd_disk->private_data; |
387 | struct page *page; | 387 | struct page *page; |
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 042baec56931..608fc4464574 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c | |||
@@ -164,14 +164,22 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, | |||
164 | } | 164 | } |
165 | 165 | ||
166 | static long pmem_direct_access(struct block_device *bdev, sector_t sector, | 166 | static long pmem_direct_access(struct block_device *bdev, sector_t sector, |
167 | void __pmem **kaddr, pfn_t *pfn) | 167 | void __pmem **kaddr, pfn_t *pfn, long size) |
168 | { | 168 | { |
169 | struct pmem_device *pmem = bdev->bd_queue->queuedata; | 169 | struct pmem_device *pmem = bdev->bd_queue->queuedata; |
170 | resource_size_t offset = sector * 512 + pmem->data_offset; | 170 | resource_size_t offset = sector * 512 + pmem->data_offset; |
171 | 171 | ||
172 | if (unlikely(is_bad_pmem(&pmem->bb, sector, size))) | ||
173 | return -EIO; | ||
172 | *kaddr = pmem->virt_addr + offset; | 174 | *kaddr = pmem->virt_addr + offset; |
173 | *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); | 175 | *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); |
174 | 176 | ||
177 | /* | ||
178 | * If badblocks are present, limit known good range to the | ||
179 | * requested range. | ||
180 | */ | ||
181 | if (unlikely(pmem->bb.count)) | ||
182 | return size; | ||
175 | return pmem->size - pmem->pfn_pad - offset; | 183 | return pmem->size - pmem->pfn_pad - offset; |
176 | } | 184 | } |
177 | 185 | ||
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index b83908670a9a..bed53c46dd90 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c | |||
@@ -31,7 +31,7 @@ static void dcssblk_release(struct gendisk *disk, fmode_t mode); | |||
31 | static blk_qc_t dcssblk_make_request(struct request_queue *q, | 31 | static blk_qc_t dcssblk_make_request(struct request_queue *q, |
32 | struct bio *bio); | 32 | struct bio *bio); |
33 | static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, | 33 | static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, |
34 | void __pmem **kaddr, pfn_t *pfn); | 34 | void __pmem **kaddr, pfn_t *pfn, long size); |
35 | 35 | ||
36 | static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; | 36 | static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; |
37 | 37 | ||
@@ -884,7 +884,7 @@ fail: | |||
884 | 884 | ||
885 | static long | 885 | static long |
886 | dcssblk_direct_access (struct block_device *bdev, sector_t secnum, | 886 | dcssblk_direct_access (struct block_device *bdev, sector_t secnum, |
887 | void __pmem **kaddr, pfn_t *pfn) | 887 | void __pmem **kaddr, pfn_t *pfn, long size) |
888 | { | 888 | { |
889 | struct dcssblk_dev_info *dev_info; | 889 | struct dcssblk_dev_info *dev_info; |
890 | unsigned long offset, dev_sz; | 890 | unsigned long offset, dev_sz; |