All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: oliver+list@schinagl.nl, linux@roeck-us.net, khali@linux-fr.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [PATCH v2 6/7] driver core: Introduce device_create_groups
Date: Wed, 10 Jul 2013 17:36:04 -0700	[thread overview]
Message-ID: <1373502965-1683-7-git-send-email-gregkh@linuxfoundation.org> (raw)
In-Reply-To: <1373502965-1683-1-git-send-email-gregkh@linuxfoundation.org>

From: Guenter Roeck <linux@roeck-us.net>

device_create_groups lets callers create devices as well as associated
sysfs attributes with a single call. This avoids race conditions seen
if sysfs attributes on new devices are created later.

[fixed up comment block placement and add checks for printk buffer
formats - gregkh]

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Cc: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 drivers/base/core.c    | 111 ++++++++++++++++++++++++++++++++++++-------------
 include/linux/device.h |   5 +++
 2 files changed, 88 insertions(+), 28 deletions(-)

diff --git a/drivers/base/core.c b/drivers/base/core.c
index dc3ea23..a8aae18 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1667,34 +1667,11 @@ static void device_create_release(struct device *dev)
 	kfree(dev);
 }
 
-/**
- * device_create_vargs - creates a device and registers it with sysfs
- * @class: pointer to the struct class that this device should be registered to
- * @parent: pointer to the parent struct device of this new device, if any
- * @devt: the dev_t for the char device to be added
- * @drvdata: the data to be added to the device for callbacks
- * @fmt: string for the device's name
- * @args: va_list for the device's name
- *
- * This function can be used by char device classes.  A struct device
- * will be created in sysfs, registered to the specified class.
- *
- * A "dev" file will be created, showing the dev_t for the device, if
- * the dev_t is not 0,0.
- * If a pointer to a parent struct device is passed in, the newly created
- * struct device will be a child of that device in sysfs.
- * The pointer to the struct device will be returned from the call.
- * Any further sysfs files that might be required can be created using this
- * pointer.
- *
- * Returns &struct device pointer on success, or ERR_PTR() on error.
- *
- * Note: the struct class passed to this function must have previously
- * been created with a call to class_create().
- */
-struct device *device_create_vargs(struct class *class, struct device *parent,
-				   dev_t devt, void *drvdata, const char *fmt,
-				   va_list args)
+static struct device *
+device_create_groups_vargs(struct class *class, struct device *parent,
+			   dev_t devt, void *drvdata,
+			   const struct attribute_group **groups,
+			   const char *fmt, va_list args)
 {
 	struct device *dev = NULL;
 	int retval = -ENODEV;
@@ -1711,6 +1688,7 @@ struct device *device_create_vargs(struct class *class, struct device *parent,
 	dev->devt = devt;
 	dev->class = class;
 	dev->parent = parent;
+	dev->groups = groups;
 	dev->release = device_create_release;
 	dev_set_drvdata(dev, drvdata);
 
@@ -1728,6 +1706,39 @@ error:
 	put_device(dev);
 	return ERR_PTR(retval);
 }
+
+/**
+ * device_create_vargs - creates a device and registers it with sysfs
+ * @class: pointer to the struct class that this device should be registered to
+ * @parent: pointer to the parent struct device of this new device, if any
+ * @devt: the dev_t for the char device to be added
+ * @drvdata: the data to be added to the device for callbacks
+ * @fmt: string for the device's name
+ * @args: va_list for the device's name
+ *
+ * This function can be used by char device classes.  A struct device
+ * will be created in sysfs, registered to the specified class.
+ *
+ * A "dev" file will be created, showing the dev_t for the device, if
+ * the dev_t is not 0,0.
+ * If a pointer to a parent struct device is passed in, the newly created
+ * struct device will be a child of that device in sysfs.
+ * The pointer to the struct device will be returned from the call.
+ * Any further sysfs files that might be required can be created using this
+ * pointer.
+ *
+ * Returns &struct device pointer on success, or ERR_PTR() on error.
+ *
+ * Note: the struct class passed to this function must have previously
+ * been created with a call to class_create().
+ */
+struct device *device_create_vargs(struct class *class, struct device *parent,
+				   dev_t devt, void *drvdata, const char *fmt,
+				   va_list args)
+{
+	return device_create_groups_vargs(class, parent, devt, drvdata, NULL,
+					  fmt, args);
+}
 EXPORT_SYMBOL_GPL(device_create_vargs);
 
 /**
@@ -1767,6 +1778,50 @@ struct device *device_create(struct class *class, struct device *parent,
 }
 EXPORT_SYMBOL_GPL(device_create);
 
+/**
+ * device_create_with_groups - creates a device and registers it with sysfs
+ * @class: pointer to the struct class that this device should be registered to
+ * @parent: pointer to the parent struct device of this new device, if any
+ * @devt: the dev_t for the char device to be added
+ * @drvdata: the data to be added to the device for callbacks
+ * @groups: NULL-terminated list of attribute groups to be created
+ * @fmt: string for the device's name
+ *
+ * This function can be used by char device classes.  A struct device
+ * will be created in sysfs, registered to the specified class.
+ * Additional attributes specified in the groups parameter will also
+ * be created automatically.
+ *
+ * A "dev" file will be created, showing the dev_t for the device, if
+ * the dev_t is not 0,0.
+ * If a pointer to a parent struct device is passed in, the newly created
+ * struct device will be a child of that device in sysfs.
+ * The pointer to the struct device will be returned from the call.
+ * Any further sysfs files that might be required can be created using this
+ * pointer.
+ *
+ * Returns &struct device pointer on success, or ERR_PTR() on error.
+ *
+ * Note: the struct class passed to this function must have previously
+ * been created with a call to class_create().
+ */
+struct device *device_create_with_groups(struct class *class,
+					 struct device *parent, dev_t devt,
+					 void *drvdata,
+					 const struct attribute_group **groups,
+					 const char *fmt, ...)
+{
+	va_list vargs;
+	struct device *dev;
+
+	va_start(vargs, fmt);
+	dev = device_create_groups_vargs(class, parent, devt, drvdata, groups,
+					 fmt, vargs);
+	va_end(vargs);
+	return dev;
+}
+EXPORT_SYMBOL_GPL(device_create_with_groups);
+
 static int __match_devt(struct device *dev, const void *data)
 {
 	const dev_t *devt = data;
diff --git a/include/linux/device.h b/include/linux/device.h
index f207a8f..bd5931e 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -938,6 +938,11 @@ extern __printf(5, 6)
 struct device *device_create(struct class *cls, struct device *parent,
 			     dev_t devt, void *drvdata,
 			     const char *fmt, ...);
+extern __printf(6, 7)
+struct device *device_create_with_groups(struct class *cls,
+			     struct device *parent, dev_t devt, void *drvdata,
+			     const struct attribute_group **groups,
+			     const char *fmt, ...);
 extern void device_destroy(struct class *cls, dev_t devt);
 
 /*
-- 
1.8.3.rc0.20.gb99dd2e


  parent reply	other threads:[~2013-07-11  0:36 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-10 20:05 Driver core and sysfs changes for attribute groups Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 1/6] sysfs.h: add __ATTR_RW() macro Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 2/6] sysfs.h: add ATTRIBUTE_GROUPS() macro Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 3/6] sysfs.h: add BIN_ATTR macro Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 4/6] driver core: add DEVICE_ATTR_RW and DEVICE_ATTR_RO macros Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 5/6] sysfs: add support for binary attributes in groups Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 6/6] driver core: Introduce device_create_groups Greg Kroah-Hartman
2013-07-10 20:17 ` Driver core and sysfs changes for attribute groups Oliver Schinagl
2013-07-10 22:04 ` Guenter Roeck
2013-07-10 22:23   ` Greg Kroah-Hartman
2013-07-10 22:34     ` Guenter Roeck
2013-07-10 22:05 ` [PATCH 7/6] driver core: add default groups to struct class Greg Kroah-Hartman
2013-07-10 22:18   ` Guenter Roeck
2013-07-10 22:24     ` Greg Kroah-Hartman
2013-07-10 22:20   ` [PATCH 7/6 v2] " Greg KH
2013-07-11  0:35 ` [PATCH v2 0/7] Driver core and sysfs changes for attribute groups Greg Kroah-Hartman
2013-07-11  0:35   ` [PATCH v2 1/7] sysfs.h: add __ATTR_RW() macro Greg Kroah-Hartman
2013-07-11  0:36   ` [PATCH v2 2/7] sysfs.h: add ATTRIBUTE_GROUPS() macro Greg Kroah-Hartman
2013-07-11 11:58     ` Oliver Schinagl
2013-07-11 17:06       ` Greg Kroah-Hartman
2013-07-11 20:09         ` Oliver Schinagl
2013-07-11 20:26           ` Greg Kroah-Hartman
2013-07-11 20:55             ` Oliver Schinagl
2013-07-14 22:55               ` Oliver Schinagl
2013-07-14 23:06                 ` Greg Kroah-Hartman
2013-07-11 12:03     ` Oliver Schinagl
2013-07-11 17:08       ` Greg Kroah-Hartman
2013-07-11  0:36   ` [PATCH v2 3/7] sysfs.h: add BIN_ATTR macro Greg Kroah-Hartman
2013-07-11  0:36   ` [PATCH v2 4/7] driver core: device.h: add RW and RO attribute macros Greg Kroah-Hartman
2013-07-11  0:36   ` [PATCH v2 5/7] sysfs: add support for binary attributes in groups Greg Kroah-Hartman
2013-07-11 11:45     ` Oliver Schinagl
2013-07-11 16:59       ` Greg Kroah-Hartman
2013-07-11  0:36   ` Greg Kroah-Hartman [this message]
2013-07-11  0:36   ` [PATCH v2 7/7] driver core: add default groups to struct class Greg Kroah-Hartman
2013-07-11  5:23   ` [PATCH v2 0/7] Driver core and sysfs changes for attribute groups Guenter Roeck
2013-07-11  6:28     ` Greg Kroah-Hartman
2013-07-11 11:14       ` Oliver Schinagl
2013-07-14 17:27   ` Guenter Roeck
2013-07-14 17:32     ` Greg Kroah-Hartman
2013-07-14 18:32       ` Guenter Roeck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1373502965-1683-7-git-send-email-gregkh@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=khali@linux-fr.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=oliver+list@schinagl.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.