Author: mav
Date: Thu Aug  8 21:33:14 2019
New Revision: 350786
URL: https://svnweb.freebsd.org/changeset/base/350786

Log:
  MFC r349283 (by scottl):
  Refactor xpt_getattr() to make it more readable.  No outwardly
  visible functional changes, though code flow was modified a bit
  internally to lessen the need for goto jumps and chained if
  conditionals.

Modified:
  stable/11/sys/cam/cam_xpt.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/cam/cam_xpt.c
==============================================================================
--- stable/11/sys/cam/cam_xpt.c Thu Aug  8 21:32:26 2019        (r350785)
+++ stable/11/sys/cam/cam_xpt.c Thu Aug  8 21:33:14 2019        (r350786)
@@ -1111,6 +1111,7 @@ xpt_getattr(char *buf, size_t len, const char *attr, s
 {
        int ret = -1, l, o;
        struct ccb_dev_advinfo cdai;
+       struct scsi_vpd_device_id *did;
        struct scsi_vpd_id_descriptor *idd;
 
        xpt_path_assert(path, MA_OWNED);
@@ -1143,31 +1144,36 @@ xpt_getattr(char *buf, size_t len, const char *attr, s
                cam_release_devq(cdai.ccb_h.path, 0, 0, 0, FALSE);
        if (cdai.provsiz == 0)
                goto out;
-       if (cdai.buftype == CDAI_TYPE_SCSI_DEVID) {
+       switch(cdai.buftype) {
+       case CDAI_TYPE_SCSI_DEVID:
+               did = (struct scsi_vpd_device_id *)cdai.buf;
                if (strcmp(attr, "GEOM::lunid") == 0) {
-                       idd = scsi_get_devid((struct scsi_vpd_device_id 
*)cdai.buf,
-                           cdai.provsiz, scsi_devid_is_lun_naa);
+                       idd = scsi_get_devid(did, cdai.provsiz,
+                           scsi_devid_is_lun_naa);
                        if (idd == NULL)
-                               idd = scsi_get_devid((struct scsi_vpd_device_id 
*)cdai.buf,
-                                   cdai.provsiz, scsi_devid_is_lun_eui64);
+                               idd = scsi_get_devid(did, cdai.provsiz,
+                                   scsi_devid_is_lun_eui64);
                        if (idd == NULL)
-                               idd = scsi_get_devid((struct scsi_vpd_device_id 
*)cdai.buf,
-                                   cdai.provsiz, scsi_devid_is_lun_uuid);
+                               idd = scsi_get_devid(did, cdai.provsiz,
+                                   scsi_devid_is_lun_uuid);
                        if (idd == NULL)
-                               idd = scsi_get_devid((struct scsi_vpd_device_id 
*)cdai.buf,
-                                   cdai.provsiz, scsi_devid_is_lun_md5);
+                               idd = scsi_get_devid(did, cdai.provsiz,
+                                   scsi_devid_is_lun_md5);
                } else
                        idd = NULL;
+
                if (idd == NULL)
-                       idd = scsi_get_devid((struct scsi_vpd_device_id 
*)cdai.buf,
-                           cdai.provsiz, scsi_devid_is_lun_t10);
+                       idd = scsi_get_devid(did, cdai.provsiz,
+                           scsi_devid_is_lun_t10);
                if (idd == NULL)
-                       idd = scsi_get_devid((struct scsi_vpd_device_id 
*)cdai.buf,
-                           cdai.provsiz, scsi_devid_is_lun_name);
+                       idd = scsi_get_devid(did, cdai.provsiz,
+                           scsi_devid_is_lun_name);
                if (idd == NULL)
-                       goto out;
+                       break;
+
                ret = 0;
-               if ((idd->proto_codeset & SVPD_ID_CODESET_MASK) == 
SVPD_ID_CODESET_ASCII) {
+               if ((idd->proto_codeset & SVPD_ID_CODESET_MASK) ==
+                   SVPD_ID_CODESET_ASCII) {
                        if (idd->length < len) {
                                for (l = 0; l < idd->length; l++)
                                        buf[l] = idd->identifier[l] ?
@@ -1175,38 +1181,46 @@ xpt_getattr(char *buf, size_t len, const char *attr, s
                                buf[l] = 0;
                        } else
                                ret = EFAULT;
-               } else if ((idd->proto_codeset & SVPD_ID_CODESET_MASK) == 
SVPD_ID_CODESET_UTF8) {
+                       break;
+               }
+               if ((idd->proto_codeset & SVPD_ID_CODESET_MASK) ==
+                   SVPD_ID_CODESET_UTF8) {
                        l = strnlen(idd->identifier, idd->length);
                        if (l < len) {
                                bcopy(idd->identifier, buf, l);
                                buf[l] = 0;
                        } else
                                ret = EFAULT;
-               } else if ((idd->id_type & SVPD_ID_TYPE_MASK) == 
SVPD_ID_TYPE_UUID
-                   && idd->identifier[0] == 0x10) {
-                       if ((idd->length - 2) * 2 + 4 < len) {
-                               for (l = 2, o = 0; l < idd->length; l++) {
-                                       if (l == 6 || l == 8 || l == 10 || l == 
12)
-                                           o += sprintf(buf + o, "-");
-                                       o += sprintf(buf + o, "%02x",
-                                           idd->identifier[l]);
-                               }
-                       } else
+                       break;
+               }
+               if ((idd->id_type & SVPD_ID_TYPE_MASK) ==
+                   SVPD_ID_TYPE_UUID && idd->identifier[0] == 0x10) {
+                       if ((idd->length - 2) * 2 + 4 >= len) {
                                ret = EFAULT;
-               } else {
-                       if (idd->length * 2 < len) {
-                               for (l = 0; l < idd->length; l++)
-                                       sprintf(buf + l * 2, "%02x",
-                                           idd->identifier[l]);
-                       } else
-                               ret = EFAULT;
+                               break;
+                       }
+                       for (l = 2, o = 0; l < idd->length; l++) {
+                               if (l == 6 || l == 8 || l == 10 || l == 12)
+                                   o += sprintf(buf + o, "-");
+                               o += sprintf(buf + o, "%02x",
+                                   idd->identifier[l]);
+                       }
+                       break;
                }
-       } else {
+               if (idd->length * 2 < len) {
+                       for (l = 0; l < idd->length; l++)
+                               sprintf(buf + l * 2, "%02x",
+                                   idd->identifier[l]);
+               } else
+                               ret = EFAULT;
+               break;
+       default:
                if (cdai.provsiz < len) {
                        cdai.buf[cdai.provsiz] = 0;
                        ret = 0;
                } else
                        ret = EFAULT;
+               break;
        }
 
 out:
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to