Restricted retry to the timeout for single SCSI commands (200 seconds)

This commit is contained in:
Thomas Schmitt 2009-09-22 19:26:57 +00:00
parent 758f5a5c1e
commit 4457061656
2 changed files with 25 additions and 4 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2009.09.22.192545" #define Cdrskin_timestamP "2009.09.22.192802"

View File

@ -158,6 +158,13 @@ static char linux_ata_device_family[80] = {"/dev/hd%c"};
static int linux_ata_enumerate_verbous = 0; static int linux_ata_enumerate_verbous = 0;
/* The waiting time before eventually retrying a failed SCSI command.
Before each retry wait Libburn_sg_linux_retry_incR longer than with
the previous one.
*/
#define Libburn_sg_linux_retry_usleeP 100000
#define Libburn_sg_linux_retry_incR 100000
/** PORTING : ------ libburn portable headers and definitions ----- */ /** PORTING : ------ libburn portable headers and definitions ----- */
@ -1711,8 +1718,9 @@ static int sg_log_err(struct command *c, FILE *fp,
*/ */
int sg_issue_command(struct burn_drive *d, struct command *c) int sg_issue_command(struct burn_drive *d, struct command *c)
{ {
int done = 0, no_c_page = 0; int done = 0, no_c_page = 0, usleep_time, i;
int err; int err;
time_t start_time;
sg_io_hdr_t s; sg_io_hdr_t s;
#ifdef Libburn_log_sg_commandS #ifdef Libburn_log_sg_commandS
@ -1796,7 +1804,8 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
} }
s.usr_ptr = c; s.usr_ptr = c;
do { start_time = time(NULL);
for(i = 0; !done; i++) {
err = ioctl(d->fd, SG_IO, &s); err = ioctl(d->fd, SG_IO, &s);
/* ts A61010 */ /* ts A61010 */
@ -1830,10 +1839,22 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
c->error = 1; c->error = 1;
break; break;
} }
/* ts A90921 :
Calming down retries and breaking up endless cycle
*/
usleep_time = Libburn_sg_linux_retry_usleeP +
i * Libburn_sg_linux_retry_incR;
if (time(NULL) + usleep_time / 1000000 - start_time >
s.timeout / 1000 + 1) {
c->error = 1;
goto ex;
}
usleep(usleep_time);
} else { } else {
done = 1; done = 1;
} }
} while (!done); }
/* ts A61106 */ /* ts A61106 */
ex:; ex:;