public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Luben Tuikov <luben_tuikov@adaptec.com>
To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Marcelo Tosatti <marcelo.tosatti@cyclades.com>
Subject: [PATCH] fix units/partition count in sd.c (2.4.x)
Date: Wed, 16 Feb 2005 11:23:53 -0500	[thread overview]
Message-ID: <42137399.5080600@adaptec.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 2706 bytes --]

Hi,

This patch fixes the nr_real count in sd.c, which is also used
in genhd.c to print out the partitions/units.  The problem is that
nr_real is decremented on detach, the genhd's nr_sects is
cleared but the entry is still there and is being counted
for when displaying the partitions.  Thus when nr_real
is decremented _and_ a 0-ed partition/unit is counted,
we get to not display 1 or more entries of the tail of
the list.

The solution is to not decrement nr_real on detach, effectively
never decrementing it, and so that it doesn't grow without a bound,
to throttle it on attach, incrementing it only if it would be
smaller than nr_dev.

This was observed on a RH kernel and on the current BK kernel.
Tested and fixed on 2.4.30-pre1 (BK).  This patch is against 2.4.30-pre1.

To reproduce: assume 4 scsi disks sda, sdb, sdc, sdd.
#echo "scsi remove-single-device <sdb-HCTL>" > /proc/scsi/scsi
#cat /proc/partitions
<<sdb _and_ sdd are not listed>>

Signed-off-by: Luben Tuikov <luben_tuikov@adaptec.com>

===== sd.c 1.31 vs edited =====
--- 1.31/drivers/scsi/sd.c      2003-06-25 19:34:08 -04:00
+++ edited/sd.c 2005-02-14 17:09:43 -05:00
@@ -1332,8 +1332,8 @@
 
        rscsi_disks[i].device = SDp;
        rscsi_disks[i].has_part_table = 0;
-       sd_template.nr_dev++;
-       SD_GENDISK(i).nr_real++;
+       if (sd_template.nr_dev++ >= SD_GENDISK(i).nr_real)
+               SD_GENDISK(i).nr_real++;
         devnum = i % SCSI_DISKS_PER_MAJOR;
         SD_GENDISK(i).de_arr[devnum] = SDp->de;
         if (SDp->removable)
@@ -1424,9 +1424,12 @@
 
        for (dpnt = rscsi_disks, i = 0; i < sd_template.dev_max; i++, dpnt++)
                if (dpnt->device == SDp) {
+                       char nbuff[6];
 
                        /* If we are disconnecting a disk driver, sync and invalidate
                         * everything */
+                       sd_devname(i, nbuff);
+
                        sdgd = &SD_GENDISK(i);
                        max_p = sd_gendisk.max_p;
                        start = i << sd_gendisk.minor_shift;
@@ -1447,7 +1450,12 @@
                        SDp->attached--;
                        sd_template.dev_noticed--;
                        sd_template.nr_dev--;
-                       SD_GENDISK(i).nr_real--;
+
+                       printk("Detached scsi %sdisk %s at scsi%d, "
+                              "channel %d, id %d, lun %d\n",
+                              SDp->removable ? "removable " : "",
+                              nbuff, SDp->host->host_no, SDp->channel,
+                              SDp->id, SDp->lun);
                        return;
                }
        return;

	Luben
P.S. Patch attached as well, for formatting.


[-- Attachment #2: sd.patch --]
[-- Type: octet/stream, Size: 1276 bytes --]

             reply	other threads:[~2005-02-16 16:24 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-02-16 16:23 Luben Tuikov [this message]
2005-02-26 13:48 ` [PATCH] fix units/partition count in sd.c (2.4.x) Marcelo Tosatti
  -- strict thread matches above, loose matches on Subject: below --
2005-02-16 22:42 soohoon.lee
2005-02-26 19:29 Soo Lee

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=42137399.5080600@adaptec.com \
    --to=luben_tuikov@adaptec.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marcelo.tosatti@cyclades.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