- struct list_head *tmp;
- int retval = 0;
- int found;
-
- list_for_each(tmp, &config_device_list) {
- struct config_device *dev = list_entry(tmp, struct config_device, node);
- switch (dev->type) {
- case LABEL:
- dbg("LABEL name = '%s', bus = '%s', sysfs_file = '%s', sysfs_value = '%s'"
- " owner = '%s', group = '%s', mode = '%#o'",
- dev->attr.name, dev->bus, dev->sysfs_file, dev->sysfs_value,
- dev->attr.owner, dev->attr.group, dev->attr.mode);
- break;
- case NUMBER:
- dbg("NUMBER name = '%s', bus = '%s', id = '%s'"
- " owner = '%s', group = '%s', mode = '%#o'",
- dev->attr.name, dev->bus, dev->id,
- dev->attr.owner, dev->attr.group, dev->attr.mode);
- break;
- case TOPOLOGY:
- dbg("TOPOLOGY name = '%s', bus = '%s', place = '%s'"
- " owner = '%s', group = '%s', mode = '%#o'",
- dev->attr.name, dev->bus, dev->place,
- dev->attr.owner, dev->attr.group, dev->attr.mode);
- break;
- case REPLACE:
- if (strcmp(dev->kernel_name, class_dev->name) != 0)
- continue;
- strcpy(attr->name, dev->attr.name);
- attr->mode = dev->attr.mode;
- strcpy(attr->owner, dev->attr.owner);
- strcpy(attr->group, dev->attr.group);
- dbg("'%s' becomes '%s' - owner = %s, group = %s, mode = %#o",
- dev->kernel_name, attr->name,
- dev->attr.owner, dev->attr.group, dev->attr.mode);
- return retval;
- break;
- default:
- dbg("Unknown type of device!");
+ struct sysfs_device *sysfs_device;
+ struct sysfs_class_device *class_dev_parent;
+ int loop;
+ char filename[SYSFS_PATH_MAX + 6];
+ int retval;
+ char *temp;
+ int partition = 0;
+
+ /* Figure out where the device symlink is at. For char devices this will
+ * always be in the class_dev->path. But for block devices, it's different.
+ * The main block device will have the device symlink in it's path, but
+ * all partitions have the symlink in its parent directory.
+ * But we need to watch out for block devices that do not have parents, yet
+ * look like a partition (fd0, loop0, etc.) They all do not have a device
+ * symlink yet. We do sit and spin on waiting for them right now, we should
+ * possibly have a whitelist for these devices here...
+ */
+ strcpy(filename, class_dev->path);
+ dbg("filename = %s", filename);
+ if (strcmp(class_dev->classname, SYSFS_BLOCK_NAME) == 0) {
+ if (isdigit(class_dev->path[strlen(class_dev->path)-1])) {
+ temp = strrchr(filename, '/');
+ if (temp) {
+ partition = 1;
+ *temp = 0x00;
+ char *temp2 = strrchr(filename, '/');
+ dbg("temp2 = %s", temp2);
+ if (temp2 && (strcmp(temp2, "/block") == 0)) {
+ /* oops, we have no parent block device, so go back to original directory */
+ strcpy(filename, class_dev->path);
+ partition = 0;
+ }
+ }
+ }
+ }
+ strcat(filename, "/device");
+
+ loop = 2;
+ while (loop--) {
+ struct stat buf;
+ dbg("looking for '%s'", filename);
+ retval = stat(filename, &buf);
+ if (!retval)