svn commit: r359314 - stable/12/sys/cam/scsi
Alexander Motin
mav at FreeBSD.org
Thu Mar 26 00:42:40 UTC 2020
Author: mav
Date: Thu Mar 26 00:42:31 2020
New Revision: 359314
URL: https://svnweb.freebsd.org/changeset/base/359314
Log:
MFC r359146: Fix SES on device slots without phys after r349321.
Broadcom 9400-8i8e HBAs report virtual SES device, where slots representing
external connectors are reported having no phys. Since sasdev_phys is NULL
there and proto_hdr is a union, ses_paths_iter() misinterpreted them as ATA.
Add explicit protocol check to properly differentiate them.
Modified:
stable/12/sys/cam/scsi/scsi_enc_ses.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/cam/scsi/scsi_enc_ses.c
==============================================================================
--- stable/12/sys/cam/scsi/scsi_enc_ses.c Thu Mar 26 00:39:36 2020 (r359313)
+++ stable/12/sys/cam/scsi/scsi_enc_ses.c Thu Mar 26 00:42:31 2020 (r359314)
@@ -956,30 +956,38 @@ ses_paths_iter(enc_softc_t *enc, enc_element_t *elm,
if (addl->hdr == NULL)
return;
- if (addl->proto_hdr.sas != NULL &&
- addl->proto_data.sasdev_phys != NULL) {
- ses_path_iter_args_t args;
+ switch(ses_elm_addlstatus_proto(addl->hdr)) {
+ case SPSP_PROTO_SAS:
+ if (addl->proto_hdr.sas != NULL &&
+ addl->proto_data.sasdev_phys != NULL) {
+ ses_path_iter_args_t args;
- args.callback = callback;
- args.callback_arg = callback_arg;
- ses_devids_iter(enc, elm, ses_path_iter_devid_callback, &args);
- } else if (addl->proto_hdr.ata != NULL) {
- struct cam_path *path;
- struct ccb_getdev cgd;
+ args.callback = callback;
+ args.callback_arg = callback_arg;
+ ses_devids_iter(enc, elm, ses_path_iter_devid_callback,
+ &args);
+ }
+ break;
+ case SPSP_PROTO_ATA:
+ if (addl->proto_hdr.ata != NULL) {
+ struct cam_path *path;
+ struct ccb_getdev cgd;
- if (xpt_create_path(&path, /*periph*/NULL,
- scsi_4btoul(addl->proto_hdr.ata->bus),
- scsi_4btoul(addl->proto_hdr.ata->target), 0)
- != CAM_REQ_CMP)
- return;
+ if (xpt_create_path(&path, /*periph*/NULL,
+ scsi_4btoul(addl->proto_hdr.ata->bus),
+ scsi_4btoul(addl->proto_hdr.ata->target), 0)
+ != CAM_REQ_CMP)
+ return;
- xpt_setup_ccb(&cgd.ccb_h, path, CAM_PRIORITY_NORMAL);
- cgd.ccb_h.func_code = XPT_GDEV_TYPE;
- xpt_action((union ccb *)&cgd);
- if (cgd.ccb_h.status == CAM_REQ_CMP)
- callback(enc, elm, path, callback_arg);
+ xpt_setup_ccb(&cgd.ccb_h, path, CAM_PRIORITY_NORMAL);
+ cgd.ccb_h.func_code = XPT_GDEV_TYPE;
+ xpt_action((union ccb *)&cgd);
+ if (cgd.ccb_h.status == CAM_REQ_CMP)
+ callback(enc, elm, path, callback_arg);
- xpt_free_path(path);
+ xpt_free_path(path);
+ }
+ break;
}
}
More information about the svn-src-all
mailing list