Forgot to forward sense reply to higher levels

This commit is contained in:
Thomas Schmitt 2010-01-09 14:18:55 +00:00
parent 80bcabfd57
commit 1ca38962d4

View File

@ -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;
} }