linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Carl-Daniel Hailfinger <c-d.hailfinger.kernel.2004@gmx.net>
To: linux-hotplug@vger.kernel.org
Subject: libsysfs/udev hang
Date: Tue, 23 Mar 2004 11:55:09 +0000	[thread overview]
Message-ID: <4060259D.4000905@gmx.net> (raw)

Hi,

while writing an ataraid replacement on top of device mapper, I stumbled
upon a freeze in sysfs_close_device which only happens if udev is NOT
compiled with DEBUG=true.

Test routine (modified udevinfo function) follows:
static int print_device_chain(const char *path)
{
        struct sysfs_class_device *class_dev;
        struct sysfs_class_device *class_dev_parent;
        struct sysfs_attribute *attr;
        struct sysfs_device *sysfs_dev;
        struct sysfs_device *sysfs_dev_parent;
        struct dlist *cur_attrs;
        int retval = 0;
        unsigned int vendor,device,subsystem_vendor,subsystem_device;
        unsigned long devsize;
        unsigned char *buf;

        /*  get the class dev */
        class_dev = sysfs_open_class_device_path(path);
        if (class_dev = NULL) {
                printf("couldn't get the class device\n");
                return -1;
        }

        cur_attrs = sysfs_get_classdev_attributes(class_dev);

        /* get device size in 512 byte blocks from 'size' */
        buf = sysfs_get_value_from_attributes(cur_attrs, "size");
        devsize = strtoul(buf, NULL, 10);

        /* read the 'dev' file for major/minor*/
        buf = sysfs_get_value_from_attributes(cur_attrs, "dev");
        printf("device '%s' has size %lu blocks and major:minor %s\n",
class_dev->path, devsize, buf);

        sysfs_close_list(cur_attrs);

        /* get the device link (if parent exists look here) */
        class_dev_parent = sysfs_get_classdev_parent(class_dev);
        if (class_dev_parent != NULL) {
                class_dev = class_dev_parent;
        }
        sysfs_dev = sysfs_get_classdev_device(class_dev);
        if (sysfs_dev != NULL)
                printf("follow the class device's \"device\"\n");

        /* look the device chain upwards */
        while (sysfs_dev != NULL) {

                printf("point1\n");
                /* open sysfs device directory and print all attributes */
                if (strcmp(sysfs_dev->bus, "pci") = 0) {
                        cur_attrs = sysfs_get_device_attributes(sysfs_dev);
                        buf = sysfs_get_value_from_attributes(cur_attrs,
"vendor");
                        vendor = (unsigned int)strtoul(buf + 2, NULL, 16);
                        buf = sysfs_get_value_from_attributes(cur_attrs,
"device");
                        device = (unsigned int)strtoul(buf + 2, NULL, 16);
                        buf = sysfs_get_value_from_attributes(cur_attrs,
"subsystem_vendor");
                        subsystem_vendor = (unsigned int)strtoul(buf + 2,
NULL, 16);
                        buf = sysfs_get_value_from_attributes(cur_attrs,
"subsystem_device");
                        subsystem_device = (unsigned int)strtoul(buf + 2,
NULL, 16);
                        sysfs_close_list(cur_attrs);

                        printf("device '%s' has vendor %x device %x
subvendor %x subdevice %x\n",
                                 class_dev->path, vendor, device,
subsystem_vendor, subsystem_device);
                        printf("point2\n");
                        break;
                }
                printf("point3\n");

                sysfs_dev_parent = sysfs_get_device_parent(sysfs_dev);
                printf("point4\n");
                if (sysfs_dev_parent = NULL)
                        break;
                printf("point5\n");

                sysfs_dev = sysfs_dev_parent;
                printf("point6\n");
        }
        printf("point7\n");
        sysfs_close_device(sysfs_dev);

        printf("point8\n");
exit:
        return retval;
}


And if I compile udev with DEBUG=true, it works perfectly. If I compile
udev without debugging, it hangs between point7 and point8.

Did I make any mistakes in the above routine which trigger the hang? I ask
here because the libsysfs version in udev differs from libsysfs 1.0.0.


Regards,
Carl-Daniel



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id\x1470&alloc_id638&op=click
_______________________________________________
Linux-hotplug-devel mailing list  http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel

             reply	other threads:[~2004-03-23 11:55 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-03-23 11:55 Carl-Daniel Hailfinger [this message]
2004-03-23 15:57 ` libsysfs/udev hang Greg KH
2004-03-23 17:04 ` Carl-Daniel Hailfinger
2004-03-23 19:09 ` Greg KH
2004-03-23 19:19 ` Daniel Stekloff
2004-03-23 19:24 ` Daniel Stekloff
2004-03-23 20:57 ` Carl-Daniel Hailfinger
2004-03-24  1:32 ` Greg KH

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=4060259D.4000905@gmx.net \
    --to=c-d.hailfinger.kernel.2004@gmx.net \
    --cc=linux-hotplug@vger.kernel.org \
    /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;
as well as URLs for NNTP newsgroup(s).