From: Christoph Hellwig <hch@infradead.org>
To: Barto <mister.freeman@laposte.net>
Cc: "Elliott, Robert (Server Storage)" <Elliott@hp.com>,
Guenter Roeck <linux@roeck-us.net>,
linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org
Subject: Re: BUG in scsi_lib.c due to a bad commit
Date: Wed, 19 Nov 2014 22:09:33 -0800 [thread overview]
Message-ID: <20141120060933.GA21432@infradead.org> (raw)
I
Hi Barto,
sorry for the late reply, and thanks for drilling down the exact
conditions.
I think we have some issues with the lack of the host lock vs error
handling, but I still don't undertand the details.
I've got a test patch for you that just adds the host lock back in a few
places while keeing the atomic_t. Can you try to reproduce with that
one?
When breaking an existing setup in software it's always the softwares
fault, btw..
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 994eb08..99b77f7 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -311,16 +311,16 @@ void scsi_device_unbusy(struct scsi_device *sdev)
struct scsi_target *starget = scsi_target(sdev);
unsigned long flags;
+ spin_lock_irqsave(shost->host_lock, flags);
atomic_dec(&shost->host_busy);
if (starget->can_queue > 0)
atomic_dec(&starget->target_busy);
if (unlikely(scsi_host_in_recovery(shost) &&
(shost->host_failed || shost->host_eh_scheduled))) {
- spin_lock_irqsave(shost->host_lock, flags);
scsi_eh_wakeup(shost);
- spin_unlock_irqrestore(shost->host_lock, flags);
}
+ spin_unlock_irqrestore(shost->host_lock, flags);
atomic_dec(&sdev->device_busy);
}
@@ -1504,6 +1504,8 @@ static inline int scsi_host_queue_ready(struct request_queue *q,
if (scsi_host_in_recovery(shost))
return 0;
+ spin_lock_irq(shost->host_lock);
+
busy = atomic_inc_return(&shost->host_busy) - 1;
if (atomic_read(&shost->host_blocked) > 0) {
if (busy)
@@ -1527,21 +1529,19 @@ static inline int scsi_host_queue_ready(struct request_queue *q,
/* We're OK to process the command, so we can't be starved */
if (!list_empty(&sdev->starved_entry)) {
- spin_lock_irq(shost->host_lock);
if (!list_empty(&sdev->starved_entry))
list_del_init(&sdev->starved_entry);
- spin_unlock_irq(shost->host_lock);
}
+ spin_unlock_irq(shost->host_lock);
return 1;
starved:
- spin_lock_irq(shost->host_lock);
if (list_empty(&sdev->starved_entry))
list_add_tail(&sdev->starved_entry, &shost->starved_list);
- spin_unlock_irq(shost->host_lock);
out_dec:
atomic_dec(&shost->host_busy);
+ spin_unlock_irq(shost->host_lock);
return 0;
}
next reply other threads:[~2014-11-20 6:09 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-20 6:09 Christoph Hellwig [this message]
2014-11-20 17:44 ` BUG in scsi_lib.c due to a bad commit Barto
2014-11-20 17:53 ` Christoph Hellwig
2014-11-20 18:27 ` Barto
2014-11-24 9:18 ` Christoph Hellwig
2014-11-24 15:12 ` Barto
-- strict thread matches above, loose matches on Subject: below --
2014-11-11 23:33 Barto
2014-11-12 0:17 ` Bjorn Helgaas
2014-11-12 2:53 ` Guenter Roeck
2014-11-13 3:28 ` Barto
2014-11-13 5:33 ` Elliott, Robert (Server Storage)
2014-11-13 5:33 ` Elliott, Robert (Server Storage)
2014-11-13 9:38 ` Barto
2014-11-13 14:29 ` Christoph Hellwig
2014-11-13 15:13 ` Barto
2014-11-13 17:14 ` Barto
2014-11-13 17:54 ` Christoph Hellwig
2014-11-13 22:55 ` Barto
2014-11-14 7:32 ` Christoph Hellwig
2014-11-14 16:30 ` Barto
2014-11-16 18:30 ` Barto
2014-11-19 20:21 ` Barto
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=20141120060933.GA21432@infradead.org \
--to=hch@infradead.org \
--cc=Elliott@hp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=mister.freeman@laposte.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.