From: "Luis R. Rodriguez" <[email protected]>
commit d926d0e4c74cfcb42a05e91d1cdf698b41e1e118
Author: Mark Brown <[email protected]>
Date: Thu May 3 18:15:13 2012 +0100
devres: Add devres_release()
APIs using devres frequently want to implement a "remove and free the
resource" operation so it seems sensible that they should be able to
just have devres do the freeing for them since that's a big part of what
devres is all about.
Signed-off-by: Mark Brown <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
Signed-off-by: Luis R. Rodriguez <[email protected]>
---
backport/compat/compat-3.5.c | 34 ++++++++++++++++++++++++++++++++++
backport/include/linux/compat-3.5.h | 6 ++++++
2 files changed, 40 insertions(+)
diff --git a/backport/compat/compat-3.5.c b/backport/compat/compat-3.5.c
index d7f1c27..9cc8456 100644
--- a/backport/compat/compat-3.5.c
+++ b/backport/compat/compat-3.5.c
@@ -12,6 +12,40 @@
#include <linux/highuid.h>
#include <linux/ktime.h>
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))
+#include <linux/device.h>
+
+/**
+ * devres_release - Find a device resource and destroy it, calling release
+ * @dev: Device to find resource from
+ * @release: Look for resources associated with this release function
+ * @match: Match function (optional)
+ * @match_data: Data for the match function
+ *
+ * Find the latest devres of @dev associated with @release and for
+ * which @match returns 1. If @match is NULL, it's considered to
+ * match all. If found, the resource is removed atomically, the
+ * release function called and the resource freed.
+ *
+ * RETURNS:
+ * 0 if devres is found and freed, -ENOENT if not found.
+ */
+int devres_release(struct device *dev, dr_release_t release,
+ dr_match_t match, void *match_data)
+{
+ void *res;
+
+ res = devres_remove(dev, release, match, match_data);
+ if (unlikely(!res))
+ return -ENOENT;
+
+ (*release)(dev, res);
+ devres_free(res);
+ return 0;
+}
+EXPORT_SYMBOL_GPL(devres_release);
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) */
+
/*
* Commit 7a4e7408c5cadb240e068a662251754a562355e3
* exported overflowuid and overflowgid for all
diff --git a/backport/include/linux/compat-3.5.h
b/backport/include/linux/compat-3.5.h
index dbf8f00..1515a5b 100644
--- a/backport/include/linux/compat-3.5.h
+++ b/backport/include/linux/compat-3.5.h
@@ -10,6 +10,12 @@
#include <net/netlink.h>
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))
+#define devres_release LINUX_BACKPORT(devres_release)
+extern int devres_release(struct device *dev, dr_release_t release,
+ dr_match_t match, void *match_data);
+#endif
+
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
#include <linux/ratelimit.h>
#define dev_level_ratelimited(dev_level, dev, fmt, ...)
\
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe backports" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html