Commit 57f7f317 authored by Dan Williams's avatar Dan Williams
Browse files

pmem, dax: disable dax in the presence of bad blocks



Longer term teach dax to punch "error" holes in mapping requests and
deliver SIGBUS to applications that consume a bad pmem page.  For now,
simply disable the dax performance optimization in the presence of known
errors.

Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent e10624f8
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@
#include <linux/gfp.h>
#include <linux/blkpg.h>
#include <linux/hdreg.h>
#include <linux/badblocks.h>
#include <linux/backing-dev.h>
#include <linux/fs.h>
#include <linux/blktrace_api.h>
@@ -422,6 +423,15 @@ bool blkdev_dax_capable(struct block_device *bdev)
			|| (bdev->bd_part->nr_sects % (PAGE_SIZE / 512)))
		return false;

	/*
	 * If the device has known bad blocks, force all I/O through the
	 * driver / page cache.
	 *
	 * TODO: support finer grained dax error handling
	 */
	if (disk->bb && disk->bb->count)
		return false;

	return true;
}

+1 −0
Original line number Diff line number Diff line
@@ -233,6 +233,7 @@ static int pmem_attach_disk(struct device *dev,
		return -ENOMEM;
	nvdimm_namespace_add_poison(ndns, &pmem->bb, pmem->data_offset);

	disk->bb = &pmem->bb;
	add_disk(disk);
	revalidate_disk(disk);