Reporting sense data with burn_set_scsi_logging()

This commit is contained in:
Thomas Schmitt 2010-08-02 10:07:09 +00:00
parent b96aeece99
commit cdcda19384
6 changed files with 32 additions and 48 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2010.07.29.164100" #define Cdrskin_timestamP "2010.08.02.100630"

View File

@ -964,8 +964,9 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
if (burn_sg_log_scsi & 3) { if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time /* >>> Need own duration time
measurement. Then remove bit1 */ measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, scsi_log_err(c, fp, c->sense,
(c->error != 0) | 2); sense_len > 0 ? sense_len : 18,
0, (c->error != 0) | 2);
scsi_log_cmd(c,fp,0); scsi_log_cmd(c,fp,0);
} }
break; break;
@ -985,7 +986,8 @@ ex:;
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, c->sense, 0, (c->error != 0) | 2); scsi_log_err(c, fp, c->sense, sense_len > 0 ? sense_len : 18,
0, (c->error != 0) | 2);
cam_freeccb(ccb); cam_freeccb(ccb);
return ret; return ret;

View File

@ -697,7 +697,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
if (burn_sg_log_scsi & 3) { if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time /* >>> Need own duration time
measurement. Then remove bit1 */ measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, scsi_log_err(c, fp, c->sense, 18, 0,
(c->error != 0) | 2); (c->error != 0) | 2);
scsi_log_cmd(c,fp,0); scsi_log_cmd(c,fp,0);
} }
@ -727,7 +727,7 @@ ex:;
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, c->sense, 0, (c->error != 0) | 2); scsi_log_err(c, fp, c->sense, 18, 0, (c->error != 0) | 2);
return 1; return 1;
} }

View File

@ -1773,36 +1773,6 @@ int sg_release(struct burn_drive *d)
} }
#ifdef NIX
/* <<< now in spc.c as scsi_log_err */
/** logs outcome of a sg command. flag&1 causes an error message */
static int sg_log_err(struct command *c, FILE *fp,
sg_io_hdr_t *s,
int flag)
{
if(fp != NULL && (fp == stderr || (burn_sg_log_scsi & 1))) {
if(flag & 1) {
fprintf(fp,
"+++ key=%X asc=%2.2Xh ascq=%2.2Xh (%6d ms)\n",
s->sbp[2], s->sbp[12], s->sbp[13],s->duration);
} else {
scsi_show_cmd_reply(c, fp, 0);
fprintf(fp,"%6d ms\n", s->duration);
}
if (burn_sg_log_scsi & 4)
fflush(fp);
}
if (fp == stderr || !(burn_sg_log_scsi & 2))
return 1;
sg_log_err(c, stderr, s, flag);
return 1;
}
#endif /* NIX */
/** Sends a SCSI command to the drive, receives reply and evaluates wether /** Sends a SCSI command to the drive, receives reply and evaluates wether
the command succeeded or shall be retried or finally failed. the command succeeded or shall be retried or finally failed.
Returned SCSI errors shall not lead to a return value indicating failure. Returned SCSI errors shall not lead to a return value indicating failure.
@ -1933,8 +1903,8 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
case RETRY: case RETRY:
done = 0; done = 0;
if (burn_sg_log_scsi & 3) { if (burn_sg_log_scsi & 3) {
scsi_log_err(c, fp, s.sbp, s.duration, scsi_log_err(c, fp, s.sbp, s.sb_len_wr,
c->error != 0); s.duration, c->error != 0);
scsi_log_cmd(c,fp,0); scsi_log_cmd(c,fp,0);
} }
break; break;
@ -1981,8 +1951,8 @@ ex:;
msg, 0, 0); msg, 0, 0);
} }
if (burn_sg_log_scsi & 3) if (burn_sg_log_scsi & 3)
/* <<< sg_log_err(c, fp, &s, c->error != 0); */ scsi_log_err(c, fp, s.sbp, s.sb_len_wr,
scsi_log_err(c, fp, s.sbp, s.duration, c->error != 0); s.duration, c->error != 0);
return 1; return 1;
} }

View File

@ -1520,19 +1520,31 @@ int scsi_log_cmd(struct command *c, void *fp_in, int flag)
bit1 do not print duration bit1 do not print duration
*/ */
int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18], int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18],
int duration, int flag) int sense_len, int duration, int flag)
{ {
char durtxt[20]; char durtxt[20];
FILE *fp = fp_in; FILE *fp = fp_in;
int key, asc, ascq, i, l;
if(fp != NULL && (fp == stderr || (burn_sg_log_scsi & 1))) { if (fp != NULL && (fp == stderr || (burn_sg_log_scsi & 1))) {
if(flag & 1) { if (flag & 1) {
durtxt[0] = 0; durtxt[0] = 0;
if (!(flag & 2)) if (!(flag & 2))
sprintf(durtxt, " (%6d ms)\n",duration); sprintf(durtxt, " (%6d ms)", duration);
spc_decode_sense(sense, 0, &key, &asc, &ascq);
fprintf(fp, "+++ key=%X asc=%2.2Xh ascq=%2.2Xh%s\n", fprintf(fp, "+++ key=%X asc=%2.2Xh ascq=%2.2Xh%s\n",
sense[2], sense[12], sense[13], durtxt); (unsigned int) key, (unsigned int) asc,
(unsigned int) ascq, durtxt);
l = 18;
if ((sense[0] & 0x7f) == 0x72 ||
(sense[0] & 0x7f) == 0x73)
l = sense[7] + 7 + 1; /* SPC-5 4.5.2. */
if (l > sense_len)
l = sense_len;
fprintf(fp, "+++ sense data =");
for (i = 0 ; i < l; i++)
fprintf(fp, " %2.2X", sense[i]);
fprintf(fp, "\n");
} else { } else {
scsi_show_cmd_reply(c, fp, 0); scsi_show_cmd_reply(c, fp, 0);
if (!(flag & 2)) if (!(flag & 2))
@ -1543,7 +1555,7 @@ int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18],
} }
if (fp == stderr || !(burn_sg_log_scsi & 2)) if (fp == stderr || !(burn_sg_log_scsi & 2))
return 1; return 1;
scsi_log_err(c, stderr, sense, duration, flag); scsi_log_err(c, stderr, sense, sense_len, duration, flag);
return 1; return 1;
} }

View File

@ -78,7 +78,7 @@ int scsi_log_cmd(struct command *c, void *fp, int flag);
/* ts A91221 (former sg_log_err ts A91108) */ /* ts A91221 (former sg_log_err ts A91108) */
/** Logs outcome of a sg command. */ /** Logs outcome of a sg command. */
int scsi_log_err(struct command *c, void *fp, unsigned char sense[18], int scsi_log_err(struct command *c, void *fp, unsigned char sense[18],
int duration, int flag); int sense_len, int duration, int flag);
/* ts B00728 */ /* ts B00728 */
int spc_decode_sense(unsigned char *sense, int senselen, int spc_decode_sense(unsigned char *sense, int senselen,