Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[SCSI] constants.c: cleanup, verbose result printing

Clean up constants.c and make result printing more user friendly:

- Refactor the command and sense functions so that the actual
formatting can be called from the various helper functions with the
correct prefix.

- Replace scsi_print_hostbyte() and scsi_print_driverbyte() with
scsi_print_result() which is verbose when CONFIG_SCSI_CONSTANTS is
on.

Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

authored by

Martin K. Petersen and committed by
James Bottomley
684b7fe9 862794fa

+151 -126
+145 -122
drivers/scsi/constants.c
··· 202 202 } 203 203 204 204 /* attempt to guess cdb length if cdb_len==0 . No trailing linefeed. */ 205 - static void print_opcode_name(unsigned char * cdbp, int cdb_len, 206 - int start_of_line) 205 + static void print_opcode_name(unsigned char * cdbp, int cdb_len) 207 206 { 208 207 int sa, len, cdb0; 209 208 const char * name; 210 - const char * leadin = start_of_line ? KERN_INFO : ""; 211 209 212 210 cdb0 = cdbp[0]; 213 211 switch(cdb0) { 214 212 case VARIABLE_LENGTH_CMD: 215 213 len = cdbp[7] + 8; 216 214 if (len < 10) { 217 - printk("%sshort variable length command, " 218 - "len=%d ext_len=%d", leadin, len, cdb_len); 215 + printk("short variable length command, " 216 + "len=%d ext_len=%d", len, cdb_len); 219 217 break; 220 218 } 221 219 sa = (cdbp[8] << 8) + cdbp[9]; 222 220 name = get_sa_name(maint_in_arr, MAINT_IN_SZ, sa); 223 221 if (name) { 224 - printk("%s%s", leadin, name); 222 + printk("%s", name); 225 223 if ((cdb_len > 0) && (len != cdb_len)) 226 224 printk(", in_cdb_len=%d, ext_len=%d", 227 225 len, cdb_len); 228 226 } else { 229 - printk("%scdb[0]=0x%x, sa=0x%x", leadin, cdb0, sa); 227 + printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); 230 228 if ((cdb_len > 0) && (len != cdb_len)) 231 229 printk(", in_cdb_len=%d, ext_len=%d", 232 230 len, cdb_len); ··· 234 236 sa = cdbp[1] & 0x1f; 235 237 name = get_sa_name(maint_in_arr, MAINT_IN_SZ, sa); 236 238 if (name) 237 - printk("%s%s", leadin, name); 239 + printk("%s", name); 238 240 else 239 - printk("%scdb[0]=0x%x, sa=0x%x", leadin, cdb0, sa); 241 + printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); 240 242 break; 241 243 case MAINTENANCE_OUT: 242 244 sa = cdbp[1] & 0x1f; 243 245 name = get_sa_name(maint_out_arr, MAINT_OUT_SZ, sa); 244 246 if (name) 245 - printk("%s%s", leadin, name); 247 + printk("%s", name); 246 248 else 247 - printk("%scdb[0]=0x%x, sa=0x%x", leadin, cdb0, sa); 249 + printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); 248 250 break; 249 251 case SERVICE_ACTION_IN_12: 250 252 sa = cdbp[1] & 0x1f; 251 253 name = get_sa_name(serv_in12_arr, SERV_IN12_SZ, sa); 252 254 if (name) 253 - printk("%s%s", leadin, name); 255 + printk("%s", name); 254 256 else 255 - printk("%scdb[0]=0x%x, sa=0x%x", leadin, cdb0, sa); 257 + printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); 256 258 break; 257 259 case SERVICE_ACTION_OUT_12: 258 260 sa = cdbp[1] & 0x1f; 259 261 name = get_sa_name(serv_out12_arr, SERV_OUT12_SZ, sa); 260 262 if (name) 261 - printk("%s%s", leadin, name); 263 + printk("%s", name); 262 264 else 263 - printk("%scdb[0]=0x%x, sa=0x%x", leadin, cdb0, sa); 265 + printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); 264 266 break; 265 267 case SERVICE_ACTION_IN_16: 266 268 sa = cdbp[1] & 0x1f; 267 269 name = get_sa_name(serv_in16_arr, SERV_IN16_SZ, sa); 268 270 if (name) 269 - printk("%s%s", leadin, name); 271 + printk("%s", name); 270 272 else 271 - printk("%scdb[0]=0x%x, sa=0x%x", leadin, cdb0, sa); 273 + printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); 272 274 break; 273 275 case SERVICE_ACTION_OUT_16: 274 276 sa = cdbp[1] & 0x1f; 275 277 name = get_sa_name(serv_out16_arr, SERV_OUT16_SZ, sa); 276 278 if (name) 277 - printk("%s%s", leadin, name); 279 + printk("%s", name); 278 280 else 279 - printk("%scdb[0]=0x%x, sa=0x%x", leadin, cdb0, sa); 281 + printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); 280 282 break; 281 283 default: 282 284 if (cdb0 < 0xc0) { 283 285 name = cdb_byte0_names[cdb0]; 284 286 if (name) 285 - printk("%s%s", leadin, name); 287 + printk("%s", name); 286 288 else 287 - printk("%scdb[0]=0x%x (reserved)", 288 - leadin, cdb0); 289 + printk("cdb[0]=0x%x (reserved)", cdb0); 289 290 } else 290 - printk("%scdb[0]=0x%x (vendor)", leadin, cdb0); 291 + printk("cdb[0]=0x%x (vendor)", cdb0); 291 292 break; 292 293 } 293 294 } 294 295 295 296 #else /* ifndef CONFIG_SCSI_CONSTANTS */ 296 297 297 - static void print_opcode_name(unsigned char * cdbp, int cdb_len, 298 - int start_of_line) 298 + static void print_opcode_name(unsigned char * cdbp, int cdb_len) 299 299 { 300 300 int sa, len, cdb0; 301 - const char * leadin = start_of_line ? KERN_INFO : ""; 302 301 303 302 cdb0 = cdbp[0]; 304 303 switch(cdb0) { 305 304 case VARIABLE_LENGTH_CMD: 306 305 len = cdbp[7] + 8; 307 306 if (len < 10) { 308 - printk("%sshort opcode=0x%x command, len=%d " 309 - "ext_len=%d", leadin, cdb0, len, cdb_len); 307 + printk("short opcode=0x%x command, len=%d " 308 + "ext_len=%d", cdb0, len, cdb_len); 310 309 break; 311 310 } 312 311 sa = (cdbp[8] << 8) + cdbp[9]; 313 - printk("%scdb[0]=0x%x, sa=0x%x", leadin, cdb0, sa); 312 + printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); 314 313 if (len != cdb_len) 315 314 printk(", in_cdb_len=%d, ext_len=%d", len, cdb_len); 316 315 break; ··· 318 323 case SERVICE_ACTION_IN_16: 319 324 case SERVICE_ACTION_OUT_16: 320 325 sa = cdbp[1] & 0x1f; 321 - printk("%scdb[0]=0x%x, sa=0x%x", leadin, cdb0, sa); 326 + printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); 322 327 break; 323 328 default: 324 329 if (cdb0 < 0xc0) 325 - printk("%scdb[0]=0x%x", leadin, cdb0); 330 + printk("cdb[0]=0x%x", cdb0); 326 331 else 327 - printk("%scdb[0]=0x%x (vendor)", leadin, cdb0); 332 + printk("cdb[0]=0x%x (vendor)", cdb0); 328 333 break; 329 334 } 330 335 } 331 336 #endif 332 337 333 - void __scsi_print_command(unsigned char *command) 338 + void __scsi_print_command(unsigned char *cdb) 334 339 { 335 340 int k, len; 336 341 337 - print_opcode_name(command, 0, 1); 338 - if (VARIABLE_LENGTH_CMD == command[0]) 339 - len = command[7] + 8; 342 + print_opcode_name(cdb, 0); 343 + if (VARIABLE_LENGTH_CMD == cdb[0]) 344 + len = cdb[7] + 8; 340 345 else 341 - len = COMMAND_SIZE(command[0]); 346 + len = COMMAND_SIZE(cdb[0]); 342 347 /* print out all bytes in cdb */ 343 348 for (k = 0; k < len; ++k) 344 - printk(" %02x", command[k]); 349 + printk(" %02x", cdb[k]); 345 350 printk("\n"); 346 351 } 347 352 EXPORT_SYMBOL(__scsi_print_command); 348 353 349 - /* This function (perhaps with the addition of peripheral device type) 350 - * is more approriate than __scsi_print_command(). Perhaps that static 351 - * can be dropped later if it replaces the __scsi_print_command version. 352 - */ 353 - static void scsi_print_cdb(unsigned char *cdb, int cdb_len, int start_of_line) 354 + void scsi_print_command(struct scsi_cmnd *cmd) 354 355 { 355 356 int k; 356 357 357 - print_opcode_name(cdb, cdb_len, start_of_line); 358 + scmd_printk(KERN_INFO, cmd, "CDB: "); 359 + print_opcode_name(cmd->cmnd, cmd->cmd_len); 360 + 358 361 /* print out all bytes in cdb */ 359 362 printk(":"); 360 - for (k = 0; k < cdb_len; ++k) 361 - printk(" %02x", cdb[k]); 363 + for (k = 0; k < cmd->cmd_len; ++k) 364 + printk(" %02x", cmd->cmnd[k]); 362 365 printk("\n"); 363 366 } 367 + EXPORT_SYMBOL(scsi_print_command); 364 368 365 369 /** 366 370 * ··· 1170 1176 } 1171 1177 EXPORT_SYMBOL(scsi_extd_sense_format); 1172 1178 1173 - /* Print extended sense information; no leadin, no linefeed */ 1174 - static void 1179 + void 1175 1180 scsi_show_extd_sense(unsigned char asc, unsigned char ascq) 1176 1181 { 1177 - const char *extd_sense_fmt = scsi_extd_sense_format(asc, ascq); 1182 + const char *extd_sense_fmt = scsi_extd_sense_format(asc, ascq); 1178 1183 1179 1184 if (extd_sense_fmt) { 1180 1185 if (strstr(extd_sense_fmt, "%x")) { 1181 - printk("Additional sense: "); 1186 + printk("Add. Sense: "); 1182 1187 printk(extd_sense_fmt, ascq); 1183 1188 } else 1184 - printk("Additional sense: %s", extd_sense_fmt); 1189 + printk("Add. Sense: %s", extd_sense_fmt); 1185 1190 } else { 1186 1191 if (asc >= 0x80) 1187 - printk("<<vendor>> ASC=0x%x ASCQ=0x%x", asc, ascq); 1192 + printk("<<vendor>> ASC=0x%x ASCQ=0x%x", asc, 1193 + ascq); 1188 1194 if (ascq >= 0x80) 1189 - printk("ASC=0x%x <<vendor>> ASCQ=0x%x", asc, ascq); 1195 + printk("ASC=0x%x <<vendor>> ASCQ=0x%x", asc, 1196 + ascq); 1190 1197 else 1191 1198 printk("ASC=0x%x ASCQ=0x%x", asc, ascq); 1192 1199 } 1200 + 1201 + printk("\n"); 1193 1202 } 1203 + EXPORT_SYMBOL(scsi_show_extd_sense); 1194 1204 1195 1205 void 1196 - scsi_print_sense_hdr(const char *name, struct scsi_sense_hdr *sshdr) 1206 + scsi_show_sense_hdr(struct scsi_sense_hdr *sshdr) 1197 1207 { 1198 1208 const char *sense_txt; 1199 - /* An example of deferred is when an earlier write to disk cache 1200 - * succeeded, but now the disk discovers that it cannot write the 1201 - * data to the magnetic media. 1202 - */ 1203 - const char *error = scsi_sense_is_deferred(sshdr) ? 1204 - "<<DEFERRED>>" : "Current"; 1205 - printk(KERN_INFO "%s: %s", name, error); 1206 - if (sshdr->response_code >= 0x72) 1207 - printk(" [descriptor]"); 1208 1209 1209 1210 sense_txt = scsi_sense_key_string(sshdr->sense_key); 1210 1211 if (sense_txt) 1211 - printk(": sense key: %s\n", sense_txt); 1212 + printk("Sense Key : %s ", sense_txt); 1212 1213 else 1213 - printk(": sense key=0x%x\n", sshdr->sense_key); 1214 - printk(KERN_INFO " "); 1215 - scsi_show_extd_sense(sshdr->asc, sshdr->ascq); 1214 + printk("Sense Key : 0x%x ", sshdr->sense_key); 1215 + 1216 + printk("%s", scsi_sense_is_deferred(sshdr) ? "[deferred] " : 1217 + "[current] "); 1218 + 1219 + if (sshdr->response_code >= 0x72) 1220 + printk("[descriptor]"); 1221 + 1216 1222 printk("\n"); 1223 + } 1224 + EXPORT_SYMBOL(scsi_show_sense_hdr); 1225 + 1226 + /* 1227 + * Print normalized SCSI sense header with a prefix. 1228 + */ 1229 + void 1230 + scsi_print_sense_hdr(const char *name, struct scsi_sense_hdr *sshdr) 1231 + { 1232 + printk(KERN_INFO "%s: ", name); 1233 + scsi_show_sense_hdr(sshdr); 1234 + printk(KERN_INFO "%s: ", name); 1235 + scsi_show_extd_sense(sshdr->asc, sshdr->ascq); 1217 1236 } 1218 1237 EXPORT_SYMBOL(scsi_print_sense_hdr); 1219 1238 1220 - /* Print sense information */ 1221 1239 void 1222 - __scsi_print_sense(const char *name, const unsigned char *sense_buffer, 1223 - int sense_len) 1240 + scsi_decode_sense_buffer(const unsigned char *sense_buffer, int sense_len, 1241 + struct scsi_sense_hdr *sshdr) 1224 1242 { 1225 1243 int k, num, res; 1226 - unsigned int info; 1227 - struct scsi_sense_hdr ssh; 1228 1244 1229 - res = scsi_normalize_sense(sense_buffer, sense_len, &ssh); 1245 + res = scsi_normalize_sense(sense_buffer, sense_len, sshdr); 1230 1246 if (0 == res) { 1231 1247 /* this may be SCSI-1 sense data */ 1232 1248 num = (sense_len < 32) ? sense_len : 32; 1233 - printk(KERN_INFO "Unrecognized sense data (in hex):"); 1249 + printk("Unrecognized sense data (in hex):"); 1234 1250 for (k = 0; k < num; ++k) { 1235 1251 if (0 == (k % 16)) { 1236 1252 printk("\n"); ··· 1251 1247 printk("\n"); 1252 1248 return; 1253 1249 } 1254 - scsi_print_sense_hdr(name, &ssh); 1255 - if (ssh.response_code < 0x72) { 1250 + } 1251 + 1252 + void 1253 + scsi_decode_sense_extras(const unsigned char *sense_buffer, int sense_len, 1254 + struct scsi_sense_hdr *sshdr) 1255 + { 1256 + int k, num, res; 1257 + 1258 + if (sshdr->response_code < 0x72) 1259 + { 1256 1260 /* only decode extras for "fixed" format now */ 1257 1261 char buff[80]; 1258 1262 int blen, fixed_valid; 1263 + unsigned int info; 1259 1264 1260 1265 fixed_valid = sense_buffer[0] & 0x80; 1261 1266 info = ((sense_buffer[3] << 24) | (sense_buffer[4] << 16) | ··· 1294 1281 res += snprintf(buff + res, blen - res, "ILI"); 1295 1282 } 1296 1283 if (res > 0) 1297 - printk(KERN_INFO "%s\n", buff); 1298 - } else if (ssh.additional_length > 0) { 1284 + printk("%s\n", buff); 1285 + } else if (sshdr->additional_length > 0) { 1299 1286 /* descriptor format with sense descriptors */ 1300 - num = 8 + ssh.additional_length; 1287 + num = 8 + sshdr->additional_length; 1301 1288 num = (sense_len < num) ? sense_len : num; 1302 - printk(KERN_INFO "Descriptor sense data with sense " 1303 - "descriptors (in hex):"); 1289 + printk("Descriptor sense data with sense descriptors " 1290 + "(in hex):"); 1304 1291 for (k = 0; k < num; ++k) { 1305 1292 if (0 == (k % 16)) { 1306 1293 printk("\n"); ··· 1308 1295 } 1309 1296 printk("%02x ", sense_buffer[k]); 1310 1297 } 1298 + 1311 1299 printk("\n"); 1312 1300 } 1301 + 1302 + } 1303 + 1304 + /* Normalize and print sense buffer with name prefix */ 1305 + void __scsi_print_sense(const char *name, const unsigned char *sense_buffer, 1306 + int sense_len) 1307 + { 1308 + struct scsi_sense_hdr sshdr; 1309 + 1310 + printk(KERN_INFO "%s: ", name); 1311 + scsi_decode_sense_buffer(sense_buffer, sense_len, &sshdr); 1312 + scsi_show_sense_hdr(&sshdr); 1313 + scsi_decode_sense_extras(sense_buffer, sense_len, &sshdr); 1314 + printk(KERN_INFO "%s: ", name); 1315 + scsi_show_extd_sense(sshdr.asc, sshdr.ascq); 1313 1316 } 1314 1317 EXPORT_SYMBOL(__scsi_print_sense); 1315 1318 1316 - void scsi_print_sense(const char *devclass, struct scsi_cmnd *cmd) 1319 + /* Normalize and print sense buffer in SCSI command */ 1320 + void scsi_print_sense(char *name, struct scsi_cmnd *cmd) 1317 1321 { 1318 - const char *name = devclass; 1322 + struct scsi_sense_hdr sshdr; 1319 1323 1320 - if (cmd->request->rq_disk) 1321 - name = cmd->request->rq_disk->disk_name; 1322 - __scsi_print_sense(name, cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE); 1324 + scmd_printk(KERN_INFO, cmd, ""); 1325 + scsi_decode_sense_buffer(cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE, 1326 + &sshdr); 1327 + scsi_show_sense_hdr(&sshdr); 1328 + scsi_decode_sense_extras(cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE, 1329 + &sshdr); 1330 + scmd_printk(KERN_INFO, cmd, ""); 1331 + scsi_show_extd_sense(sshdr.asc, sshdr.ascq); 1323 1332 } 1324 1333 EXPORT_SYMBOL(scsi_print_sense); 1325 - 1326 - void scsi_print_command(struct scsi_cmnd *cmd) 1327 - { 1328 - /* Assume appended output (i.e. not at start of line) */ 1329 - sdev_printk("", cmd->device, "\n"); 1330 - printk(KERN_INFO " command: "); 1331 - scsi_print_cdb(cmd->cmnd, cmd->cmd_len, 0); 1332 - } 1333 - EXPORT_SYMBOL(scsi_print_command); 1334 1334 1335 1335 #ifdef CONFIG_SCSI_CONSTANTS 1336 1336 ··· 1352 1326 "DID_ABORT", "DID_PARITY", "DID_ERROR", "DID_RESET", "DID_BAD_INTR", 1353 1327 "DID_PASSTHROUGH", "DID_SOFT_ERROR", "DID_IMM_RETRY"}; 1354 1328 #define NUM_HOSTBYTE_STRS ARRAY_SIZE(hostbyte_table) 1355 - 1356 - void scsi_print_hostbyte(int scsiresult) 1357 - { 1358 - int hb = host_byte(scsiresult); 1359 - 1360 - printk("Hostbyte=0x%02x", hb); 1361 - if (hb < NUM_HOSTBYTE_STRS) 1362 - printk("(%s) ", hostbyte_table[hb]); 1363 - else 1364 - printk("is invalid "); 1365 - } 1366 - #else 1367 - void scsi_print_hostbyte(int scsiresult) 1368 - { 1369 - printk("Hostbyte=0x%02x ", host_byte(scsiresult)); 1370 - } 1371 - #endif 1372 - 1373 - #ifdef CONFIG_SCSI_CONSTANTS 1374 1329 1375 1330 static const char * const driverbyte_table[]={ 1376 1331 "DRIVER_OK", "DRIVER_BUSY", "DRIVER_SOFT", "DRIVER_MEDIA", "DRIVER_ERROR", ··· 1363 1356 "SUGGEST_5", "SUGGEST_6", "SUGGEST_7", "SUGGEST_SENSE"}; 1364 1357 #define NUM_SUGGEST_STRS ARRAY_SIZE(driversuggest_table) 1365 1358 1366 - void scsi_print_driverbyte(int scsiresult) 1359 + void scsi_show_result(int result) 1367 1360 { 1368 - int dr = (driver_byte(scsiresult) & DRIVER_MASK); 1369 - int su = ((driver_byte(scsiresult) & SUGGEST_MASK) >> 4); 1361 + int hb = host_byte(result); 1362 + int db = (driver_byte(result) & DRIVER_MASK); 1363 + int su = ((driver_byte(result) & SUGGEST_MASK) >> 4); 1370 1364 1371 - printk("Driverbyte=0x%02x ", driver_byte(scsiresult)); 1372 - printk("(%s,%s) ", 1373 - (dr < NUM_DRIVERBYTE_STRS ? driverbyte_table[dr] : "invalid"), 1365 + printk("Result: hostbyte=%s driverbyte=%s,%s\n", 1366 + (hb < NUM_HOSTBYTE_STRS ? hostbyte_table[hb] : "invalid"), 1367 + (db < NUM_DRIVERBYTE_STRS ? driverbyte_table[db] : "invalid"), 1374 1368 (su < NUM_SUGGEST_STRS ? driversuggest_table[su] : "invalid")); 1375 1369 } 1370 + 1376 1371 #else 1377 - void scsi_print_driverbyte(int scsiresult) 1372 + 1373 + void scsi_show_result(int result) 1378 1374 { 1379 - printk("Driverbyte=0x%02x ", driver_byte(scsiresult)); 1375 + printk("Result: hostbyte=0x%02x driverbyte=0x%02x\n", 1376 + host_byte(result), driver_byte(result)); 1380 1377 } 1378 + 1381 1379 #endif 1380 + EXPORT_SYMBOL(scsi_show_result); 1381 + 1382 + 1383 + void scsi_print_result(struct scsi_cmnd *cmd) 1384 + { 1385 + scmd_printk(KERN_INFO, cmd, ""); 1386 + scsi_show_result(cmd->result); 1387 + } 1388 + EXPORT_SYMBOL(scsi_print_result); 1389 + 1390 +
+6 -4
include/scsi/scsi_dbg.h
··· 5 5 struct scsi_sense_hdr; 6 6 7 7 extern void scsi_print_command(struct scsi_cmnd *); 8 - extern void scsi_print_sense_hdr(const char *, struct scsi_sense_hdr *); 9 8 extern void __scsi_print_command(unsigned char *); 10 - extern void scsi_print_sense(const char *, struct scsi_cmnd *); 9 + extern void scsi_show_extd_sense(unsigned char, unsigned char); 10 + extern void scsi_show_sense_hdr(struct scsi_sense_hdr *); 11 + extern void scsi_print_sense_hdr(const char *, struct scsi_sense_hdr *); 12 + extern void scsi_print_sense(char *, struct scsi_cmnd *); 11 13 extern void __scsi_print_sense(const char *name, 12 14 const unsigned char *sense_buffer, 13 15 int sense_len); 14 - extern void scsi_print_driverbyte(int); 15 - extern void scsi_print_hostbyte(int); 16 + extern void scsi_show_result(int); 17 + extern void scsi_print_result(struct scsi_cmnd *); 16 18 extern void scsi_print_status(unsigned char); 17 19 extern const char *scsi_sense_key_string(unsigned char); 18 20 extern const char *scsi_extd_sense_format(unsigned char, unsigned char);