SCSI fixes on 20161027
Two small fixes: one is a fatal section mismatch (reference to init after it's discarded) and the other two are iscsi locking fixes. Signed-off-by: James E. J. Bottomley <jejb@linux.vnet.ibm.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABAgAGBQJYEhYhAAoJEAVr7HOZEZN4ccsQAIajfDVBjw7to37+EfB6T74d 68hmfanoTGgPZmHY46Il0xmSotZ6embFjd/Jkyb/JC1SHR6fK1NF8pWQ2/AS1NmP VDxxq2Tll2+gwBeATu3xY63d6BYPyPwF9l5Y+0oC29GdCJQrI4nJLu8H/v0suGEX S+7heWmszfMcZzeIsM+MNhWZOog+nrszY8zM6xQI8s6Iq+jnb1TrcDbl9/io4osU 2L/kuNwyVVt2TpVtovKBiOCZB1m+iZpWCZJ/meCh/4Adw5kDdtDJtX3wq0uZVYWT qo+aPjBdlRLAncqEsvnhAvF3IUtdnhX+27G60NG3ll9NRjkSjK3G4BL45Qxc0Q3s HwRJ/inXeOKiSQBZ0LoS+recNMToeFxI3gDvQkkqbPwYR1jhfXXL4OwdEqB3KOJu u4gu8sSfngVgo+aDbld7maU/QauL2C2NxU2V/Po+gSfTOSt4hqgxHMyVurZ0Y8P8 mrjTbBYotVHrSwZUGQ1O7aw98CPmAfocfgFJu0zHuYmwvmA7Z/k7DvI1B2a5qmyZ YEaz70tjcrvBfkZnZPGiD42KLzAEKUTIcIwBTItkT/8kv3QnrFzKgWDxKmFaFKTj 0FtibxX6IId6OLmiRuMjotjc51CeWw4SHDwx0VLewfgNnVumLcD6PFSrBOXMhFLj 8CW+8Ynq7D5Lq8X/iZA5 =BI5E -----END PGP SIGNATURE----- Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI fixes from James Bottomley: "Two small fixes: one is a fatal section mismatch (reference to init after it's discarded) and the other two are iscsi locking fixes" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: NCR5380: no longer mark irq probing as __init scsi: be2iscsi: Replace _bh with _irqsave/irqrestore scsi: libiscsi: Fix locking in __iscsi_conn_send_pduhifive-unleashed-5.1
commit
18c2152d52
|
@ -353,7 +353,7 @@ static void NCR5380_print_phase(struct Scsi_Host *instance)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static int probe_irq __initdata;
|
static int probe_irq;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* probe_intr - helper for IRQ autoprobe
|
* probe_intr - helper for IRQ autoprobe
|
||||||
|
@ -365,7 +365,7 @@ static int probe_irq __initdata;
|
||||||
* used by the IRQ probe code.
|
* used by the IRQ probe code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static irqreturn_t __init probe_intr(int irq, void *dev_id)
|
static irqreturn_t probe_intr(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
probe_irq = irq;
|
probe_irq = irq;
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
@ -380,7 +380,7 @@ static irqreturn_t __init probe_intr(int irq, void *dev_id)
|
||||||
* and then looking to see what interrupt actually turned up.
|
* and then looking to see what interrupt actually turned up.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int __init __maybe_unused NCR5380_probe_irq(struct Scsi_Host *instance,
|
static int __maybe_unused NCR5380_probe_irq(struct Scsi_Host *instance,
|
||||||
int possible)
|
int possible)
|
||||||
{
|
{
|
||||||
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
||||||
|
|
|
@ -900,8 +900,9 @@ void hwi_ring_cq_db(struct beiscsi_hba *phba,
|
||||||
static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba)
|
static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba)
|
||||||
{
|
{
|
||||||
struct sgl_handle *psgl_handle;
|
struct sgl_handle *psgl_handle;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_bh(&phba->io_sgl_lock);
|
spin_lock_irqsave(&phba->io_sgl_lock, flags);
|
||||||
if (phba->io_sgl_hndl_avbl) {
|
if (phba->io_sgl_hndl_avbl) {
|
||||||
beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO,
|
beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO,
|
||||||
"BM_%d : In alloc_io_sgl_handle,"
|
"BM_%d : In alloc_io_sgl_handle,"
|
||||||
|
@ -919,14 +920,16 @@ static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba)
|
||||||
phba->io_sgl_alloc_index++;
|
phba->io_sgl_alloc_index++;
|
||||||
} else
|
} else
|
||||||
psgl_handle = NULL;
|
psgl_handle = NULL;
|
||||||
spin_unlock_bh(&phba->io_sgl_lock);
|
spin_unlock_irqrestore(&phba->io_sgl_lock, flags);
|
||||||
return psgl_handle;
|
return psgl_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
|
free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
|
||||||
{
|
{
|
||||||
spin_lock_bh(&phba->io_sgl_lock);
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&phba->io_sgl_lock, flags);
|
||||||
beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO,
|
beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO,
|
||||||
"BM_%d : In free_,io_sgl_free_index=%d\n",
|
"BM_%d : In free_,io_sgl_free_index=%d\n",
|
||||||
phba->io_sgl_free_index);
|
phba->io_sgl_free_index);
|
||||||
|
@ -941,7 +944,7 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
|
||||||
"value there=%p\n", phba->io_sgl_free_index,
|
"value there=%p\n", phba->io_sgl_free_index,
|
||||||
phba->io_sgl_hndl_base
|
phba->io_sgl_hndl_base
|
||||||
[phba->io_sgl_free_index]);
|
[phba->io_sgl_free_index]);
|
||||||
spin_unlock_bh(&phba->io_sgl_lock);
|
spin_unlock_irqrestore(&phba->io_sgl_lock, flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
phba->io_sgl_hndl_base[phba->io_sgl_free_index] = psgl_handle;
|
phba->io_sgl_hndl_base[phba->io_sgl_free_index] = psgl_handle;
|
||||||
|
@ -950,7 +953,7 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
|
||||||
phba->io_sgl_free_index = 0;
|
phba->io_sgl_free_index = 0;
|
||||||
else
|
else
|
||||||
phba->io_sgl_free_index++;
|
phba->io_sgl_free_index++;
|
||||||
spin_unlock_bh(&phba->io_sgl_lock);
|
spin_unlock_irqrestore(&phba->io_sgl_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct wrb_handle *
|
static inline struct wrb_handle *
|
||||||
|
@ -958,15 +961,16 @@ beiscsi_get_wrb_handle(struct hwi_wrb_context *pwrb_context,
|
||||||
unsigned int wrbs_per_cxn)
|
unsigned int wrbs_per_cxn)
|
||||||
{
|
{
|
||||||
struct wrb_handle *pwrb_handle;
|
struct wrb_handle *pwrb_handle;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_bh(&pwrb_context->wrb_lock);
|
spin_lock_irqsave(&pwrb_context->wrb_lock, flags);
|
||||||
pwrb_handle = pwrb_context->pwrb_handle_base[pwrb_context->alloc_index];
|
pwrb_handle = pwrb_context->pwrb_handle_base[pwrb_context->alloc_index];
|
||||||
pwrb_context->wrb_handles_available--;
|
pwrb_context->wrb_handles_available--;
|
||||||
if (pwrb_context->alloc_index == (wrbs_per_cxn - 1))
|
if (pwrb_context->alloc_index == (wrbs_per_cxn - 1))
|
||||||
pwrb_context->alloc_index = 0;
|
pwrb_context->alloc_index = 0;
|
||||||
else
|
else
|
||||||
pwrb_context->alloc_index++;
|
pwrb_context->alloc_index++;
|
||||||
spin_unlock_bh(&pwrb_context->wrb_lock);
|
spin_unlock_irqrestore(&pwrb_context->wrb_lock, flags);
|
||||||
|
|
||||||
if (pwrb_handle)
|
if (pwrb_handle)
|
||||||
memset(pwrb_handle->pwrb, 0, sizeof(*pwrb_handle->pwrb));
|
memset(pwrb_handle->pwrb, 0, sizeof(*pwrb_handle->pwrb));
|
||||||
|
@ -1001,14 +1005,16 @@ beiscsi_put_wrb_handle(struct hwi_wrb_context *pwrb_context,
|
||||||
struct wrb_handle *pwrb_handle,
|
struct wrb_handle *pwrb_handle,
|
||||||
unsigned int wrbs_per_cxn)
|
unsigned int wrbs_per_cxn)
|
||||||
{
|
{
|
||||||
spin_lock_bh(&pwrb_context->wrb_lock);
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pwrb_context->wrb_lock, flags);
|
||||||
pwrb_context->pwrb_handle_base[pwrb_context->free_index] = pwrb_handle;
|
pwrb_context->pwrb_handle_base[pwrb_context->free_index] = pwrb_handle;
|
||||||
pwrb_context->wrb_handles_available++;
|
pwrb_context->wrb_handles_available++;
|
||||||
if (pwrb_context->free_index == (wrbs_per_cxn - 1))
|
if (pwrb_context->free_index == (wrbs_per_cxn - 1))
|
||||||
pwrb_context->free_index = 0;
|
pwrb_context->free_index = 0;
|
||||||
else
|
else
|
||||||
pwrb_context->free_index++;
|
pwrb_context->free_index++;
|
||||||
spin_unlock_bh(&pwrb_context->wrb_lock);
|
spin_unlock_irqrestore(&pwrb_context->wrb_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1037,8 +1043,9 @@ free_wrb_handle(struct beiscsi_hba *phba, struct hwi_wrb_context *pwrb_context,
|
||||||
static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba)
|
static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba)
|
||||||
{
|
{
|
||||||
struct sgl_handle *psgl_handle;
|
struct sgl_handle *psgl_handle;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_bh(&phba->mgmt_sgl_lock);
|
spin_lock_irqsave(&phba->mgmt_sgl_lock, flags);
|
||||||
if (phba->eh_sgl_hndl_avbl) {
|
if (phba->eh_sgl_hndl_avbl) {
|
||||||
psgl_handle = phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index];
|
psgl_handle = phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index];
|
||||||
phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index] = NULL;
|
phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index] = NULL;
|
||||||
|
@ -1056,14 +1063,16 @@ static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba)
|
||||||
phba->eh_sgl_alloc_index++;
|
phba->eh_sgl_alloc_index++;
|
||||||
} else
|
} else
|
||||||
psgl_handle = NULL;
|
psgl_handle = NULL;
|
||||||
spin_unlock_bh(&phba->mgmt_sgl_lock);
|
spin_unlock_irqrestore(&phba->mgmt_sgl_lock, flags);
|
||||||
return psgl_handle;
|
return psgl_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
|
free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
|
||||||
{
|
{
|
||||||
spin_lock_bh(&phba->mgmt_sgl_lock);
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&phba->mgmt_sgl_lock, flags);
|
||||||
beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG,
|
beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG,
|
||||||
"BM_%d : In free_mgmt_sgl_handle,"
|
"BM_%d : In free_mgmt_sgl_handle,"
|
||||||
"eh_sgl_free_index=%d\n",
|
"eh_sgl_free_index=%d\n",
|
||||||
|
@ -1078,7 +1087,7 @@ free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
|
||||||
"BM_%d : Double Free in eh SGL ,"
|
"BM_%d : Double Free in eh SGL ,"
|
||||||
"eh_sgl_free_index=%d\n",
|
"eh_sgl_free_index=%d\n",
|
||||||
phba->eh_sgl_free_index);
|
phba->eh_sgl_free_index);
|
||||||
spin_unlock_bh(&phba->mgmt_sgl_lock);
|
spin_unlock_irqrestore(&phba->mgmt_sgl_lock, flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
phba->eh_sgl_hndl_base[phba->eh_sgl_free_index] = psgl_handle;
|
phba->eh_sgl_hndl_base[phba->eh_sgl_free_index] = psgl_handle;
|
||||||
|
@ -1088,7 +1097,7 @@ free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
|
||||||
phba->eh_sgl_free_index = 0;
|
phba->eh_sgl_free_index = 0;
|
||||||
else
|
else
|
||||||
phba->eh_sgl_free_index++;
|
phba->eh_sgl_free_index++;
|
||||||
spin_unlock_bh(&phba->mgmt_sgl_lock);
|
spin_unlock_irqrestore(&phba->mgmt_sgl_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -791,9 +791,9 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
|
||||||
|
|
||||||
free_task:
|
free_task:
|
||||||
/* regular RX path uses back_lock */
|
/* regular RX path uses back_lock */
|
||||||
spin_lock_bh(&session->back_lock);
|
spin_lock(&session->back_lock);
|
||||||
__iscsi_put_task(task);
|
__iscsi_put_task(task);
|
||||||
spin_unlock_bh(&session->back_lock);
|
spin_unlock(&session->back_lock);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue