From e94d0e3deb34e684ca83573d7d2bc9b382db2427 Mon Sep 17 00:00:00 2001 From: William Cohen Date: Tue, 12 Sep 2023 10:18:58 -0400 Subject: [PATCH] Have the scsi tapset support newer kernels struct scsi_cmnd The linux kernel commit 2266a2def97ce11ec removed the request field from struct scsi_cmnd. The scsi tapset needed to test whether the request field is available. If request field is not available, use the linux kernels helper function scsi_cmd_to_rq to get a value for request. --- tapset/linux/scsi.stp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/tapset/linux/scsi.stp b/tapset/linux/scsi.stp index 5359fe817..d516dbf03 100644 --- a/tapset/linux/scsi.stp +++ b/tapset/linux/scsi.stp @@ -47,6 +47,22 @@ function describe_device_state:string(state:long) default: strlcpy(STAP_RETVALUE, "[INVALID]", MAXSTRINGLEN); } %} + +@__private30 function scsi_cmd_to_rq:long(cmd:long) +%{ + struct scsi_cmnd *scmd = (struct scsi_cmnd *) STAP_ARG_cmd; + STAP_RETVALUE = (int64_t) scsi_cmd_to_rq(scmd); +%} + +function get_scsi_request:long(scsi_cmd:long) +{ + if (@defined(@cast(scsi_cmd, "struct_cmnd", "kernel:scsi_mod")->request)) { + return @cast(scsi_cmd, "struct_cmnd *", "kernel:scsi_mod")->request + }else { + return scsi_cmd_to_rq(scsi_cmd) + } +} + /** * probe scsi.ioentry - Prepares a SCSI mid-layer request * @disk_major: The major number of the disk (-1 if no information) @@ -108,7 +124,7 @@ probe scsi.iodispatching $cmd->request_buffer) request_bufflen = @choose_defined($cmd->sdb->length, $cmd->request_bufflen) - req_addr = $cmd->request + req_addr = get_scsi_request($cmd) } /** @@ -142,7 +158,7 @@ probe scsi.iodone device_state_str = describe_device_state(device_state) data_direction = $cmd->sc_data_direction data_direction_str = describe_data_direction(data_direction) - req_addr = $cmd->request + req_addr = get_scsi_request($cmd) scsi_timer_pending = scsi_timer_pending($cmd); } @@ -173,7 +189,7 @@ probe scsi.iocompleted device_state_str = describe_device_state(device_state) data_direction = $cmd->sc_data_direction data_direction_str = describe_data_direction(data_direction) - req_addr = $cmd->request + req_addr = get_scsi_request($cmd) goodbytes = $good_bytes } @@ -183,10 +199,16 @@ function timer_pending:long(timer:long) @cast(timer, "timer_list", "kernel")->base) != 0) } +@__private30 function cmd_request_timer_pending:long(cmd:long) +{ + request = get_scsi_request(&@cast(cmd, "scsi_cmnd", "kernel")) + return timer_pending(&@cast(request, "request", "kernel")->q->timeout) +} + function scsi_timer_pending:long(cmd:long) { %( kernel_v >= "2.6.28" %? - return timer_pending(&@cast(cmd, "scsi_cmnd", "kernel:scsi_mod")->request->q->timeout) + return cmd_request_timer_pending(cmd) %: return timer_pending(&@cast(cmd, "scsi_cmnd", "kernel:scsi_mod")->eh_timeout) %) -- 2.43.5