mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
scsi: mpi3mr: Use ida to manage mrioc ID
[ Upstream commit 29b75184f721b16c51ef6e67eec0e40ed88381c7 ] To ensure that the same ID is not obtained during concurrent execution of the probe, an ida is used to manage the mrioc's ID. Signed-off-by: Guixin Liu <kanie@linux.alibaba.com> Link: https://lore.kernel.org/r/20231229040331.52518-1-kanie@linux.alibaba.com Reviewed-by: Lee Duncan <lduncan@suse.com> Reviewed-by: Martin Wilck <mwilck@suse.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Stable-dep-of: 0d32014f1e3e ("scsi: mpi3mr: Start controller indexing from 0") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8d891c866c
commit
d424303d8d
@@ -8,11 +8,12 @@
|
||||
*/
|
||||
|
||||
#include "mpi3mr.h"
|
||||
#include <linux/idr.h>
|
||||
|
||||
/* global driver scop variables */
|
||||
LIST_HEAD(mrioc_list);
|
||||
DEFINE_SPINLOCK(mrioc_list_lock);
|
||||
static int mrioc_ids;
|
||||
static DEFINE_IDA(mrioc_ida);
|
||||
static int warn_non_secure_ctlr;
|
||||
atomic64_t event_counter;
|
||||
|
||||
@@ -5065,7 +5066,10 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
}
|
||||
|
||||
mrioc = shost_priv(shost);
|
||||
mrioc->id = mrioc_ids++;
|
||||
retval = ida_alloc_range(&mrioc_ida, 1, U8_MAX, GFP_KERNEL);
|
||||
if (retval < 0)
|
||||
goto id_alloc_failed;
|
||||
mrioc->id = (u8)retval;
|
||||
sprintf(mrioc->driver_name, "%s", MPI3MR_DRIVER_NAME);
|
||||
sprintf(mrioc->name, "%s%d", mrioc->driver_name, mrioc->id);
|
||||
INIT_LIST_HEAD(&mrioc->list);
|
||||
@@ -5215,9 +5219,11 @@ init_ioc_failed:
|
||||
resource_alloc_failed:
|
||||
destroy_workqueue(mrioc->fwevt_worker_thread);
|
||||
fwevtthread_failed:
|
||||
ida_free(&mrioc_ida, mrioc->id);
|
||||
spin_lock(&mrioc_list_lock);
|
||||
list_del(&mrioc->list);
|
||||
spin_unlock(&mrioc_list_lock);
|
||||
id_alloc_failed:
|
||||
scsi_host_put(shost);
|
||||
shost_failed:
|
||||
return retval;
|
||||
@@ -5303,6 +5309,7 @@ static void mpi3mr_remove(struct pci_dev *pdev)
|
||||
mrioc->sas_hba.num_phys = 0;
|
||||
}
|
||||
|
||||
ida_free(&mrioc_ida, mrioc->id);
|
||||
spin_lock(&mrioc_list_lock);
|
||||
list_del(&mrioc->list);
|
||||
spin_unlock(&mrioc_list_lock);
|
||||
@@ -5518,6 +5525,7 @@ static void __exit mpi3mr_exit(void)
|
||||
&driver_attr_event_counter);
|
||||
pci_unregister_driver(&mpi3mr_pci_driver);
|
||||
sas_release_transport(mpi3mr_transport_template);
|
||||
ida_destroy(&mrioc_ida);
|
||||
}
|
||||
|
||||
module_init(mpi3mr_init);
|
||||
|
||||
Reference in New Issue
Block a user