From: Kay Sievers <kay.sievers@vrfy.org>
To: Greg KH <gregkh@suse.de>
Cc: Dmitry Torokhov <dtor_core@ameritech.net>,
Vojtech Pavlik <vojtech@suse.cz>, Hannes Reinecke <hare@suse.de>,
Patrick Mochel <mochel@digitalimplant.org>,
airlied@linux.ie, linux-kernel@vger.kernel.org
Subject: Re: [patch 0/8] Nesting class_device patches that actually work
Date: Fri, 14 Oct 2005 01:38:15 +0200 [thread overview]
Message-ID: <20051013233815.GA15968@vrfy.org> (raw)
In-Reply-To: <20051013021001.GA31737@kroah.com>
On Wed, Oct 12, 2005 at 07:10:01PM -0700, Greg KH wrote:
> On Wed, Oct 12, 2005 at 07:08:44PM -0700, Greg KH wrote:
> > Ok, finally. Here's a set of _working_ patches that properly implement
> > nesting class_device structures, and the follow-on patches to move the
> > input subsystem to use them. Hotplug and release functions work
> > properly now, and this will let us move /sys/block/ to use class and
> > class_device structures soon.
>
> Oh, Kay, do you have a public patch to udevstart/udev that can handle
> this nested structure? It might be good to have that so people can test
> these in the next -mm.
Sure, here is an still untested hack. Sorry, I'm "busy" at a conference this
week. Anyhow, I still think that we really don't want to nest classes this way. :)
Thanks,
Kay
---
diff --git a/libsysfs/sysfs_class.c b/libsysfs/sysfs_class.c
index edf751b..e95c919 100644
--- a/libsysfs/sysfs_class.c
+++ b/libsysfs/sysfs_class.c
@@ -227,16 +227,46 @@ struct sysfs_class_device *sysfs_get_cla
if (clsdev->parent)
return (clsdev->parent);
- /*
- * As of now, only block devices have a parent child heirarchy in sysfs
- * We do not know, if, in the future, more classes will have a similar
- * structure. Hence, we now call a specialized function for block and
- * later we can add support functions for other subsystems as required.
- */
- if (!(strncmp(clsdev->classname, SYSFS_BLOCK_NAME,
- sizeof(SYSFS_BLOCK_NAME)))) {
- if ((get_blockdev_parent(clsdev)) == 0)
+ if (!strncmp(clsdev->classname, SYSFS_BLOCK_NAME, sizeof(SYSFS_BLOCK_NAME))) {
+ if ((get_blockdev_parent(clsdev)) == 0)
return (clsdev->parent);
+ } else if (!strncmp(clsdev->classname, SYSFS_CLASS_NAME, sizeof(SYSFS_CLASS_NAME))) {
+ char ppath[SYSFS_PATH_MAX];
+ char dpath[SYSFS_PATH_MAX];
+ char *tmp;
+
+ memset(ppath, 0, SYSFS_PATH_MAX);
+ memset(dpath, 0, SYSFS_PATH_MAX);
+ safestrcpy(ppath, clsdev->path);
+ tmp = strrchr(ppath, '/');
+ if (!tmp) {
+ dprintf("Invalid path to device %s\n", ppath);
+ return NULL;
+ }
+ if (*(tmp + 1) == '\0') {
+ *tmp = '\0';
+ tmp = strrchr(tmp, '/');
+ if (tmp == NULL) {
+ dprintf("Invalid path to device %s\n", ppath);
+ return NULL;
+ }
+ }
+ *tmp = '\0';
+
+ /* Make sure we're not at the top of the device tree */
+ sysfs_get_mnt_path(dpath, SYSFS_PATH_MAX);
+ safestrcat(dpath, "/" SYSFS_CLASS_NAME);
+ if (strcmp(dpath, ppath) == 0) {
+ dprintf("Device at %s does not have a parent\n", clsdev->path);
+ return NULL;
+ }
+
+ clsdev->parent = sysfs_open_class_device_path(ppath);
+ if (!clsdev->parent) {
+ dprintf("Error opening device %s's parent at %s\n", clsdev->name, ppath);
+ return NULL;
+ }
+ return (clsdev->parent);
}
return NULL;
}
diff --git a/udevstart.c b/udevstart.c
index ce96f38..09f0e5d 100644
--- a/udevstart.c
+++ b/udevstart.c
@@ -79,7 +79,7 @@ static int device_list_insert(const char
struct device *new_device;
const char *devpath = &path[strlen(sysfs_path)];
- dbg("insert: '%s'\n", devpath);
+ dbg("insert: '%s'", devpath);
list_for_each_entry(loop_device, device_list, node) {
if (strcmp(loop_device->path, devpath) > 0) {
@@ -296,7 +296,6 @@ static void udev_scan_class(struct list_
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
char dirname[PATH_SIZE];
DIR *dir2;
- struct dirent *dent2;
if (dent->d_name[0] == '.')
continue;
@@ -306,6 +305,9 @@ static void udev_scan_class(struct list_
dir2 = opendir(dirname);
if (dir2 != NULL) {
+ DIR *dir3;
+ struct dirent *dent2;
+
for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
char dirname2[PATH_SIZE];
@@ -317,6 +319,25 @@ static void udev_scan_class(struct list_
if (has_devt(dirname2) || strcmp(dent->d_name, "net") == 0)
device_list_insert(dirname2, dent->d_name, device_list);
+
+ dir3 = opendir(dirname2);
+ if (dir3 != NULL) {
+ struct dirent *dent3;
+
+ for (dent3 = readdir(dir3); dent3 != NULL; dent3 = readdir(dir3)) {
+ char dirname3[PATH_SIZE];
+
+ if (dent3->d_name[0] == '.')
+ continue;
+
+ snprintf(dirname3, sizeof(dirname3), "%s/%s", dirname2, dent3->d_name);
+ dirname3[sizeof(dirname3)-1] = '\0';
+
+ if (has_devt(dirname3))
+ device_list_insert(dirname3, dent->d_name, device_list);
+ }
+ closedir(dir3);
+ }
}
closedir(dir2);
}
next prev parent reply other threads:[~2005-10-13 23:38 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20051013014147.235668000@echidna.kroah.org>
2005-10-13 2:08 ` [patch 0/8] Nesting class_device patches that actually work Greg KH
2005-10-13 2:10 ` Greg KH
2005-10-13 23:38 ` Kay Sievers [this message]
2005-10-13 2:10 ` [patch 1/8] Driver Core: add the ability for class_device structures to be nested Greg KH
2005-10-13 2:10 ` [patch 2/8] Driver Core: fix up all callers of class_device_create() Greg KH
2005-10-13 2:10 ` [patch 3/8] Driver Core: document struct class_device properly Greg KH
2005-10-13 2:10 ` [patch 4/8] input: register the input class device sooner Greg KH
2005-10-13 2:10 ` [patch 5/8] input: export input_dev_class so that input drivers can use it Greg KH
2005-10-13 2:10 ` [patch 6/8] input: move the input class devices under their new input_dev devices Greg KH
2005-10-13 2:11 ` [patch 7/8] input: remove the input_class structure, as it is unused Greg KH
2005-10-13 2:11 ` [patch 8/8] input: rename input_dev_class to input_class to be correct Greg KH
2005-10-13 6:38 ` [patch 0/8] Nesting class_device patches that actually work Vojtech Pavlik
2005-10-13 21:21 ` Dmitry Torokhov
2005-10-13 10:58 ` Kay Sievers
2005-10-13 21:35 ` Dmitry Torokhov
2005-10-13 23:37 ` Hannes Reinecke
2005-10-14 8:45 ` Kay Sievers
2005-10-14 12:14 ` Kay Sievers
2005-10-14 12:49 ` linux-os (Dick Johnson)
2005-10-14 13:49 ` Kay Sievers
2005-10-17 10:02 ` Vojtech Pavlik
2005-10-18 5:13 ` Dmitry Torokhov
2005-10-14 17:02 ` Dmitry Torokhov
2005-10-15 15:08 ` Kay Sievers
2005-10-17 5:41 ` Dmitry Torokhov
2005-10-17 21:44 ` Greg KH
2005-10-17 21:54 ` Dmitry Torokhov
2005-10-17 23:26 ` Adam Belay
2005-10-18 0:03 ` Kay Sievers
2005-10-17 23:24 ` Adam Belay
2005-10-17 23:44 ` Kay Sievers
2005-10-18 5:26 ` Greg KH
2005-10-18 7:18 ` Adam Belay
2005-10-18 7:54 ` Greg KH
2005-10-18 8:34 ` Vojtech Pavlik
2005-10-18 15:08 ` Kay Sievers
2005-10-18 15:41 ` Dmitry Torokhov
2005-10-18 6:04 ` Greg KH
2005-10-18 7:05 ` Greg KH
2005-10-18 7:35 ` Greg KH
2005-10-17 9:26 ` Vojtech Pavlik
2005-12-01 18:59 ` Patrick Mochel
2005-10-14 9:52 ` Christoph Hellwig
2005-10-14 16:36 ` Dmitry Torokhov
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=20051013233815.GA15968@vrfy.org \
--to=kay.sievers@vrfy.org \
--cc=airlied@linux.ie \
--cc=dtor_core@ameritech.net \
--cc=gregkh@suse.de \
--cc=hare@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mochel@digitalimplant.org \
--cc=vojtech@suse.cz \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox