[SCSI] lpfc: Adjust lpfc_scsi_buf allocation

Adjust lpfc_scsi_buf allocation to account for lun_queue_depth and
error handling

Under high load and high duress, the error handler could steal some
command resources from the normal i/o path. Rework to allocate
additional resources to avoid this scneario.

Signed-off-by: James Smart <James.Smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index c993069..b903d3b 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -1152,24 +1152,33 @@
 	/*
 	 * Populate the cmds_per_lun count scsi_bufs into this host's globally
 	 * available list of scsi buffers.  Don't allocate more than the
-	 * HBA limit conveyed to the midlayer via the host structure.  Note
-	 * that this list of scsi bufs exists for the lifetime of the driver.
+	 * HBA limit conveyed to the midlayer via the host structure.  The
+	 * formula accounts for the lun_queue_depth + error handlers + 1
+	 * extra.  This list of scsi bufs exists for the lifetime of the driver.
 	 */
 	total = phba->total_scsi_bufs;
-	num_to_alloc = LPFC_CMD_PER_LUN;
+	num_to_alloc = phba->cfg_lun_queue_depth + 2;
 	if (total >= phba->cfg_hba_queue_depth) {
-		printk(KERN_WARNING "%s, At config limitation of "
-		       "%d allocated scsi_bufs\n", __FUNCTION__, total);
+		lpfc_printf_log(phba, KERN_WARNING, LOG_FCP,
+				"%d:0704 At limitation of %d preallocated "
+				"command buffers\n", phba->brd_no, total);
 		return 0;
 	} else if (total + num_to_alloc > phba->cfg_hba_queue_depth) {
+		lpfc_printf_log(phba, KERN_WARNING, LOG_FCP,
+				"%d:0705 Allocation request of %d command "
+				"buffers will exceed max of %d.  Reducing "
+				"allocation request to %d.\n", phba->brd_no,
+				num_to_alloc, phba->cfg_hba_queue_depth,
+				(phba->cfg_hba_queue_depth - total));
 		num_to_alloc = phba->cfg_hba_queue_depth - total;
 	}
 
 	for (i = 0; i < num_to_alloc; i++) {
 		scsi_buf = lpfc_get_scsi_buf(phba);
 		if (!scsi_buf) {
-			printk(KERN_ERR "%s, failed to allocate "
-			       "scsi_buf\n", __FUNCTION__);
+			lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
+					"%d:0706 Failed to allocate command "
+					"buffer\n", phba->brd_no);
 			break;
 		}