svn commit: r351754 - in stable/11/sys/cam: ata nvme scsi
Alexander Motin
mav at FreeBSD.org
Tue Sep 3 16:24:45 UTC 2019
Author: mav
Date: Tue Sep 3 16:24:44 2019
New Revision: 351754
URL: https://svnweb.freebsd.org/changeset/base/351754
Log:
MFC r351606: Take proper lock in ses_setphyspath_callback().
XPT_DEV_ADVINFO call should be protected by the lock of the specific
device it is addressed to, not the lock of SES device. In some weird
case, probably with hardware violating standards, it sometimes caused
NULL dereference due to race.
To protect from it further, add lock assertion to *_dev_advinfo().
Modified:
stable/11/sys/cam/ata/ata_xpt.c
stable/11/sys/cam/nvme/nvme_xpt.c
stable/11/sys/cam/scsi/scsi_enc_ses.c
stable/11/sys/cam/scsi/scsi_xpt.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/cam/ata/ata_xpt.c
==============================================================================
--- stable/11/sys/cam/ata/ata_xpt.c Tue Sep 3 16:23:46 2019 (r351753)
+++ stable/11/sys/cam/ata/ata_xpt.c Tue Sep 3 16:24:44 2019 (r351754)
@@ -1732,8 +1732,9 @@ ata_dev_advinfo(union ccb *start_ccb)
{
struct cam_ed *device;
struct ccb_dev_advinfo *cdai;
- off_t amt;
+ off_t amt;
+ xpt_path_assert(start_ccb->ccb_h.path, MA_OWNED);
start_ccb->ccb_h.status = CAM_REQ_INVALID;
device = start_ccb->ccb_h.path->device;
cdai = &start_ccb->cdai;
Modified: stable/11/sys/cam/nvme/nvme_xpt.c
==============================================================================
--- stable/11/sys/cam/nvme/nvme_xpt.c Tue Sep 3 16:23:46 2019 (r351753)
+++ stable/11/sys/cam/nvme/nvme_xpt.c Tue Sep 3 16:24:44 2019 (r351754)
@@ -481,8 +481,9 @@ nvme_dev_advinfo(union ccb *start_ccb)
{
struct cam_ed *device;
struct ccb_dev_advinfo *cdai;
- off_t amt;
+ off_t amt;
+ xpt_path_assert(start_ccb->ccb_h.path, MA_OWNED);
start_ccb->ccb_h.status = CAM_REQ_INVALID;
device = start_ccb->ccb_h.path->device;
cdai = &start_ccb->cdai;
Modified: stable/11/sys/cam/scsi/scsi_enc_ses.c
==============================================================================
--- stable/11/sys/cam/scsi/scsi_enc_ses.c Tue Sep 3 16:23:46 2019 (r351753)
+++ stable/11/sys/cam/scsi/scsi_enc_ses.c Tue Sep 3 16:24:44 2019 (r351754)
@@ -1025,7 +1025,7 @@ ses_setphyspath_callback(enc_softc_t *enc, enc_element
args = (ses_setphyspath_callback_args_t *)arg;
old_physpath = malloc(MAXPATHLEN, M_SCSIENC, M_WAITOK|M_ZERO);
- cam_periph_lock(enc->periph);
+ xpt_path_lock(path);
xpt_setup_ccb(&cdai.ccb_h, path, CAM_PRIORITY_NORMAL);
cdai.ccb_h.func_code = XPT_DEV_ADVINFO;
cdai.buftype = CDAI_TYPE_PHYS_PATH;
@@ -1050,7 +1050,7 @@ ses_setphyspath_callback(enc_softc_t *enc, enc_element
if (cdai.ccb_h.status == CAM_REQ_CMP)
args->num_set++;
}
- cam_periph_unlock(enc->periph);
+ xpt_path_unlock(path);
free(old_physpath, M_SCSIENC);
}
Modified: stable/11/sys/cam/scsi/scsi_xpt.c
==============================================================================
--- stable/11/sys/cam/scsi/scsi_xpt.c Tue Sep 3 16:23:46 2019 (r351753)
+++ stable/11/sys/cam/scsi/scsi_xpt.c Tue Sep 3 16:24:44 2019 (r351754)
@@ -2512,6 +2512,7 @@ scsi_dev_advinfo(union ccb *start_ccb)
struct ccb_dev_advinfo *cdai;
off_t amt;
+ xpt_path_assert(start_ccb->ccb_h.path, MA_OWNED);
start_ccb->ccb_h.status = CAM_REQ_INVALID;
device = start_ccb->ccb_h.path->device;
cdai = &start_ccb->cdai;
More information about the svn-src-all
mailing list