From: Andrew Morton Provide locking for global list Cc: HighPoint Linux Team Signed-off-by: Andrew Morton --- drivers/scsi/hptiop.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) diff -puN drivers/scsi/hptiop.c~hptiop-highpoint-rocketraid-3xxx-controller-driver-list-locking drivers/scsi/hptiop.c --- 25/drivers/scsi/hptiop.c~hptiop-highpoint-rocketraid-3xxx-controller-driver-list-locking Fri May 12 09:59:37 2006 +++ 25-akpm/drivers/scsi/hptiop.c Fri May 12 09:59:37 2006 @@ -45,6 +45,7 @@ static char driver_name[] = "hptiop"; static const char driver_name_long[] = "RocketRAID 3xxx SATA Controller driver"; static const char driver_ver[] = "v1.0 (060426)"; +static DEFINE_SPINLOCK(hptiop_hba_list_lock); static LIST_HEAD(hptiop_hba_list); static int hptiop_cdev_major = -1; @@ -1146,15 +1147,20 @@ static int hptiop_cdev_open(struct inode { struct hptiop_hba *hba; unsigned i = 0, minor = iminor(inode); + int ret = -ENODEV; + spin_lock(&hptiop_hba_list_lock); list_for_each_entry(hba, &hptiop_hba_list, link) { if (i == minor) { file->private_data = hba; - return 0; + ret = 0; + goto out; } } - return -ENODEV; +out: + spin_unlock(&hptiop_hba_list_lock); + return ret; } static struct file_operations hptiop_cdev_fops = { @@ -1374,7 +1380,9 @@ static int __devinit hptiop_probe(struct if (hptiop_initialize_iop(hba)) goto free_request_mem; + spin_lock(&hptiop_hba_list_lock); list_add_tail(&hba->link, &hptiop_hba_list); + spin_unlock(&hptiop_hba_list_lock); scsi_scan_host(host); _