|
@@ -782,7 +782,7 @@ void scsi_attach_vpd(struct scsi_device *sdev)
|
|
|
int vpd_len = SCSI_VPD_PG_LEN;
|
|
|
int pg80_supported = 0;
|
|
|
int pg83_supported = 0;
|
|
|
- unsigned char *vpd_buf;
|
|
|
+ unsigned char __rcu *vpd_buf, *orig_vpd_buf = NULL;
|
|
|
|
|
|
if (sdev->skip_vpd_pages)
|
|
|
return;
|
|
@@ -828,8 +828,16 @@ retry_pg80:
|
|
|
kfree(vpd_buf);
|
|
|
goto retry_pg80;
|
|
|
}
|
|
|
+ mutex_lock(&sdev->inquiry_mutex);
|
|
|
+ orig_vpd_buf = sdev->vpd_pg80;
|
|
|
sdev->vpd_pg80_len = result;
|
|
|
- sdev->vpd_pg80 = vpd_buf;
|
|
|
+ rcu_assign_pointer(sdev->vpd_pg80, vpd_buf);
|
|
|
+ mutex_unlock(&sdev->inquiry_mutex);
|
|
|
+ synchronize_rcu();
|
|
|
+ if (orig_vpd_buf) {
|
|
|
+ kfree(orig_vpd_buf);
|
|
|
+ orig_vpd_buf = NULL;
|
|
|
+ }
|
|
|
vpd_len = SCSI_VPD_PG_LEN;
|
|
|
}
|
|
|
|
|
@@ -849,8 +857,14 @@ retry_pg83:
|
|
|
kfree(vpd_buf);
|
|
|
goto retry_pg83;
|
|
|
}
|
|
|
+ mutex_lock(&sdev->inquiry_mutex);
|
|
|
+ orig_vpd_buf = sdev->vpd_pg83;
|
|
|
sdev->vpd_pg83_len = result;
|
|
|
- sdev->vpd_pg83 = vpd_buf;
|
|
|
+ rcu_assign_pointer(sdev->vpd_pg83, vpd_buf);
|
|
|
+ mutex_unlock(&sdev->inquiry_mutex);
|
|
|
+ synchronize_rcu();
|
|
|
+ if (orig_vpd_buf)
|
|
|
+ kfree(orig_vpd_buf);
|
|
|
}
|
|
|
}
|
|
|
|