public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Matthew Wilcox <matthew@wil.cx>
To: Pekka J Enberg <penberg@cs.helsinki.fi>
Cc: Stefan Richter <stefanr@s5r6.in-berlin.de>,
	Alan Stern <stern@rowland.harvard.edu>,
	linux-kernel@vger.kernel.org, dsd@gentoo.org,
	mdharm-usb@one-eyed-alien.net, linux-usb@vger.kernel.org,
	vegardno@ifi.uio.no, James.Bottomley@HansenPartnership.com,
	linux-scsi@vger.kernel.org, Greg KH <greg@kroah.com>
Subject: Re: [RFC/PATCH] usb-storage: wait for device scanning before mounting root
Date: Fri, 25 Apr 2008 03:11:23 -0600	[thread overview]
Message-ID: <20080425091122.GA14990@parisc-linux.org> (raw)
In-Reply-To: <Pine.LNX.4.64.0804251110400.758@sbz-30.cs.Helsinki.FI>

On Fri, Apr 25, 2008 at 11:15:36AM +0300, Pekka J Enberg wrote:
> On Fri, 25 Apr 2008, Stefan Richter wrote:
> > Besides, can't you use the generic async scan facility of the SCSI stack for
> > your purpose?  If not, can it be extended to make it usable?
> 
> So you mean drivers/scsi/scsi_scan.c, right? We probably can and 
> should so I'll take a look.

The problem is that USB has one scsi_host per device (rather than, say,
having one scsi_host and adding new devices to it as they're found on
the USB bus).

I'm certainly open to ideas of hooking into the mechanism -- it's just a
list of completions after all.  Something like this:

void *scsi_insert_into_scan_list(void)
{
	return scsi_prep_async_scan(NULL);
}

void scsi_scan_completed(void *cookie)
{
	struct async_scan_data *data = cookie;
	wait_for_completion(&data->prev_finished);
	spin_lock(&async_scan_lock);
	list_del(&data->list);
	if (!list_empty(&scanning_hosts)) {
		struct async_scan_data *next = list_entry(scanning_hosts.next,
				struct async_scan_data, list);
		complete(&next->prev_finished);
	}
	spin_unlock(&async_scan_lock);

	kfree(data);
}

Perhaps refactor a little -- everything inside the async_scan_lock would
be common to scsi_scan_completed() and scsi_finish_async_scan().

with appropriate checks for shost being NULL in scsi_prep_async_scan:

+++ b/drivers/scsi/scsi_scan.c
@@ -1698,7 +1698,7 @@ static struct async_scan_data *scsi_prep_async_scan(struct
        if (strncmp(scsi_scan_type, "sync", 4) == 0)
                return NULL;
 
-       if (shost->async_scan) {
+       if (shost && shost->async_scan) {
                printk("%s called twice for host %d", __FUNCTION__,
                                shost->host_no);
                dump_stack();
@@ -1708,16 +1708,19 @@ static struct async_scan_data *scsi_prep_async_scan(stru
        data = kmalloc(sizeof(*data), GFP_KERNEL);
        if (!data)
                goto err;
-       data->shost = scsi_host_get(shost);
-       if (!data->shost)
-               goto err;
        init_completion(&data->prev_finished);
 
-       mutex_lock(&shost->scan_mutex);
-       spin_lock_irqsave(shost->host_lock, flags);
-       shost->async_scan = 1;
-       spin_unlock_irqrestore(shost->host_lock, flags);
-       mutex_unlock(&shost->scan_mutex);
+       if (shost) {
+               data->shost = scsi_host_get(shost);
+               if (!data->shost)
+                       goto err;
+
+               mutex_lock(&shost->scan_mutex);
+               spin_lock_irqsave(shost->host_lock, flags);
+               shost->async_scan = 1;
+               spin_unlock_irqrestore(shost->host_lock, flags);
+               mutex_unlock(&shost->scan_mutex);
+       }
 
        spin_lock(&async_scan_lock);
        if (list_empty(&scanning_hosts))

Would that work for you?

-- 
Intel are signing my paycheques ... these opinions are still mine
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours.  We can't possibly take such
a retrograde step."

  reply	other threads:[~2008-04-25  9:11 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-24 20:21 [RFC/PATCH] usb-storage: wait for device scanning before mounting root Pekka J Enberg
2008-04-24 21:08 ` Alan Stern
2008-04-24 21:25   ` Pekka J Enberg
2008-04-24 22:56     ` Greg KH
2008-04-24 23:30       ` Matthew Dharm
2008-04-25  6:30         ` Pekka J Enberg
2008-04-25  7:04           ` Matthew Dharm
2008-04-25  8:19             ` Pekka J Enberg
2008-04-25 15:35               ` Matthew Dharm
2008-04-25 16:05               ` Greg KH
2008-04-25  6:09       ` Pekka J Enberg
2008-04-25  7:53     ` Stefan Richter
2008-04-25  8:15       ` Pekka J Enberg
2008-04-25  9:11         ` Matthew Wilcox [this message]
2008-06-19 18:23           ` Matthew Wilcox
2008-06-19 18:39             ` Stefan Richter
2008-06-19 18:43               ` Stefan Richter
2008-06-19 18:54               ` Matthew Wilcox
2008-06-19 19:52                 ` Matthew Dharm
2008-06-19 20:49                   ` Matthew Wilcox
2008-06-19 21:19                     ` Stefan Richter
2008-06-19 19:54                 ` Stefan Richter
2008-06-19 20:22                   ` Matthew Wilcox
2008-06-19 20:34                     ` Stefan Richter
2008-06-19 21:39             ` Alan Stern
2008-06-19 23:13               ` David Brownell
2008-06-20  9:53                 ` Gabor Gombas
2008-06-20 14:14                   ` Matthew Dharm
2008-06-20 15:15               ` Vegard Nossum
2008-06-20 15:31                 ` Matthew Wilcox
2008-06-20 15:42                 ` Alan Stern
2008-06-20 16:37                   ` Stefan Richter

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=20080425091122.GA14990@parisc-linux.org \
    --to=matthew@wil.cx \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=dsd@gentoo.org \
    --cc=greg@kroah.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mdharm-usb@one-eyed-alien.net \
    --cc=penberg@cs.helsinki.fi \
    --cc=stefanr@s5r6.in-berlin.de \
    --cc=stern@rowland.harvard.edu \
    --cc=vegardno@ifi.uio.no \
    /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