Skip to content

Commit 2104551

Browse files
hreineckeChristoph Hellwig
authored and
Christoph Hellwig
committed
scsi: use per-cpu buffer for formatting sense
Convert sense buffer logging to use the per-cpu buffer to avoid line breakup. Tested-by: Robert Elliott <[email protected]> Reviewed-by: Robert Elliott <[email protected]> Signed-off-by: Hannes Reinecke <[email protected]> Signed-off-by: Christoph Hellwig <[email protected]>
1 parent cbba5b0 commit 2104551

File tree

4 files changed

+161
-125
lines changed

4 files changed

+161
-125
lines changed

drivers/scsi/constants.c

-107
Original file line numberDiff line numberDiff line change
@@ -1246,113 +1246,6 @@ scsi_extd_sense_format(unsigned char asc, unsigned char ascq, const char **fmt)
12461246
}
12471247
EXPORT_SYMBOL(scsi_extd_sense_format);
12481248

1249-
void
1250-
scsi_show_extd_sense(const struct scsi_device *sdev, const char *name,
1251-
unsigned char asc, unsigned char ascq)
1252-
{
1253-
const char *extd_sense_fmt = NULL;
1254-
const char *extd_sense_str = scsi_extd_sense_format(asc, ascq,
1255-
&extd_sense_fmt);
1256-
1257-
if (extd_sense_str) {
1258-
if (extd_sense_fmt)
1259-
sdev_prefix_printk(KERN_INFO, sdev, name,
1260-
"Add. Sense: %s (%s%x)",
1261-
extd_sense_str, extd_sense_fmt,
1262-
ascq);
1263-
else
1264-
sdev_prefix_printk(KERN_INFO, sdev, name,
1265-
"Add. Sense: %s", extd_sense_str);
1266-
1267-
} else {
1268-
sdev_prefix_printk(KERN_INFO, sdev, name,
1269-
"%sASC=0x%x %sASCQ=0x%x\n",
1270-
asc >= 0x80 ? "<<vendor>> " : "", asc,
1271-
ascq >= 0x80 ? "<<vendor>> " : "", ascq);
1272-
}
1273-
}
1274-
EXPORT_SYMBOL(scsi_show_extd_sense);
1275-
1276-
void
1277-
scsi_show_sense_hdr(const struct scsi_device *sdev, const char *name,
1278-
const struct scsi_sense_hdr *sshdr)
1279-
{
1280-
const char *sense_txt;
1281-
1282-
sense_txt = scsi_sense_key_string(sshdr->sense_key);
1283-
if (sense_txt)
1284-
sdev_prefix_printk(KERN_INFO, sdev, name,
1285-
"Sense Key : %s [%s]%s\n", sense_txt,
1286-
scsi_sense_is_deferred(sshdr) ?
1287-
"deferred" : "current",
1288-
sshdr->response_code >= 0x72 ?
1289-
" [descriptor]" : "");
1290-
else
1291-
sdev_prefix_printk(KERN_INFO, sdev, name,
1292-
"Sense Key : 0x%x [%s]%s", sshdr->sense_key,
1293-
scsi_sense_is_deferred(sshdr) ?
1294-
"deferred" : "current",
1295-
sshdr->response_code >= 0x72 ?
1296-
" [descriptor]" : "");
1297-
}
1298-
EXPORT_SYMBOL(scsi_show_sense_hdr);
1299-
1300-
/*
1301-
* Print normalized SCSI sense header with a prefix.
1302-
*/
1303-
void
1304-
scsi_print_sense_hdr(const struct scsi_device *sdev, const char *name,
1305-
const struct scsi_sense_hdr *sshdr)
1306-
{
1307-
scsi_show_sense_hdr(sdev, name, sshdr);
1308-
scsi_show_extd_sense(sdev, name, sshdr->asc, sshdr->ascq);
1309-
}
1310-
EXPORT_SYMBOL(scsi_print_sense_hdr);
1311-
1312-
static void
1313-
scsi_dump_sense_buffer(const unsigned char *sense_buffer, int sense_len)
1314-
{
1315-
int k, num;
1316-
1317-
num = (sense_len < 32) ? sense_len : 32;
1318-
printk("Unrecognized sense data (in hex):");
1319-
for (k = 0; k < num; ++k) {
1320-
if (0 == (k % 16)) {
1321-
printk("\n");
1322-
printk(KERN_INFO " ");
1323-
}
1324-
printk("%02x ", sense_buffer[k]);
1325-
}
1326-
printk("\n");
1327-
return;
1328-
}
1329-
1330-
/* Normalize and print sense buffer with name prefix */
1331-
void __scsi_print_sense(const struct scsi_device *sdev, const char *name,
1332-
const unsigned char *sense_buffer, int sense_len)
1333-
{
1334-
struct scsi_sense_hdr sshdr;
1335-
1336-
if (!scsi_normalize_sense(sense_buffer, sense_len, &sshdr)) {
1337-
scsi_dump_sense_buffer(sense_buffer, sense_len);
1338-
return;
1339-
}
1340-
scsi_show_sense_hdr(sdev, name, &sshdr);
1341-
scsi_show_extd_sense(sdev, name, sshdr.asc, sshdr.ascq);
1342-
}
1343-
EXPORT_SYMBOL(__scsi_print_sense);
1344-
1345-
/* Normalize and print sense buffer in SCSI command */
1346-
void scsi_print_sense(const struct scsi_cmnd *cmd)
1347-
{
1348-
struct gendisk *disk = cmd->request->rq_disk;
1349-
const char *disk_name = disk ? disk->disk_name : NULL;
1350-
1351-
__scsi_print_sense(cmd->device, disk_name, cmd->sense_buffer,
1352-
SCSI_SENSE_BUFFERSIZE);
1353-
}
1354-
EXPORT_SYMBOL(scsi_print_sense);
1355-
13561249
#ifdef CONFIG_SCSI_CONSTANTS
13571250

