Pull SCSI fixes from James Bottomley: "Three fixes. One is the qla24xx MSI regression, one is a theoretical problem over blacklist matching, which would bite USB badly if it ever triggered and one is a system hang with a particular type of IPR device" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: qla2xxx: Fix NULL pointer deref in QLA interrupt SCSI: fix new bug in scsi_dev_info_list string matching ipr: Clear interrupt on croc/crocodile when running with LSI
Unified · Split
| @@ -10093,6 +10093,7 @@ static int ipr_probe_ioa(struct pci_dev *pdev, · 10092 unmodified lines | ||
| 10093 | 10093 | ioa_cfg->intr_flag = IPR_USE_MSI; |
| 10094 | 10094 | else { |
| 10095 | 10095 | ioa_cfg->intr_flag = IPR_USE_LSI; |
| 10096 | + ioa_cfg->clear_isr = 1; | |
| 10096 | 10097 | ioa_cfg->nvectors = 1; |
| 10097 | 10098 | dev_info(&pdev->dev, "Cannot enable MSI.\n"); |
| 10098 | 10099 | } |
| @@ -2548,7 +2548,7 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha, · 2547 unmodified lines | ||
| 2548 | 2548 | if (!vha->flags.online) |
| 2549 | 2549 | return; |
| 2550 | 2550 | |
| 2551 | − if (rsp->msix->cpuid != smp_processor_id()) { | |
| 2551 | + if (rsp->msix && rsp->msix->cpuid != smp_processor_id()) { | |
| 2552 | 2552 | /* if kernel does not notify qla of IRQ's CPU change, |
| 2553 | 2553 | * then set it here. |
| 2554 | 2554 | */ |
| @@ -429,7 +429,7 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor, · 428 unmodified lines | ||
| 429 | 429 | * here, and we don't know what device it is |
| 430 | 430 | * trying to work with, leave it as-is. |
| 431 | 431 | */ |
| 432 | − vmax = 8; /* max length of vendor */ | |
| 432 | + vmax = sizeof(devinfo->vendor); | |
| 433 | 433 | vskip = vendor; |
| 434 | 434 | while (vmax > 0 && *vskip == ' ') { |
| 435 | 435 | vmax--; |
| @@ -439,7 +439,7 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor, · 3 unmodified lines | ||
| 439 | 439 | while (vmax > 0 && vskip[vmax - 1] == ' ') |
| 440 | 440 | --vmax; |
| 441 | 441 | |
| 442 | − mmax = 16; /* max length of model */ | |
| 442 | + mmax = sizeof(devinfo->model); | |
| 443 | 443 | mskip = model; |
| 444 | 444 | while (mmax > 0 && *mskip == ' ') { |
| 445 | 445 | mmax--; |
| @@ -455,10 +455,12 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor, · 9 unmodified lines | ||
| 455 | 455 | * Behave like the older version of get_device_flags. |
| 456 | 456 | */ |
| 457 | 457 | if (memcmp(devinfo->vendor, vskip, vmax) || |
| 458 | − devinfo->vendor[vmax]) | |
| 458 | + (vmax < sizeof(devinfo->vendor) && | |
| 459 | + devinfo->vendor[vmax])) | |
| 459 | 460 | continue; |
| 460 | 461 | if (memcmp(devinfo->model, mskip, mmax) || |
| 461 | − devinfo->model[mmax]) | |
| 462 | + (mmax < sizeof(devinfo->model) && | |
| 463 | + devinfo->model[mmax])) | |
| 462 | 464 | continue; |
| 463 | 465 | return devinfo; |
| 464 | 466 | } else { |