Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18c2152d authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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_pdu
parents 4a3c390c 602432c1
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -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);
+23 −14
Original line number Original line Diff line number Diff line
@@ -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
+2 −2
Original line number Original line Diff line number Diff line
@@ -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;
}
}