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: Dan Williams <dan.j.williams@intel.com>
 #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>
                        || (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;
 }
 
 
                return -ENOMEM;
        nvdimm_namespace_add_poison(ndns, &pmem->bb, pmem->data_offset);
 
+       disk->bb = &pmem->bb;
        add_disk(disk);
        revalidate_disk(disk);