13581251
static const char * const hostbyte_table[]={

drivers/scsi/scsi_logging.c

+157-9
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,20 @@ static void scsi_log_release_buffer(char *bufptr)
6969
preempt_enable();
7070
}
7171

72-
static size_t scmd_format_header(char *logbuf, size_t logbuf_len,
73-
struct gendisk *disk, int tag)
72+
static inline const char *scmd_name(const struct scsi_cmnd *scmd)
73+
{
74+
return scmd->request->rq_disk ?
75+
scmd->request->rq_disk->disk_name : NULL;
76+
}
77+
78+
static size_t sdev_format_header(char *logbuf, size_t logbuf_len,
79+
const char *name, int tag)
7480
{
7581
size_t off = 0;
7682

77-
if (disk)
83+
if (name)
7884
off += scnprintf(logbuf + off, logbuf_len - off,
79-
"[%s] ", disk->disk_name);
85+
"[%s] ", name);
8086

8187
if (WARN_ON(off >= logbuf_len))
8288
return off;
@@ -119,7 +125,6 @@ EXPORT_SYMBOL(sdev_prefix_printk);
119125
int scmd_printk(const char *level, const struct scsi_cmnd *scmd,
120126
const char *fmt, ...)
121127
{
122-
struct gendisk *disk = scmd->request->rq_disk;
123128
va_list args;
124129
char *logbuf;
125130
size_t off = 0, logbuf_len;
@@ -131,7 +136,7 @@ int scmd_printk(const char *level, const struct scsi_cmnd *scmd,
131136
logbuf = scsi_log_reserve_buffer(&logbuf_len);
132137
if (!logbuf)
133138
return 0;
134-
off = scmd_format_header(logbuf, logbuf_len, disk,
139+
off = sdev_format_header(logbuf, logbuf_len, scmd_name(scmd),
135140
scmd->request->tag);
136141
if (off < logbuf_len) {
137142
va_start(args, fmt);
@@ -218,7 +223,6 @@ EXPORT_SYMBOL(__scsi_format_command);
218223

219224
void scsi_print_command(struct scsi_cmnd *cmd)
220225
{
221-
struct gendisk *disk = cmd->request->rq_disk;
222226
int k;
223227
char *logbuf;
224228
size_t off, logbuf_len;
@@ -230,7 +234,8 @@ void scsi_print_command(struct scsi_cmnd *cmd)
230234
if (!logbuf)
231235
return;
232236

233-
off = scmd_format_header(logbuf, logbuf_len, disk, cmd->request->tag);
237+
off = sdev_format_header(logbuf, logbuf_len,
238+
scmd_name(cmd), cmd->request->tag);
234239
if (off >= logbuf_len)
235240
goto out_printk;
236241
off += scnprintf(logbuf + off, logbuf_len - off, "CDB: ");
@@ -254,7 +259,8 @@ void scsi_print_command(struct scsi_cmnd *cmd)
254259
logbuf = scsi_log_reserve_buffer(&logbuf_len);
255260
if (!logbuf)
256261
break;
257-
off = scmd_format_header(logbuf, logbuf_len, disk,
262+
off = sdev_format_header(logbuf, logbuf_len,
263+
scmd_name(cmd),
258264
cmd->request->tag);
259265
if (!WARN_ON(off > logbuf_len - 58)) {
260266
off += scnprintf(logbuf + off, logbuf_len - off,
@@ -280,3 +286,145 @@ void scsi_print_command(struct scsi_cmnd *cmd)
280286
scsi_log_release_buffer(logbuf);
281287
}
282288
EXPORT_SYMBOL(scsi_print_command);
289+
290+
static size_t
291+
scsi_format_extd_sense(char *buffer, size_t buf_len,
292+
unsigned char asc, unsigned char ascq)
293+
{
294+
size_t off = 0;
295+
const char *extd_sense_fmt = NULL;
296+
const char *extd_sense_str = scsi_extd_sense_format(asc, ascq,
297+
&extd_sense_fmt);
298+
299+
if (extd_sense_str) {
300+
off = scnprintf(buffer, buf_len, "Add. Sense: %s",
301+
extd_sense_str);
302+
if (extd_sense_fmt)
303+
off += scnprintf(buffer + off, buf_len - off,
304+
"(%s%x)", extd_sense_fmt, ascq);
305+
} else {
306+
if (asc >= 0x80)
307+
off = scnprintf(buffer, buf_len, "<<vendor>>");
308+
off += scnprintf(buffer + off, buf_len - off,
309+
"ASC=0x%x ", asc);
310+
if (ascq >= 0x80)
311+
off += scnprintf(buffer + off, buf_len - off,
312+
"<<vendor>>");
313+
off += scnprintf(buffer + off, buf_len - off,
314+
"ASCQ=0x%x ", ascq);
315+
}
316+
return off;
317+
}
318+
319+
static size_t
320+
scsi_format_sense_hdr(char *buffer, size_t buf_len,
321+
const struct scsi_sense_hdr *sshdr)
322+
{
323+
const char *sense_txt;
324+
size_t off;
325+
326+
off = scnprintf(buffer, buf_len, "Sense Key : ");
327+
sense_txt = scsi_sense_key_string(sshdr->sense_key);
328+
if (sense_txt)
329+
off += scnprintf(buffer + off, buf_len - off,
330+
"%s ", sense_txt);
331+
else
332+
off += scnprintf(buffer + off, buf_len - off,
333+
"0x%x ", sshdr->sense_key);
334+
off += scnprintf(buffer + off, buf_len - off,
335+
scsi_sense_is_deferred(sshdr) ? "[deferred] " : "[current] ");
336+
337+
if (sshdr->response_code >= 0x72)
338+
off += scnprintf(buffer + off, buf_len - off, "[descriptor] ");
339+
return off;
340+
}
341+
342+
static void
343+
scsi_log_dump_sense(const struct scsi_device *sdev, const char *name, int tag,
344+
const unsigned char *sense_buffer, int sense_len)
345+
{
346+
char *logbuf;
347+
size_t logbuf_len;
348+
int i;
349+
350+
logbuf = scsi_log_reserve_buffer(&logbuf_len);
351+
if (!logbuf)
352+
return;
353+
354+
for (i = 0; i < sense_len; i += 16) {
355+
int len = min(sense_len - i, 16);
356+
size_t off;
357+
358+
off = sdev_format_header(logbuf, logbuf_len,
359+
name, tag);
360+
hex_dump_to_buffer(&sense_buffer[i], len, 16, 1,
361+
logbuf + off, logbuf_len - off,
362+
false);
363+
dev_printk(KERN_INFO, &sdev->sdev_gendev, logbuf);
364+
}
365+
scsi_log_release_buffer(logbuf);
366+
}
367+
368+
static void
369+
scsi_log_print_sense_hdr(const struct scsi_device *sdev, const char *name,
370+
int tag, const struct scsi_sense_hdr *sshdr)
371+
{
372+
char *logbuf;
373+
size_t off, logbuf_len;
374+
375+
logbuf = scsi_log_reserve_buffer(&logbuf_len);
376+
if (!logbuf)
377+
return;
378+
off = sdev_format_header(logbuf, logbuf_len, name, tag);
379+
off += scsi_format_sense_hdr(logbuf + off, logbuf_len - off, sshdr);
380+
dev_printk(KERN_INFO, &sdev->sdev_gendev, logbuf);
381+
scsi_log_release_buffer(logbuf);
382+
383+
logbuf = scsi_log_reserve_buffer(&logbuf_len);
384+
if (!logbuf)
385+
return;
386+
off = sdev_format_header(logbuf, logbuf_len, name, tag);
387+
off += scsi_format_extd_sense(logbuf + off, logbuf_len - off,
388+
sshdr->asc, sshdr->ascq);
389+
dev_printk(KERN_INFO, &sdev->sdev_gendev, logbuf);
390+
scsi_log_release_buffer(logbuf);
391+
}
392+
393+
static void
394+
scsi_log_print_sense(const struct scsi_device *sdev, const char *name, int tag,
395+
const unsigned char *sense_buffer, int sense_len)
396+
{
397+
struct scsi_sense_hdr sshdr;
398+
399+
if (scsi_normalize_sense(sense_buffer, sense_len, &sshdr))
400+
scsi_log_print_sense_hdr(sdev, name, tag, &sshdr);
401+
else
402+
scsi_log_dump_sense(sdev, name, tag, sense_buffer, sense_len);
403+
}
404+
405+
/*
406+
* Print normalized SCSI sense header with a prefix.
407+
*/
408+
void
409+
scsi_print_sense_hdr(const struct scsi_device *sdev, const char *name,
410+
const struct scsi_sense_hdr *sshdr)
411+
{
412+
scsi_log_print_sense_hdr(sdev, name, -1, sshdr);
413+
}
414+
EXPORT_SYMBOL(scsi_print_sense_hdr);
415+
416+
/* Normalize and print sense buffer with name prefix */
417+
void __scsi_print_sense(const struct scsi_device *sdev, const char *name,
418+
const unsigned char *sense_buffer, int sense_len)
419+
{
420+
scsi_log_print_sense(sdev, name, -1, sense_buffer, sense_len);
421+
}
422+
EXPORT_SYMBOL(__scsi_print_sense);
423+
424+
/* Normalize and print sense buffer in SCSI command */
425+
void scsi_print_sense(const struct scsi_cmnd *cmd)
426+
{
427+
scsi_log_print_sense(cmd->device, scmd_name(cmd), cmd->request->tag,
428+
cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE);
429+
}
430+
EXPORT_SYMBOL(scsi_print_sense);

drivers/scsi/sd.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -3318,11 +3318,8 @@ module_exit(exit_sd);
33183318
static void sd_print_sense_hdr(struct scsi_disk *sdkp,
33193319
struct scsi_sense_hdr *sshdr)
33203320
{
3321-
scsi_show_sense_hdr(sdkp->device,
3322-
sdkp->disk ? sdkp->disk->disk_name : NULL, sshdr);
3323-
scsi_show_extd_sense(sdkp->device,
3324-
sdkp->disk ? sdkp->disk->disk_name : NULL,
3325-
sshdr->asc, sshdr->ascq);
3321+
scsi_print_sense_hdr(sdkp->device,
3322+
sdkp->disk ? sdkp->disk->disk_name : NULL, sshdr);
33263323
}
33273324

33283325
static void sd_print_result(const struct scsi_disk *sdkp, const char *msg,

drivers/scsi/ufs/ufshcd.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -4714,10 +4714,8 @@ static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba,
47144714
sdev_printk(KERN_WARNING, sdp,
47154715
"START_STOP failed for power mode: %d, result %x\n",
47164716
pwr_mode, ret);
4717-
if (driver_byte(ret) & DRIVER_SENSE) {
4718-
scsi_show_sense_hdr(sdp, NULL, &sshdr);
4719-
scsi_show_extd_sense(sdp, NULL, sshdr.asc, sshdr.ascq);
4720-
}
4717+
if (driver_byte(ret) & DRIVER_SENSE)
4718+
scsi_print_sense_hdr(sdp, NULL, &sshdr);
47214719
}
47224720

47234721
if (!ret)

0 commit comments

Comments
 (0)