public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
From: Mike Anderson <andmike@us.ibm.com>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: Luben Tuikov <tluben@rogers.com>, linux-scsi@vger.kernel.org
Subject: Re: Patch: change the serial_number for error-handler commands
Date: Wed, 21 May 2003 11:03:08 -0700	[thread overview]
Message-ID: <20030521180308.GD1116@beaverton.ibm.com> (raw)
In-Reply-To: <Pine.LNX.4.44L0.0305202110520.4914-100000@netrider.rowland.org>

Sorry for the slow response I was under the weather and not doing much
yesterday.

Alan Stern [stern@rowland.harvard.edu] wrote:
> Well, the patch changes the serial number regardless of its initial value,
> but otherwise yes.  It would be okay with me to change scsi_core->sn.  
> But the global serial number is currently a static variable defined in
> scsi.c and my change was to scsi_error.c -- I didn't want to export the
> variable needlessly.
> 
> > Q: Which value does USB Storage reserve for cmdsn, 0 or MAX?
> 
> It doesn't reserve any values.  (I avoided 0 only because I noticed that
> the scsi core uses 0 as a reserved value.)  Usb-storage just requires that
> serial numbers not be repeated.
> 

I agree on the change in SCSI core instead of a change just for scsi
error handling. If you are depending on command serial number to be
unique as the comments in scsi_dispatch_cmd already indicate we have
problems (in USB storage case since can_queue is 1 it would not run into a
issue until scsi error handling).

The patch below is a quick patch that moves the serial_number from a
scsi mid level static to a per scsi host value. In looking at the usage
of command serial_number it appears that moving to a per scsi host name
space should be ok.

I have compile and boot tested it on my system with the ips and aic7xxx
drivers.

The patch needs some more testing and some variable name updates, but
should be ok to test USB and allow for discussion of this type of
change.

-andmike
--
Michael Anderson
andmike@us.ibm.com

DESC
This patch is against scsi-misc-2.5 but also applies against 2.5.69.

Move scsi command serial number to per scsi host serial number. We also
only increment the serial number under a lock now so the race on the value
is removed. A new serial number is also acquired in the scsi_error handler
on new commands.
EDESC


 drivers/scsi/hosts.h      |    7 +++++++
 drivers/scsi/scsi.c       |    7 ++-----
 drivers/scsi/scsi_error.c |    1 +
 3 files changed, 10 insertions(+), 5 deletions(-)

diff -puN drivers/scsi/hosts.h~scsi_serial_number drivers/scsi/hosts.h
--- sysfs-scsi-misc-2.5/drivers/scsi/hosts.h~scsi_serial_number	Wed May 21 08:41:49 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/hosts.h	Wed May 21 08:41:49 2003
@@ -487,6 +487,8 @@ struct Scsi_Host
     struct device host_gendev;
     struct class_device class_dev;
 
+    unsigned long serial_number;
+
     /*
      * We should ensure that this is aligned, both for better performance
      * and also because some compilers (m68k) don't automatically force
@@ -532,6 +534,11 @@ static inline struct device *scsi_get_de
         return shost->host_gendev.parent;
 }
 
+static inline unsigned long scsi_get_next_serial(struct Scsi_Host *shost)
+{
+        return (++shost->serial_number) ? shost->serial_number : 1;
+}
+
 struct Scsi_Device_Template
 {
     struct list_head list;
diff -puN drivers/scsi/scsi.c~scsi_serial_number drivers/scsi/scsi.c
--- sysfs-scsi-misc-2.5/drivers/scsi/scsi.c~scsi_serial_number	Wed May 21 08:41:49 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/scsi.c	Wed May 21 08:41:49 2003
@@ -83,7 +83,6 @@
  */
 unsigned long scsi_pid;
 struct scsi_cmnd *last_cmnd;
-static unsigned long serial_number;
 
 /*
  * List of all highlevel drivers.
@@ -398,11 +397,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *
 	unsigned long timeout;
 	int rtn = 1;
 
-	/* Assign a unique nonzero serial_number. */
 	/* XXX(hch): this is racy */
