Linux SCSI subsystem development
 help / color / mirror / Atom feed
From: Dan Carpenter <error27@gmail.com>
To: Mike Christie <michael.christie@oracle.com>
Cc: linux-scsi@vger.kernel.org
Subject: [bug report] scsi: sd: Fix sshdr use in sd_spinup_disk
Date: Mon, 11 May 2026 07:29:23 +0300	[thread overview]
Message-ID: <agFbI7E6JQwd3wGW@stanley.mountain> (raw)

Hello Mike Christie,

Commit b4d0c33a32c3 ("scsi: sd: Fix sshdr use in sd_spinup_disk")
from Oct 4, 2023 (linux-next), leads to the following Smatch static
checker warning:

	drivers/scsi/sd.c:2525 sd_spinup_disk()
	warn: kernel error codes cast to unsigned 'the_result'

drivers/scsi/sd.c
    2474 static void
    2475 sd_spinup_disk(struct scsi_disk *sdkp)
    2476 {
    2477         static const u8 cmd[10] = { TEST_UNIT_READY };
    2478         unsigned long spintime_expire = 0;
    2479         int spintime, sense_valid = 0;
    2480         unsigned int the_result;
    2481         struct scsi_sense_hdr sshdr;
    2482         struct scsi_failure failure_defs[] = {
    2483                 /* Do not retry Medium Not Present */
    2484                 {
    2485                         .sense = UNIT_ATTENTION,
    2486                         .asc = 0x3A,
    2487                         .ascq = SCMD_FAILURE_ASCQ_ANY,
    2488                         .result = SAM_STAT_CHECK_CONDITION,
    2489                 },
    2490                 {
    2491                         .sense = NOT_READY,
    2492                         .asc = 0x3A,
    2493                         .ascq = SCMD_FAILURE_ASCQ_ANY,
    2494                         .result = SAM_STAT_CHECK_CONDITION,
    2495                 },
    2496                 /* Retry when scsi_status_is_good would return false 3 times */
    2497                 {
    2498                         .result = SCMD_FAILURE_STAT_ANY,
    2499                         .allowed = 3,
    2500                 },
    2501                 {}
    2502         };
    2503         struct scsi_failures failures = {
    2504                 .failure_definitions = failure_defs,
    2505         };
    2506         const struct scsi_exec_args exec_args = {
    2507                 .sshdr = &sshdr,
    2508                 .failures = &failures,
    2509         };
    2510 
    2511         spintime = 0;
    2512 
    2513         /* Spin up drives, as required.  Only do this at boot time */
    2514         /* Spinup needs to be done for module loads too. */
    2515         do {
    2516                 bool media_was_present = sdkp->media_present;
    2517 
    2518                 scsi_failures_reset_retries(&failures);
    2519 
    2520                 the_result = scsi_execute_cmd(sdkp->device, cmd, REQ_OP_DRV_IN,
    2521                                               NULL, 0, SD_TIMEOUT,
    2522                                               sdkp->max_retries, &exec_args);
    2523 
    2524 
--> 2525                 if (the_result > 0) {

The scsi_execute_cmd() function returns negative kernel error codes and
positive SCSI error status codes.  But "the_result" is an unsigned int
so both negative and positive error codes are > 0.

    2526                         /*
    2527                          * If the drive has indicated to us that it doesn't
    2528                          * have any media in it, don't bother with any more
    2529                          * polling.
    2530                          */
    2531                         if (media_not_present(sdkp, &sshdr)) {
    2532                                 if (media_was_present)
    2533                                         sd_printk(KERN_NOTICE, sdkp,
    2534                                                   "Media removed, stopped polling\n");
    2535                                 return;
    2536                         }
    2537                         sense_valid = scsi_sense_valid(&sshdr);
    2538                 }
    2539 
    2540                 if (!scsi_status_is_check_condition(the_result)) {
    2541                         /* no sense, TUR either succeeded or failed
    2542                          * with a status error */
    2543                         if(!spintime && !scsi_status_is_good(the_result)) {
    2544                                 sd_print_result(sdkp, "Test Unit Ready failed",
    2545                                                 the_result);
    2546                         }
    2547                         break;
    2548                 }
    2549 

This email is a free service from the Smatch-CI project [smatch.sf.net].

regards,
dan carpenter

                 reply	other threads:[~2026-05-11  4:29 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=agFbI7E6JQwd3wGW@stanley.mountain \
    --to=error27@gmail.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=michael.christie@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox