block, badblocks: introduce devm_init_badblocks

Provide a devres interface for initializing a badblocks instance.  The
pmem driver has several scenarios where it will be beneficial to have
this structure automatically freed when the device is disabled / fails
probe.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
diff --git a/include/linux/badblocks.h b/include/linux/badblocks.h
index 2d98c02..c3bdf8c 100644
--- a/include/linux/badblocks.h
+++ b/include/linux/badblocks.h
@@ -2,6 +2,7 @@
 #define _LINUX_BADBLOCKS_H
 
 #include <linux/seqlock.h>
+#include <linux/device.h>
 #include <linux/kernel.h>
 #include <linux/stddef.h>
 #include <linux/types.h>
@@ -23,6 +24,7 @@
 #define MAX_BADBLOCKS	(PAGE_SIZE/8)
 
 struct badblocks {
+	struct device *dev;	/* set by devm_init_badblocks */
 	int count;		/* count of bad blocks */
 	int unacked_exist;	/* there probably are unacknowledged
 				 * bad blocks.  This is only cleared
@@ -49,5 +51,15 @@
 			int unack);
 int badblocks_init(struct badblocks *bb, int enable);
 void badblocks_exit(struct badblocks *bb);
-
+struct device;
+int devm_init_badblocks(struct device *dev, struct badblocks *bb);
+static inline void devm_exit_badblocks(struct device *dev, struct badblocks *bb)
+{
+	if (bb->dev != dev) {
+		dev_WARN_ONCE(dev, 1, "%s: badblocks instance not associated\n",
+				__func__);
+		return;
+	}
+	badblocks_exit(bb);
+}
 #endif