-	if (++serial_number == 0)
-		serial_number = 1;
-	cmd->serial_number = serial_number;
 	cmd->pid = scsi_pid++;
 
 	/* 
@@ -471,6 +466,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *
 					   host->hostt->queuecommand));
 
 		spin_lock_irqsave(host->host_lock, flags);
+		cmd->serial_number = scsi_get_next_serial(host);
 		rtn = host->hostt->queuecommand(cmd, scsi_done);
 		spin_unlock_irqrestore(host->host_lock, flags);
 		if (rtn) {
@@ -485,6 +481,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *
 					host->hostt->command));
 
 		spin_lock_irqsave(host->host_lock, flags);
+		cmd->serial_number = scsi_get_next_serial(host);
 		cmd->result = host->hostt->command(cmd);
 		scsi_done(cmd);
 		spin_unlock_irqrestore(host->host_lock, flags);
diff -puN drivers/scsi/scsi_error.c~scsi_serial_number drivers/scsi/scsi_error.c
--- sysfs-scsi-misc-2.5/drivers/scsi/scsi_error.c~scsi_serial_number	Wed May 21 08:41:49 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/scsi_error.c	Wed May 21 08:41:49 2003
@@ -456,6 +456,7 @@ static int scsi_send_eh_cmnd(struct scsi
 		scmd->request->rq_status = RQ_SCSI_BUSY;
 
 		spin_lock_irqsave(scmd->device->host->host_lock, flags);
+		scmd->serial_number = scsi_get_next_serial(host);
 		host->hostt->queuecommand(scmd, scsi_eh_done);
 		spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
 

_

  reply	other threads:[~2003-05-21 17:48 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20030516190414.GD11884@iucha.net>
2003-05-16 21:23 ` [linux-usb-devel] USB Storage oops in 2.5.69-bk8 Alan Stern
2003-05-16 21:44   ` Florin Iucha
2003-05-16 22:29   ` Mike Anderson
2003-05-17 15:29     ` Alan Stern
2003-05-17 16:33       ` David Brownell
2003-05-18 18:31         ` Alan Stern
2003-05-18 23:46           ` David Brownell
2003-05-21 15:19             ` Bug in hot-unplugging for SCSI CD-ROM Alan Stern
2003-05-17 18:38       ` [linux-usb-devel] USB Storage oops in 2.5.69-bk8 Patrick Mansfield
2003-05-31 14:35         ` Florin Iucha
2003-05-20 14:11     ` Patch: change the serial_number for error-handler commands Alan Stern
2003-05-20 21:25       ` Luben Tuikov
2003-05-21  1:19         ` Alan Stern
2003-05-21 18:03           ` Mike Anderson [this message]
2003-05-21 18:50             ` Luben Tuikov
2003-05-21 19:18             ` Luben Tuikov
2003-05-21 20:28               ` Mike Anderson
2003-05-21 21:11                 ` Luben Tuikov
2003-05-21 23:15                   ` Patrick Mansfield
2003-05-22  5:47                     ` Luben Tuikov
2003-05-21 19:57             ` Alan Stern
2003-05-21 20:42               ` Luben Tuikov
2003-05-21 21:05                 ` Alan Stern
2003-05-21 21:19             ` James Bottomley
2003-05-21 22:53               ` Mike Anderson
2003-06-11 17:41             ` PATCH: (as33) Remove /proc/scsi directory in scsi_remove_host() Alan Stern
2003-06-11 18:23               ` Mike Anderson
2003-06-12  6:04                 ` Christoph Hellwig
2003-06-12  6:51                   ` Mike Anderson
2003-06-12 21:00                     ` PATCH: (as33b) " Alan Stern
2003-06-12 21:58                       ` Mike Anderson
2003-06-13 14:38                         ` Alan Stern
2003-06-15 13:01                         ` Christoph Hellwig
2003-05-21 19:24           ` Patch: change the serial_number for error-handler commands Luben Tuikov

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=20030521180308.GD1116@beaverton.ibm.com \
    --to=andmike@us.ibm.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=stern@rowland.harvard.edu \
    --cc=tluben@rogers.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