public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Eric Youngdale" <eric@andante.org>
To: "Richard Gooch" <rgooch@ras.ucalgary.ca>,
	<linux-kernel@vger.kernel.org>, <linux-scsi@vger.kernel.org>
Cc: <devfs-announce-list@mobilix.ras.ucalgary.ca>
Subject: Re: [RFT] Support for ~2144 SCSI discs
Date: Tue, 31 Jul 2001 10:10:59 -0400	[thread overview]
Message-ID: <001801c119ca$9fc74750$4d0310ac@fairfax.mkssoftware.com> (raw)
In-Reply-To: <200107310030.f6V0UeJ13558@mobilix.ras.ucalgary.ca>


    FYI - At some point in the 2.5 series I would like to do some serious
surgery on the sd datastructures - this will mainly remove load order
dependencies and eliminate the need for CONFIG_SD_EXTRA.  I believe that
some of the work that Jens has already started on the blk device layer will
make support for very large numbers of disks much easier.

-Eric

----- Original Message -----
From: "Richard Gooch" <rgooch@ras.ucalgary.ca>
To: <linux-kernel@vger.kernel.org>; <linux-scsi@vger.kernel.org>
Cc: <devfs-announce-list@mobilix.ras.ucalgary.ca>
Sent: Monday, July 30, 2001 8:30 PM
Subject: [RFT] Support for ~2144 SCSI discs


