SCSI fixes on 20221021
Two small changes, one in the lpfc driver and the other in the core. The core change is an additional footgun guard which prevents users from writing the wrong state to sysfs and causing a hang. Signed-off-by: James E.J. Bottomley <jejb@linux.ibm.com> -----BEGIN PGP SIGNATURE----- iJwEABMIAEQWIQTnYEDbdso9F2cI+arnQslM7pishQUCY1KeHiYcamFtZXMuYm90 dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbQAKCRDnQslM7pishUBSAP0aya1G dXqg9yZqSkYKj17oFHfU0Y84lPfQKHh5b6gH2wEA49SWjPCHDf4OhCWjzpqdAAeO GmT9oeU3FqhqiuMthBA= =vIir -----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 changes, one in the lpfc driver and the other in the core. The core change is an additional footgun guard which prevents users from writing the wrong state to sysfs and causing a hang" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: lpfc: Fix memory leak in lpfc_create_port() scsi: core: Restrict legal sdev_state transitions via sysfs
This commit is contained in:
Коммит
ed5377958c
|
@ -4812,7 +4812,7 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
|
|||
rc = lpfc_vmid_res_alloc(phba, vport);
|
||||
|
||||
if (rc)
|
||||
goto out;
|
||||
goto out_put_shost;
|
||||
|
||||
/* Initialize all internally managed lists. */
|
||||
INIT_LIST_HEAD(&vport->fc_nodes);
|
||||
|
@ -4830,16 +4830,17 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
|
|||
|
||||
error = scsi_add_host_with_dma(shost, dev, &phba->pcidev->dev);
|
||||
if (error)
|
||||
goto out_put_shost;
|
||||
goto out_free_vmid;
|
||||
|
||||
spin_lock_irq(&phba->port_list_lock);
|
||||
list_add_tail(&vport->listentry, &phba->port_list);
|
||||
spin_unlock_irq(&phba->port_list_lock);
|
||||
return vport;
|
||||
|
||||
out_put_shost:
|
||||
out_free_vmid:
|
||||
kfree(vport->vmid);
|
||||
bitmap_free(vport->vmid_priority_range);
|
||||
out_put_shost:
|
||||
scsi_host_put(shost);
|
||||
out:
|
||||
return NULL;
|
||||
|
|
|
@ -828,6 +828,14 @@ store_state_field(struct device *dev, struct device_attribute *attr,
|
|||
}
|
||||
|
||||
mutex_lock(&sdev->state_mutex);
|
||||
switch (sdev->sdev_state) {
|
||||
case SDEV_RUNNING:
|
||||
case SDEV_OFFLINE:
|
||||
break;
|
||||
default:
|
||||
mutex_unlock(&sdev->state_mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (sdev->sdev_state == SDEV_RUNNING && state == SDEV_RUNNING) {
|
||||
ret = 0;
|
||||
} else {
|
||||
|
|
Загрузка…
Ссылка в новой задаче