Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=8bcc24127be12967588db0ad0e614be937ee1d5a
Commit:     8bcc24127be12967588db0ad0e614be937ee1d5a
Parent:     23be331d9e5077edf07d73813f870d3b895c8593
Author:     Matthew Wilcox <[EMAIL PROTECTED]>
AuthorDate: Thu Dec 7 19:29:27 2006 -0700
Committer:  James Bottomley <[EMAIL PROTECTED]>
CommitDate: Wed Jan 3 16:57:31 2007 -0600

    [SCSI] Add missing completion to scsi_complete_async_scans()
    
    If either scsi_complete_async_scans() is called a second time
    before the first call has finished, or a host scan is started while
    scsi_complete_async_scans() is still sleeping, it would fail to wake up
    the other task, which would sleep forever.
    
    I've changed the kernel-doc to make it clear that
    scsi_complete_async_scans() only guarantees that scans which started
    before it was called are guaranteed to have finished when it returns.
    I considered making it wait until all scans are completed, but it can't
    guarantee that no more scans will start before it returns anyway, and it
    runs the risk of confusing other callers of scsi_complete_async_scans()
    for hosts actually scanning.
    
    Signed-off-by: Matthew Wilcox <[EMAIL PROTECTED]>
    Signed-off-by: James Bottomley <[EMAIL PROTECTED]>
---
 drivers/scsi/scsi_scan.c |   15 +++++++++------
 1 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 14e635a..1322831 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -133,12 +133,10 @@ struct async_scan_data {
 /**
  * scsi_complete_async_scans - Wait for asynchronous scans to complete
  *
- * Asynchronous scans add themselves to the scanning_hosts list.  Once
- * that list is empty, we know that the scans are complete.  Rather than
- * waking up periodically to check the state of the list, we pretend to be
- * a scanning task by adding ourselves at the end of the list and going to
- * sleep.  When the task before us wakes us up, we take ourselves off the
- * list and return.
+ * When this function returns, any host which started scanning before
+ * this function was called will have finished its scan.  Hosts which
+ * started scanning after this function was called may or may not have
+ * finished.
  */
 int scsi_complete_async_scans(void)
 {
@@ -171,6 +169,11 @@ int scsi_complete_async_scans(void)
 
        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);
+       }
  done:
        spin_unlock(&async_scan_lock);
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to