>   Hi, all. Below is a patch that adds support for large numbers of
> SCSI discs (approximately 2144). I'd like people to try this out. I'm
> not doing my normal devfs-patch-v??? thing because this is completely
> untested (I'm away from my SCSI boxes), and I don't want to put a
> possibly FS-corrupting patch on my ftp archive. The code does compile
> and link, though.
>
> There are 3 cases I'd like to have tested:
> - people with 1 to 16 SCSI discs
> - people with 17 to 128 SCSI discs
> - people with >128 SCSI discs
>
> because each of these exercises a slightly different setup path.
> Please send success or failure reports to me.
>
> REMINDER: be careful with this patch. It could corrupt your FS.
>
> Regards,
>
> Richard....
> Permanent: rgooch@atnf.csiro.au
> Current:   rgooch@ras.ucalgary.ca
>
> diff -urN linux-2.4.7/Documentation/Configure.help
linux/Documentation/Configure.help
> --- linux-2.4.7/Documentation/Configure.help Thu Jul 19 20:48:15 2001
> +++ linux/Documentation/Configure.help Mon Jul 23 01:19:24 2001
> @@ -5410,6 +5410,17 @@
>    located on a SCSI disk. In this case, do not compile the driver for
>    your SCSI host adapter (below) as a module either.
>
> +Many SCSI Discs support
> +CONFIG_SD_MANY
> +  This allows you to support a very large number of SCSI discs
> +  (approximately 2144). You will also need to set CONFIG_DEVFS_FS=y
> +  later. This option may consume all unassigned block majors
> +  (i.e. those which do not have an allocation in
> +  Documentation/devices.txt). Enabling this will consume a few extra
> +  kilobytes of kernel memory.
> +
> +  Unless you have a large storage array, say N.
> +
>  Extra SCSI Disks
>  CONFIG_SD_EXTRA_DEVS
>    This controls the amount of additional space allocated in tables for
> diff -urN linux-2.4.7/Documentation/filesystems/devfs/ChangeLog
linux/Documentation/filesystems/devfs/ChangeLog
> --- linux-2.4.7/Documentation/filesystems/devfs/ChangeLog Wed Jul 11
17:55:41 2001
> +++ linux/Documentation/filesystems/devfs/ChangeLog Mon Jul 30 19:13:00
2001
> @@ -1675,3 +1675,13 @@
>  - Fixed number leak for /dev/cdroms/cdrom%d
>
>  - Fixed number leak for /dev/discs/disc%d
>
+===========================================================================
====
> +Changes for patch v183
> +
> +- Fixed bug in <devfs_setup> which could hang boot process
>
+===========================================================================
====
> +Changes for patch v184
> +
> +- Support large numbers of SCSI discs (~2144)
> +
> +- Documentation typo fix for fs/devfs/util.c
> diff -urN linux-2.4.7/drivers/scsi/Config.in linux/drivers/scsi/Config.in
> --- linux-2.4.7/drivers/scsi/Config.in Thu Jul  5 14:28:16 2001
> +++ linux/drivers/scsi/Config.in Mon Jul 23 01:19:47 2001
> @@ -3,7 +3,8 @@
>  dep_tristate '  SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
>
>  if [ "$CONFIG_BLK_DEV_SD" != "n" ]; then
> -   int  'Maximum number of SCSI disks that can be loaded as modules'
CONFIG_SD_EXTRA_DEVS 40
> +   bool '    Many (~2144) SCSI discs support (requires devfs)'
CONFIG_SD_MANY
> +   int  '    Maximum number of SCSI disks that can be loaded as modules'
CONFIG_SD_EXTRA_DEVS 40
>  fi
>
>  dep_tristate '  SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
> diff -urN linux-2.4.7/drivers/scsi/hosts.h linux/drivers/scsi/hosts.h
> --- linux-2.4.7/drivers/scsi/hosts.h Fri Jul 20 15:55:46 2001
> +++ linux/drivers/scsi/hosts.h Mon Jul 30 19:20:27 2001
> @@ -506,9 +506,8 @@
>      const char * tag;
>      struct module * module;   /* Used for loadable modules */
>      unsigned char scsi_type;
> -    unsigned int major;
> -    unsigned int min_major;      /* Minimum major in range. */
> -    unsigned int max_major;      /* Maximum major in range. */
> +    unsigned int *majors;         /* Array of majors used by driver */
> +    unsigned int num_majors;      /* Number of majors used by driver */
>      unsigned int nr_dev;   /* Number currently attached */
>      unsigned int dev_noticed;   /* Number of devices detected. */
>      unsigned int dev_max;   /* Current size of arrays */
> diff -urN linux-2.4.7/drivers/scsi/osst.c linux/drivers/scsi/osst.c
> --- linux-2.4.7/drivers/scsi/osst.c Fri Jul 20 00:18:15 2001
> +++ linux/drivers/scsi/osst.c Mon Jul 30 17:57:27 2001
> @@ -160,7 +160,6 @@
>         name: "OnStream tape",
>         tag: "osst",
>         scsi_type: TYPE_TAPE,
> -       major: OSST_MAJOR,
>         detect: osst_detect,
>         init: osst_init,
>         attach: osst_attach,
> diff -urN linux-2.4.7/drivers/scsi/scsi_lib.c
linux/drivers/scsi/scsi_lib.c
> --- linux-2.4.7/drivers/scsi/scsi_lib.c Thu Jul 19 23:48:04 2001
> +++ linux/drivers/scsi/scsi_lib.c Mon Jul 30 17:52:35 2001
> @@ -769,25 +769,10 @@
>   * Search for a block device driver that supports this
>   * major.
>   */
> - if (spnt->blk && spnt->major == major) {
> - return spnt;
> - }
> - /*
> - * I am still not entirely satisfied with this solution,
> - * but it is good enough for now.  Disks have a number of
> - * major numbers associated with them, the primary
> - * 8, which we test above, and a secondary range of 7
> - * different consecutive major numbers.   If this ever
> - * becomes insufficient, then we could add another function
> - * to the structure, and generalize this completely.
> - */
> - if( spnt->min_major != 0
> -     && spnt->max_major != 0
> -     && major >= spnt->min_major
> -     && major <= spnt->max_major )
> - {
> - return spnt;
> - }
> + int i;
> + if (!spnt->blk || !spnt->majors) continue;
> + for (i = 0; i < spnt->num_majors; ++i)
> + if (spnt->majors[i] == major) return spnt;
>   }
>   return NULL;
>  }
> diff -urN linux-2.4.7/drivers/scsi/sd.c linux/drivers/scsi/sd.c
> --- linux-2.4.7/drivers/scsi/sd.c Thu Jul  5 14:28:17 2001
> +++ linux/drivers/scsi/sd.c Mon Jul 30 20:10:58 2001
> @@ -28,6 +28,8 @@
>   *
>   * Modified by Alex Davis <letmein@erols.com>
>   *       Fix problem where removable media could be ejected after
sd_open.
> + *
> + *       Modified by Richard Gooch rgooch@atnf.csiro.au to support >128
discs.
>   */
>
>  #include <linux/config.h>
> @@ -65,7 +67,7 @@
>   *  static const char RCSid[] = "$Header:";
>   */
>
> -#define SD_MAJOR(i) (!(i) ? SCSI_DISK0_MAJOR : SCSI_DISK1_MAJOR-1+(i))
> +#define SD_MAJOR(i) sd_template.majors[(i)]
>
>  #define SCSI_DISKS_PER_MAJOR 16
>  #define SD_MAJOR_NUMBER(i) SD_MAJOR((i) >> 8)
> @@ -108,12 +110,6 @@
>   name:"disk",
>   tag:"sd",
>   scsi_type:TYPE_DISK,
> - major:SCSI_DISK0_MAJOR,
> -        /*
> -         * Secondary range of majors that this driver handles.
> -         */
> - min_major:SCSI_DISK1_MAJOR,
> - max_major:SCSI_DISK7_MAJOR,
>   blk:1,
>   detect:sd_detect,
>   init:sd_init,
> @@ -123,6 +119,19 @@
>   init_command:sd_init_command,
>  };
>
> +#ifdef CONFIG_SD_MANY
> +static inline int sd_devnum_to_index (int devnum)
> +{
> +    int i, major = MAJOR (devnum);
> +
> +    for (i = 0; i < sd_template.num_majors; ++i)
> +    {
> +        if (sd_template.majors[i] != major) continue;
> +        return (i << 4) | (MINOR (i) >> 4);
> +    }
> +    return -ENODEV;
> +}
> +#endif
>
>  static void rw_intr(Scsi_Cmnd * SCpnt);
>
> @@ -1043,6 +1052,41 @@
>   return i;
>  }
>
> +static int sd_alloc_majors (void)
> +/*  Allocate as many majors as required
> + */
> +{
> + int i, major;
> +
> + if ( ( sd_template.majors =
> +        kmalloc (sizeof sd_template.majors * N_USED_SD_MAJORS,
> + GFP_ATOMIC) ) == NULL ) {
> + printk ("sd.c: unable to allocate major array\n");
> + return -ENOMEM;
> + }
> + sd_template.majors[0] = SCSI_DISK0_MAJOR;
> + for (i = 1; (i < N_USED_SD_MAJORS) && (i <N_SD_PREASSIGNED_MAJORS);++i)
> + sd_template.majors[i] = SCSI_DISK1_MAJOR + i - 1;
> + for (; (i >= N_SD_PREASSIGNED_MAJORS) && (i < N_USED_SD_MAJORS); ++i) {
> + if ( ( major = devfs_alloc_major (DEVFS_SPECIAL_BLK) ) < 0 )
> + break;
> + sd_template.majors[i] = major;
> + }
> + sd_template.dev_max = i * SCSI_DISKS_PER_MAJOR;
> + sd_template.num_majors = i;
> + return 0;
> +} /*  End Function sd_alloc_majors  */
> +
> +static void sd_dealloc_majors (void)
> +/*  Deallocate all the allocated majors
> + */
> +{
> + int i;
> +
> + for (i = sd_template.num_majors - 1; i >= N_SD_PREASSIGNED_MAJORS; --i)
> + devfs_dealloc_major (DEVFS_SPECIAL_BLK, sd_template.majors[i]);
> +} /*  End Function sd_dealloc_majors  */
> +
>  /*
>   * The sd_init() function looks at all SCSI drives present, determines
>   * their size, and reads partition table entries for them.
> @@ -1057,16 +1101,16 @@
>   if (sd_template.dev_noticed == 0)
>   return 0;
>
> - if (!rscsi_disks)
> + if (!rscsi_disks) {
>   sd_template.dev_max = sd_template.dev_noticed + SD_EXTRA_DEVS;
> -
> - if (sd_template.dev_max > N_SD_MAJORS * SCSI_DISKS_PER_MAJOR)
> - sd_template.dev_max = N_SD_MAJORS * SCSI_DISKS_PER_MAJOR;
> + if ( !sd_alloc_majors() ) return 1;
> + }
>
>   if (!sd_registered) {
>   for (i = 0; i < N_USED_SD_MAJORS; i++) {
>   if (devfs_register_blkdev(SD_MAJOR(i), "sd", &sd_fops)) {
>   printk("Unable to get major %d for SCSI disk\n", SD_MAJOR(i));
> + sd_dealloc_majors();
>   return 1;
>   }
>   }
> @@ -1166,6 +1210,7 @@
>   for (i = 0; i < N_USED_SD_MAJORS; i++) {
>   devfs_unregister_blkdev(SD_MAJOR(i), "sd");
>   }
> + sd_dealloc_majors();
>   sd_registered--;
>   return 1;
>  }
> @@ -1373,6 +1418,7 @@
>
>   scsi_unregister_module(MODULE_SCSI_DEV, &sd_template);
>
> + sd_dealloc_majors();
>   for (i = 0; i < N_USED_SD_MAJORS; i++)
>   devfs_unregister_blkdev(SD_MAJOR(i), "sd");
>
> diff -urN linux-2.4.7/drivers/scsi/sd.h linux/drivers/scsi/sd.h
> --- linux-2.4.7/drivers/scsi/sd.h Fri Jul 20 15:55:46 2001
> +++ linux/drivers/scsi/sd.h Mon Jul 30 20:09:12 2001
> @@ -42,10 +42,14 @@
>   */
>  extern kdev_t sd_find_target(void *host, int tgt);
>
> -#define N_SD_MAJORS 8
> +#define N_SD_PREASSIGNED_MAJORS 8
>
> +#ifdef CONFIG_SD_MANY
> +#define SD_PARTITION(i) ((sd_devnum_to_index((i)) << 4) | ((i)&0x0f))
> +#else
>  #define SD_MAJOR_MASK (N_SD_MAJORS - 1)
>  #define SD_PARTITION(i) (((MAJOR(i) & SD_MAJOR_MASK) << 8) | (MINOR(i) &
255))
> +#endif
>
>  #endif
>
> diff -urN linux-2.4.7/drivers/scsi/sg.c linux/drivers/scsi/sg.c
> --- linux-2.4.7/drivers/scsi/sg.c Wed Jul  4 18:39:28 2001
> +++ linux/drivers/scsi/sg.c Mon Jul 30 17:57:52 2001
> @@ -123,7 +123,6 @@
>  {
>        tag:"sg",
>        scsi_type:0xff,
> -      major:SCSI_GENERIC_MAJOR,
>        detect:sg_detect,
>        init:sg_init,
>        finish:sg_finish,
> diff -urN linux-2.4.7/drivers/scsi/sr.c linux/drivers/scsi/sr.c
> --- linux-2.4.7/drivers/scsi/sr.c Thu Jul  5 14:28:17 2001
> +++ linux/drivers/scsi/sr.c Mon Jul 30 17:59:33 2001
> @@ -69,12 +69,15 @@
>
>  static int sr_init_command(Scsi_Cmnd *);
>
> +static unsigned int sr_major = SCSI_CDROM_MAJOR;
> +
>  static struct Scsi_Device_Template sr_template =
>  {
>   name:"cdrom",
>   tag:"sr",
>   scsi_type:TYPE_ROM,
> - major:SCSI_CDROM_MAJOR,
> + majors:&sr_major,
> + num_majors:1,
>   blk:1,
>   detect:sr_detect,
>   init:sr_init,
> diff -urN linux-2.4.7/drivers/scsi/st.c linux/drivers/scsi/st.c
> --- linux-2.4.7/drivers/scsi/st.c Fri Jul 20 00:16:32 2001
> +++ linux/drivers/scsi/st.c Mon Jul 30 17:58:22 2001
> @@ -160,7 +160,6 @@
>   name:"tape",
>   tag:"st",
>   scsi_type:TYPE_TAPE,
> - major:SCSI_TAPE_MAJOR,
>   detect:st_detect,
>   init:st_init,
>   attach:st_attach,
> diff -urN linux-2.4.7/fs/devfs/base.c linux/fs/devfs/base.c
> --- linux-2.4.7/fs/devfs/base.c Wed Jul 11 17:55:41 2001
> +++ linux/fs/devfs/base.c Mon Jul 30 19:10:41 2001
> @@ -511,6 +511,9 @@
>          Removed broken devnum allocation and use <devfs_alloc_devnum>.
>          Fixed old devnum leak by calling new <devfs_dealloc_devnum>.
>    v0.107
> +    20010712   Richard Gooch <rgooch@atnf.csiro.au>
> +        Fixed bug in <devfs_setup> which could hang boot process.
> +  v0.108
>  */
>  #include <linux/types.h>
>  #include <linux/errno.h>
> @@ -543,7 +546,7 @@
>  #include <asm/bitops.h>
>  #include <asm/atomic.h>
>
> -#define DEVFS_VERSION            "0.107 (20010709)"
> +#define DEVFS_VERSION            "0.108 (20010712)"
>
>  #define DEVFS_NAME "devfs"
>
> @@ -1342,12 +1345,12 @@
>       return NULL;
>   }
>      }
> -    de->u.fcb.autogen = 0;
> +    de->u.fcb.autogen = FALSE;
>      if ( S_ISCHR (mode) || S_ISBLK (mode) )
>      {
>   de->u.fcb.u.device.major = major;
>   de->u.fcb.u.device.minor = minor;
> - de->u.fcb.autogen = (devnum == NODEV) ? 0 : 1;
> + de->u.fcb.autogen = (devnum == NODEV) ? FALSE : TRUE;
>      }
>      else if ( S_ISREG (mode) ) de->u.fcb.u.file.size = 0;
>      else
> @@ -1418,7 +1421,7 @@
>      MKDEV (de->u.fcb.u.device.major,
>     de->u.fcb.u.device.minor) );
>   }
> - de->u.fcb.autogen = 0;
> + de->u.fcb.autogen = FALSE;
>   return;
>      }
>      if (S_ISLNK (de->mode) && de->registered)
> @@ -2063,6 +2066,7 @@
>   {"show",      OPTION_SHOW,        &boot_options},
>   {"only",      OPTION_ONLY,        &boot_options},
>   {"mount",     OPTION_MOUNT,       &boot_options},
> + {NULL,        0,                  NULL}
>      };
>
>      while ( (*str != '\0') && !isspace (*str) )
> @@ -2074,7 +2078,7 @@
>       invert = 1;
>       str += 2;
>   }
> - for (i = 0; i < sizeof (devfs_options_tab); i++)
> + for (i = 0; devfs_options_tab[i].name != NULL; i++)
>   {
>       int len = strlen (devfs_options_tab[i].name);
>
> diff -urN linux-2.4.7/fs/devfs/util.c linux/fs/devfs/util.c
> --- linux-2.4.7/fs/devfs/util.c Wed Jul 11 17:55:41 2001
> +++ linux/fs/devfs/util.c Mon Jul 30 18:28:12 2001
> @@ -39,6 +39,8 @@
>                 Created <devfs_*alloc_major> and <devfs_*alloc_devnum>.
>      20010710   Richard Gooch <rgooch@atnf.csiro.au>
>                 Created <devfs_*alloc_unique_number>.
> +    20010730   Richard Gooch <rgooch@atnf.csiro.au>
> +               Documentation typo fix.
>  */
>  #include <linux/module.h>
>  #include <linux/init.h>
> @@ -214,7 +216,7 @@
>
>  /**
>   * devfs_alloc_major - Allocate a major number.
> - * @type: The type of the major (DEVFS_SPECIAL_CHR or
DEVFS_SPECIAL_BLOCK)
> + * @type: The type of the major (DEVFS_SPECIAL_CHR or DEVFS_SPECIAL_BLK)
>
>   * Returns the allocated major, else -1 if none are available.
>   * This routine is thread safe and does not block.
> @@ -238,7 +240,7 @@
>
>  /**
>   * devfs_dealloc_major - Deallocate a major number.
> - * @type: The type of the major (DEVFS_SPECIAL_CHR or
DEVFS_SPECIAL_BLOCK)
> + * @type: The type of the major (DEVFS_SPECIAL_CHR or DEVFS_SPECIAL_BLK)
>   * @major: The major number.
>   * This routine is thread safe and does not block.
>   */
> @@ -282,7 +284,7 @@
>
>  /**
>   * devfs_alloc_devnum - Allocate a device number.
> - * @type: The type (DEVFS_SPECIAL_CHR or DEVFS_SPECIAL_BLOCK).
> + * @type: The type (DEVFS_SPECIAL_CHR or DEVFS_SPECIAL_BLK).
>   *
>   * Returns the allocated device number, else NODEV if none are available.
>   * This routine is thread safe and may block.
> @@ -347,7 +349,7 @@
>
>  /**
>   * devfs_dealloc_devnum - Dellocate a device number.
> - * @type: The type (DEVFS_SPECIAL_CHR or DEVFS_SPECIAL_BLOCK).
> + * @type: The type (DEVFS_SPECIAL_CHR or DEVFS_SPECIAL_BLK).
>   * @devnum: The device number.
>   *
>   * This routine is thread safe and does not block.
> diff -urN linux-2.4.7/include/linux/blk.h linux/include/linux/blk.h
> --- linux-2.4.7/include/linux/blk.h Mon Jul 30 19:20:01 2001
> +++ linux/include/linux/blk.h Mon Jul 30 20:05:18 2001
> @@ -144,7 +144,11 @@
>
>  #define DEVICE_NAME "scsidisk"
>  #define TIMEOUT_VALUE (2*HZ)
> +#ifdef CONFIG_SD_MANY
> +#define DEVICE_NR(device) sd_devnum_to_index((device))
> +#else
>  #define DEVICE_NR(device) (((MAJOR(device) & SD_MAJOR_MASK) << (8 - 4)) +
(MINOR(device) >> 4))
> +#endif
>
>  /* Kludge to use the same number for both char and block major numbers */
>  #elif  (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER)
> -
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
>


  parent reply	other threads:[~2001-07-31 14:14 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-07-31  0:30 [RFT] Support for ~2144 SCSI discs Richard Gooch
2001-07-31  7:41 ` Jeremy Higdon
2001-07-31 12:25   ` Richard Gooch
2001-07-31 19:59     ` Mike Anderson
2001-07-29 20:34       ` Alan Cox
2001-08-01  0:48       ` Richard Gooch
2001-08-01  1:05         ` Douglas Gilbert
2001-08-02  5:13           ` Richard Gooch
2001-07-31 14:10 ` Eric Youngdale [this message]
2001-07-31 22:38   ` Mike Panetta
2001-08-01  0:39     ` Richard Gooch
2001-08-01 14:33     ` Eric Youngdale
2001-08-02 14:06 ` Karcaw
2001-08-02 15:03   ` Richard Gooch
     [not found] <no.id>
2001-08-02 15:08 ` Alan Cox
2001-08-02 15:13   ` Richard Gooch
2001-08-02 15:31 ` Alan Cox
2001-08-02 23:17   ` Douglas Gilbert

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='001801c119ca$9fc74750$4d0310ac@fairfax.mkssoftware.com' \
    --to=eric@andante.org \
    --cc=devfs-announce-list@mobilix.ras.ucalgary.ca \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=rgooch@ras.ucalgary.ca \
    /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