|
@@ -60,11 +60,9 @@ static int nd_region_probe(struct device *dev)
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
nd_region->bb_state = sysfs_get_dirent(nd_region->dev.kobj.sd,
|
|
nd_region->bb_state = sysfs_get_dirent(nd_region->dev.kobj.sd,
|
|
"badblocks");
|
|
"badblocks");
|
|
- if (nd_region->bb_state)
|
|
|
|
- sysfs_put(nd_region->bb_state);
|
|
|
|
- else
|
|
|
|
|
|
+ if (!nd_region->bb_state)
|
|
dev_warn(&nd_region->dev,
|
|
dev_warn(&nd_region->dev,
|
|
- "sysfs_get_dirent 'badblocks' failed\n");
|
|
|
|
|
|
+ "'badblocks' notification disabled\n");
|
|
ndr_res.start = nd_region->ndr_start;
|
|
ndr_res.start = nd_region->ndr_start;
|
|
ndr_res.end = nd_region->ndr_start + nd_region->ndr_size - 1;
|
|
ndr_res.end = nd_region->ndr_start + nd_region->ndr_size - 1;
|
|
nvdimm_badblocks_populate(nd_region, &nd_region->bb, &ndr_res);
|
|
nvdimm_badblocks_populate(nd_region, &nd_region->bb, &ndr_res);
|
|
@@ -111,6 +109,13 @@ static int nd_region_remove(struct device *dev)
|
|
dev_set_drvdata(dev, NULL);
|
|
dev_set_drvdata(dev, NULL);
|
|
nvdimm_bus_unlock(dev);
|
|
nvdimm_bus_unlock(dev);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Note, this assumes device_lock() context to not race
|
|
|
|
+ * nd_region_notify()
|
|
|
|
+ */
|
|
|
|
+ sysfs_put(nd_region->bb_state);
|
|
|
|
+ nd_region->bb_state = NULL;
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|