chiark / gitweb /
scsi_id: retry open() on -EBUSY
authorHarald Hoyer <harald@redhat.com>
Wed, 11 Jun 2008 21:26:18 +0000 (23:26 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Wed, 11 Jun 2008 21:26:18 +0000 (23:26 +0200)
extras/scsi_id/scsi_serial.c

index c5cacfa114c3653e4c769875048449ef4a982280..bea447fdacfdfbc391defe642c90a9c0b201d95f 100644 (file)
@@ -819,18 +819,24 @@ int scsi_get_serial (struct scsi_id_device *dev_scsi, const char *devname,
                     int page_code, char *serial_short, int len)
 {
        unsigned char page0[SCSI_INQ_BUFF_LEN];
-       int fd;
+       int fd = -1;
+       int cnt = 10;
        int ind;
        int retval;
 
        memset(dev_scsi->serial, 0, len);
        dbg("opening %s\n", devname);
-       fd = open(devname, O_RDONLY | O_NONBLOCK);
-       if (fd < 0) {
-               info("%s: cannot open %s: %s\n",
-                   dev_scsi->kernel, devname, strerror(errno));
-               return 1;
+       while (--cnt) {
+               fd = open(devname, O_RDONLY | O_NONBLOCK);
+               if (fd >= 0)
+                       break;
+               info("%s: cannot open %s: %s\n", dev_scsi->kernel, devname, strerror(errno));
+               if (errno != EBUSY)
+                       break;
+               usleep(500000 + (rand() % 100000) );
        }
+       if (fd < 0)
+               return 1;
 
        if (page_code == PAGE_80) {
                if (do_scsi_page80_inquiry(dev_scsi, fd, dev_scsi->serial, serial_short, len)) {