From: Mike Anderson <andmike@us.ibm.com>
To: akpm@digeo.com, linux-scsi@vger.kernel.org,
linux-kernel@vger.kernel.org, dougg@gear.torque.net
Subject: Re: 2.4.39 "Sleeping function called from illegal context at slab.c:1374"
Date: Wed, 2 Oct 2002 14:21:22 -0700 [thread overview]
Message-ID: <20021002212122.GF1317@beaverton.ibm.com> (raw)
In-Reply-To: <20021002184437.GA17474@midgaard.us>
Andreas,
Here is the updated patch.
-andmike
--
Michael Anderson
andmike@us.ibm.com
sg.c | 59 ++++++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 40 insertions(+), 19 deletions(-)
diff -Nru a/drivers/scsi/sg.c b/drivers/scsi/sg.c
--- a/drivers/scsi/sg.c Wed Oct 2 12:19:48 2002
+++ b/drivers/scsi/sg.c Wed Oct 2 12:19:48 2002
@@ -1354,32 +1354,42 @@
{
static int sg_registered = 0;
unsigned long iflags;
+ int tmp_dev_max;
+ Sg_device **tmp_da;
if ((sg_template.dev_noticed == 0) || sg_dev_arr)
return 0;
+ SCSI_LOG_TIMEOUT(3, printk("sg_init\n"));
+
write_lock_irqsave(&sg_dev_arr_lock, iflags);
+ tmp_dev_max = sg_template.dev_noticed + SG_DEV_ARR_LUMP;
+ write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
+
+ tmp_da = (Sg_device **)vmalloc(
+ tmp_dev_max * sizeof(Sg_device *));
+ if (NULL == tmp_da) {
+ printk(KERN_ERR "sg_init: no space for sg_dev_arr\n");
+ return 1;
+ }
+ write_lock_irqsave(&sg_dev_arr_lock, iflags);
+
if (!sg_registered) {
if (register_chrdev(SCSI_GENERIC_MAJOR, "sg", &sg_fops)) {
printk(KERN_ERR
"Unable to get major %d for generic SCSI device\n",
SCSI_GENERIC_MAJOR);
write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
+ vfree((char *) tmp_da);
return 1;
}
sg_registered++;
}
- SCSI_LOG_TIMEOUT(3, printk("sg_init\n"));
- sg_template.dev_max = sg_template.dev_noticed + SG_DEV_ARR_LUMP;
- sg_dev_arr = (Sg_device **)vmalloc(
- sg_template.dev_max * sizeof(Sg_device *));
- if (NULL == sg_dev_arr) {
- printk(KERN_ERR "sg_init: no space for sg_dev_arr\n");
- write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
- return 1;
- }
- memset(sg_dev_arr, 0, sg_template.dev_max * sizeof (Sg_device *));
+ memset(tmp_da, 0, tmp_dev_max * sizeof (Sg_device *));
+ sg_template.dev_max = tmp_dev_max;
+ sg_dev_arr = tmp_da;
+
write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
#ifdef CONFIG_PROC_FS
sg_proc_init();
@@ -1430,7 +1440,7 @@
static int
sg_attach(Scsi_Device * scsidp)
{
- Sg_device *sdp;
+ Sg_device *sdp = NULL;
unsigned long iflags;
int k;
@@ -1439,15 +1449,16 @@
Sg_device **tmp_da;
int tmp_dev_max = sg_template.nr_dev + SG_DEV_ARR_LUMP;
+ write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
tmp_da = (Sg_device **)vmalloc(
tmp_dev_max * sizeof(Sg_device *));
if (NULL == tmp_da) {
scsidp->attached--;
- write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
printk(KERN_ERR
"sg_attach: device array cannot be resized\n");
return 1;
}
+ write_lock_irqsave(&sg_dev_arr_lock, iflags);
memset(tmp_da, 0, tmp_dev_max * sizeof (Sg_device *));
memcpy(tmp_da, sg_dev_arr,
sg_template.dev_max * sizeof (Sg_device *));
@@ -1456,6 +1467,7 @@
sg_template.dev_max = tmp_dev_max;
}
+find_empty_slot:
for (k = 0; k < sg_template.dev_max; k++)
if (!sg_dev_arr[k])
break;
@@ -1467,11 +1479,19 @@
" type=%d, minor number exceed %d\n",
scsidp->host->host_no, scsidp->channel, scsidp->id,
scsidp->lun, scsidp->type, SG_MAX_DEVS_MASK);
+ if (NULL != sdp)
+ vfree((char *) sdp);
return 1;
}
- if (k < sg_template.dev_max)
- sdp = (Sg_device *)vmalloc(sizeof(Sg_device));
- else
+ if (k < sg_template.dev_max) {
+ if (NULL == sdp) {
+ write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
+ sdp = (Sg_device *)vmalloc(sizeof(Sg_device));
+ write_lock_irqsave(&sg_dev_arr_lock, iflags);
+ if (!sg_dev_arr[k])
+ goto find_empty_slot;
+ }
+ } else
sdp = NULL;
if (NULL == sdp) {
scsidp->attached--;
@@ -1498,17 +1518,18 @@
scsidp->sdev_driverfs_dev.name);
sdp->sg_driverfs_dev.parent = &scsidp->sdev_driverfs_dev;
sdp->sg_driverfs_dev.bus = &scsi_driverfs_bus_type;
+
+ sg_template.nr_dev++;
+ sg_dev_arr[k] = sdp;
+ write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
+
device_register(&sdp->sg_driverfs_dev);
device_create_file(&sdp->sg_driverfs_dev, &dev_attr_type);
device_create_file(&sdp->sg_driverfs_dev, &dev_attr_kdev);
-
sdp->de = devfs_register(scsidp->de, "generic", DEVFS_FL_DEFAULT,
SCSI_GENERIC_MAJOR, k,
S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
&sg_fops, sdp);
- sg_template.nr_dev++;
- sg_dev_arr[k] = sdp;
- write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
switch (scsidp->type) {
case TYPE_DISK:
case TYPE_MOD:
next prev parent reply other threads:[~2002-10-02 21:16 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-10-01 11:34 2.4.39 "Sleeping function called from illegal context at slab.c:1374" Helge Hafting
2002-10-01 11:39 ` Jens Axboe
2002-10-01 18:54 ` Andrew Morton
2002-10-01 21:59 ` Andreas Boman
2002-10-01 22:23 ` Andrew Morton
2002-10-01 23:24 ` Joaquim Fellmann
2002-10-02 16:24 ` Mike Anderson
2002-10-02 18:44 ` Andreas Boman
2002-10-02 19:31 ` Mike Anderson
2002-10-02 21:21 ` Mike Anderson [this message]
2002-10-02 23:53 ` Andreas Boman
2002-10-03 17:17 ` Mike Anderson
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=20021002212122.GF1317@beaverton.ibm.com \
--to=andmike@us.ibm.com \
--cc=akpm@digeo.com \
--cc=dougg@gear.torque.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).