All of lore.kernel.org
 help / color / mirror / Atom feed
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);
 			}


  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 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.