Message ID | 20250219081119.203295-1-wdhh66@163.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | scsi: fix missing lock protection | expand |
On 2/19/25 12:11 AM, Chaohai Chen wrote: > async_scan_lock is designed to protect the scanning_hosts list, > but there is no protection here. > > Signed-off-by: Chaohai Chen <wdhh66@163.com> > --- > drivers/scsi/scsi_scan.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c > index 087fcbfc9aaa..9a90e6ba5603 100644 > --- a/drivers/scsi/scsi_scan.c > +++ b/drivers/scsi/scsi_scan.c > @@ -151,8 +151,12 @@ int scsi_complete_async_scans(void) > struct async_scan_data *data; > > do { > - if (list_empty(&scanning_hosts)) > + spin_lock(&async_scan_lock); > + if (list_empty(&scanning_hosts)) { > + spin_unlock(&async_scan_lock); > return 0; > + } > + spin_unlock(&async_scan_lock); > /* If we can't get memory immediately, that's OK. Just > * sleep a little. Even if we never get memory, the async > * scans will finish eventually. Has it been considered to use scoped_guard() as in the untested patch below? Thanks, Bart. diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 087fcbfc9aaa..efc90571ab47 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -151,8 +151,9 @@ int scsi_complete_async_scans(void) struct async_scan_data *data; do { - if (list_empty(&scanning_hosts)) - return 0; + scoped_guard(spinlock, &async_scan_lock) + if (list_empty(&scanning_hosts)) + return 0; /* If we can't get memory immediately, that's OK. Just * sleep a little. Even if we never get memory, the async * scans will finish eventually.
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 087fcbfc9aaa..9a90e6ba5603 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -151,8 +151,12 @@ int scsi_complete_async_scans(void) struct async_scan_data *data; do { - if (list_empty(&scanning_hosts)) + spin_lock(&async_scan_lock); + if (list_empty(&scanning_hosts)) { + spin_unlock(&async_scan_lock); return 0; + } + spin_unlock(&async_scan_lock); /* If we can't get memory immediately, that's OK. Just * sleep a little. Even if we never get memory, the async * scans will finish eventually.
async_scan_lock is designed to protect the scanning_hosts list, but there is no protection here. Signed-off-by: Chaohai Chen <wdhh66@163.com> --- drivers/scsi/scsi_scan.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)