Forgot to forward sense reply to higher levels
This commit is contained in:
parent
650c05a4bd
commit
3c970efff4
@ -442,8 +442,8 @@ int sg_drive_is_open(struct burn_drive * d)
|
|||||||
int sg_grab(struct burn_drive *d)
|
int sg_grab(struct burn_drive *d)
|
||||||
{
|
{
|
||||||
CdIo_t *p_cdio;
|
CdIo_t *p_cdio;
|
||||||
char *am, msg[4096];
|
char *am_eff, msg[4096], *am_wanted;
|
||||||
int os_errno;
|
int os_errno, second_try = 0;
|
||||||
|
|
||||||
if (d->p_cdio != NULL) {
|
if (d->p_cdio != NULL) {
|
||||||
d->released = 0;
|
d->released = 0;
|
||||||
@ -451,9 +451,9 @@ int sg_grab(struct burn_drive *d)
|
|||||||
}
|
}
|
||||||
if (d->libcdio_name[0] == 0) /* just to be sure it is initialized */
|
if (d->libcdio_name[0] == 0) /* just to be sure it is initialized */
|
||||||
strcpy(d->libcdio_name, d->devname);
|
strcpy(d->libcdio_name, d->devname);
|
||||||
p_cdio = cdio_open_am(d->libcdio_name, DRIVER_DEVICE,
|
am_wanted = burn_sg_open_o_excl ? "MMC_RDWR_EXCL" : "MMC_RDWR";
|
||||||
burn_sg_open_o_excl ? "MMC_RDWR_EXCL" : "MMC_RDWR");
|
try_to_open:;
|
||||||
|
p_cdio = cdio_open_am(d->libcdio_name, DRIVER_DEVICE, am_wanted);
|
||||||
if (p_cdio == NULL) {
|
if (p_cdio == NULL) {
|
||||||
os_errno = errno;
|
os_errno = errno;
|
||||||
sprintf(msg, "Could not grab drive '%s'", d->devname);
|
sprintf(msg, "Could not grab drive '%s'", d->devname);
|
||||||
@ -463,13 +463,19 @@ int sg_grab(struct burn_drive *d)
|
|||||||
msg, os_errno, 0);
|
msg, os_errno, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
am = (char *) cdio_get_arg(p_cdio, "access-mode");
|
am_eff = (char *) cdio_get_arg(p_cdio, "access-mode");
|
||||||
if (strncmp(am, "MMC_RDWR", 8) != 0) {
|
if (strncmp(am_eff, "MMC_RDWR", 8) != 0) {
|
||||||
|
cdio_destroy(p_cdio);
|
||||||
|
if (!second_try) {
|
||||||
|
am_wanted = burn_sg_open_o_excl ?
|
||||||
|
"MMC_RDWR" : "MMC_RDWR_EXCL";
|
||||||
|
second_try = 1;
|
||||||
|
goto try_to_open;
|
||||||
|
}
|
||||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
0x00020003,
|
0x00020003,
|
||||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
"libcdio provides no MMC_RDWR access mode", 0, 0);
|
"libcdio provides no MMC_RDWR access mode", 0, 0);
|
||||||
cdio_destroy(p_cdio);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,7 +521,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||||||
mmc_cdb_t cdb = {{0, }};
|
mmc_cdb_t cdb = {{0, }};
|
||||||
cdio_mmc_direction_t e_direction;
|
cdio_mmc_direction_t e_direction;
|
||||||
CdIo_t *p_cdio;
|
CdIo_t *p_cdio;
|
||||||
unsigned char sense[18], *sense_pt = NULL;
|
unsigned char *sense_pt = NULL;
|
||||||
|
|
||||||
c->error = 0;
|
c->error = 0;
|
||||||
if (d->p_cdio == NULL) {
|
if (d->p_cdio == NULL) {
|
||||||
@ -558,7 +564,9 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||||||
dxfer_len, c->page->data);
|
dxfer_len, c->page->data);
|
||||||
sense_valid = mmc_last_cmd_sense(p_cdio, &sense_pt);
|
sense_valid = mmc_last_cmd_sense(p_cdio, &sense_pt);
|
||||||
if (sense_valid >= 18)
|
if (sense_valid >= 18)
|
||||||
memcpy(sense, sense_pt, 18);
|
memcpy(c->sense, sense_pt,
|
||||||
|
sense_valid >= sizeof(c->sense) ?
|
||||||
|
sizeof(c->sense) : sense_valid );
|
||||||
if (sense_pt != NULL)
|
if (sense_pt != NULL)
|
||||||
free(sense_pt);
|
free(sense_pt);
|
||||||
|
|
||||||
@ -581,21 +589,22 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (!sense_valid) {
|
if (!sense_valid) {
|
||||||
memset(sense, 0, 18);
|
memset(c->sense, 0, sizeof(c->sense));
|
||||||
if (i_status != 0) { /* set dummy sense */
|
if (i_status != 0) { /* set dummy sense */
|
||||||
/*LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE*/
|
/*LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE*/
|
||||||
sense[2] = 0x02;
|
c->sense[2] = 0x02;
|
||||||
sense[12] = 0x04;
|
c->sense[12] = 0x04;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
sense[2] &= 15;
|
c->sense[2] &= 15;
|
||||||
|
|
||||||
if (i_status != 0 || (sense[2] || sense[12] || sense[13])) {
|
if (i_status != 0 ||
|
||||||
|
(c->sense[2] || c->sense[12] || c->sense[13])) {
|
||||||
if (!c->retry) {
|
if (!c->retry) {
|
||||||
c->error = 1;
|
c->error = 1;
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
switch (scsi_error(d, sense, 18)) {
|
switch (scsi_error(d, c->sense, 18)) {
|
||||||
case RETRY:
|
case RETRY:
|
||||||
break;
|
break;
|
||||||
case FAIL:
|
case FAIL:
|
||||||
@ -619,11 +628,11 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||||||
|
|
||||||
ex:;
|
ex:;
|
||||||
if (c->error)
|
if (c->error)
|
||||||
scsi_notify_error(d, c, sense, 18, 0);
|
scsi_notify_error(d, c, c->sense, 18, 0);
|
||||||
|
|
||||||
if (burn_sg_log_scsi & 3)
|
if (burn_sg_log_scsi & 3)
|
||||||
/* >>> Need own duration time measurement. Then remove bit1 */
|
/* >>> Need own duration time measurement. Then remove bit1 */
|
||||||
scsi_log_err(c, fp, sense, 0, (c->error != 0) | 2);
|
scsi_log_err(c, fp, c->sense, 0, (c->error != 0) | 2);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user