From b65b852c15b7e62d7200ffba979b6e8d47e291ca Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sun, 14 Jun 2009 09:49:47 +0000 Subject: [PATCH] Retrying 3 times on EBUSY drives with generous usleep intervals --- cdrskin/cdrskin_timestamp.h | 2 +- libburn/sg-linux.c | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index e03b60e..0a673ad 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2009.06.03.185118" +#define Cdrskin_timestamP "2009.06.14.095004" diff --git a/libburn/sg-linux.c b/libburn/sg-linux.c index 0e5d6d2..30d9496 100644 --- a/libburn/sg-linux.c +++ b/libburn/sg-linux.c @@ -470,7 +470,7 @@ static int sg_fcntl_lock(int *fd, char *fd_name, int l_type, int verbous) /* ts A60926 */ static int sg_open_drive_fd(char *fname, int scan_mode) { - int open_mode = O_RDWR, fd; + int open_mode = O_RDWR, fd, tries= 0; char msg[81]; /* ts A70409 : DDLP-B */ @@ -502,7 +502,8 @@ static int sg_open_drive_fd(char *fname, int scan_mode) "libburn: experimental: O_EXCL= %d , O_NDELAY= %d\n", !!(open_mode&O_EXCL),!!(open_mode&O_NDELAY)); */ - + +try_open:; fd = open(fname, open_mode); if (fd == -1) { /* <<< debugging @@ -511,6 +512,17 @@ static int sg_open_drive_fd(char *fname, int scan_mode) fname,errno); */ if (errno == EBUSY) { + tries++; + +/* <<< debugging + fprintf(stderr, + "\nlibburn_DEBUG: EBUSY , tries= %d\n", tries); +*/ + + if (tries < 4) { + usleep(2000000); + goto try_open; + } sg_handle_busy_device(fname, errno); return -1; @@ -793,7 +805,7 @@ static int is_scsi_drive(char *fname, int *bus_no, int *host_no, if (ret<=0) { if (linux_sg_enumerate_debug) fprintf(stderr, "cannot lock siblings\n"); - sg_handle_busy_device(fname, 0); + sg_handle_busy_device(fname, 0); return 0; } /* the final occupation will be done in sg_grab() */