svn commit: r345815 - in head: lib/libcam sys/cam sys/cam/nvme
Author: mav Date: Tue Apr 2 19:37:52 2019 New Revision: 345815 URL: https://svnweb.freebsd.org/changeset/base/345815 Log: Make cam_error_print() decode NVMe commands. MFC after:2 weeks Modified: head/lib/libcam/Makefile head/sys/cam/cam.c head/sys/cam/nvme/nvme_all.c head/sys/cam/nvme/nvme_all.h head/sys/cam/nvme/nvme_xpt.c Modified: head/lib/libcam/Makefile == --- head/lib/libcam/MakefileTue Apr 2 19:20:55 2019(r345814) +++ head/lib/libcam/MakefileTue Apr 2 19:37:52 2019(r345815) @@ -4,7 +4,7 @@ PACKAGE=lib${LIB} LIB= cam SHLIBDIR?= /lib SRCS= camlib.c scsi_cmdparse.c scsi_all.c scsi_da.c scsi_sa.c cam.c \ - ata_all.c smp_all.c + ata_all.c nvme_all.c smp_all.c INCS= camlib.h LIBADD=sbuf @@ -38,6 +38,7 @@ MLINKS+= cam.3 cam_open_device.3 \ .PATH: ${SRCTOP}/sys/cam \ ${SRCTOP}/sys/cam/ata \ + ${SRCTOP}/sys/cam/nvme \ ${SRCTOP}/sys/cam/mmc \ ${SRCTOP}/sys/cam/scsi Modified: head/sys/cam/cam.c == --- head/sys/cam/cam.c Tue Apr 2 19:20:55 2019(r345814) +++ head/sys/cam/cam.c Tue Apr 2 19:37:52 2019(r345815) @@ -415,7 +415,6 @@ cam_error_string(struct cam_device *device, union ccb switch (ccb->ccb_h.func_code) { case XPT_ATA_IO: ata_command_sbuf(>ataio, ); - sbuf_printf(, "\n"); break; case XPT_SCSI_IO: #ifdef _KERNEL @@ -423,17 +422,22 @@ cam_error_string(struct cam_device *device, union ccb #else /* !_KERNEL */ scsi_command_string(device, >csio, ); #endif /* _KERNEL/!_KERNEL */ - sbuf_printf(, "\n"); break; case XPT_SMP_IO: smp_command_sbuf(>smpio, , path_str, 79 - strlen(path_str), (proto_flags & CAM_ESMF_PRINT_FULL_CMD) ? 79 : 0); - sbuf_printf(, "\n"); break; + case XPT_NVME_IO: + case XPT_NVME_ADMIN: + nvme_command_sbuf(>nvmeio, ); + break; default: + sbuf_printf(, "CAM func %#x", + ccb->ccb_h.func_code); break; } + sbuf_printf(, "\n"); } if (flags & CAM_ESF_CAM_STATUS) { Modified: head/sys/cam/nvme/nvme_all.c == --- head/sys/cam/nvme/nvme_all.cTue Apr 2 19:20:55 2019 (r345814) +++ head/sys/cam/nvme/nvme_all.cTue Apr 2 19:37:52 2019 (r345815) @@ -111,37 +111,84 @@ nvme_opc2str[] = { "COMPARE", "RSVD-6", "RSVD-7", - "DATASET_MANAGEMENT" + "WRITE_ZEROES", + "DATASET_MANAGEMENT", + "RSVD-a", + "RSVD-b", + "RSVD-c", + "RESERVATION_REGISTER", + "RESERVATION_REPORT", + "RSVD-f", + "RSVD-10", + "RESERVATION_ACQUIRE", + "RSVD-12", + "RSVD-13", + "RSVD-14", + "RESERVATION_RELEASE", }; const char * -nvme_op_string(const struct nvme_command *cmd) +nvme_op_string(const struct nvme_command *cmd, int admin) { - if (cmd->opc >= nitems(nvme_opc2str)) - return "UNKNOWN"; - - return nvme_opc2str[cmd->opc]; + if (admin) { + return "ADMIN"; + } else { + if (cmd->opc >= nitems(nvme_opc2str)) + return "UNKNOWN"; + return nvme_opc2str[cmd->opc]; + } } const char * nvme_cmd_string(const struct nvme_command *cmd, char *cmd_string, size_t len) { + struct sbuf sb; + int error; + if (len == 0) + return (""); + + sbuf_new(, cmd_string, len, SBUF_FIXEDLEN); + nvme_cmd_sbuf(cmd, ); + + error = sbuf_finish(); + if (error != 0 && error != ENOMEM) + return (""); + + return(sbuf_data()); +} + +void +nvme_cmd_sbuf(const struct nvme_command *cmd, struct sbuf *sb) +{ + /* * cid, rsvd areas and mptr not printed, since they are used * only internally by the SIM. */ - snprintf(cmd_string, len, + sbuf_printf(sb, "opc=%x fuse=%x nsid=%x prp1=%llx prp2=%llx cdw=%x %x %x %x %x %x", cmd->opc, cmd->fuse, cmd->nsid, (unsigned long long)cmd->prp1, (unsigned long long)cmd->prp2, cmd->cdw10, cmd->cdw11, cmd->cdw12, cmd->cdw13, cmd->cdw14, cmd->cdw15); +} - return cmd_string; +/* +
Re: svn commit: r345815 - in head: lib/libcam sys/cam sys/cam/nvme
On 22.05.2019 11:10, Alexey Dokuchaev wrote: > On Tue, Apr 02, 2019 at 07:37:53PM +, Alexander Motin wrote: >> New Revision: 345815 >> URL: https://svnweb.freebsd.org/changeset/base/345815 >> >> Log: >> Make cam_error_print() decode NVMe commands. >> >> Modified: head/sys/cam/nvme/nvme_xpt.c >> ... >> @@ -769,11 +769,13 @@ nvme_proto_debug_out(union ccb *ccb) >> { >> char cdb_str[(sizeof(struct nvme_command) * 3) + 1]; >> >> -if (ccb->ccb_h.func_code != XPT_NVME_IO) >> +if (ccb->ccb_h.func_code != XPT_NVME_IO || >> +ccb->ccb_h.func_code != XPT_NVME_ADMIN) >> return; > > PVS Studio complains that "Expression is always true. Probably the '&&' > operator should be used here". Can you take a look? Fixed. Thank you. -- Alexander Motin ___ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"
Re: svn commit: r345815 - in head: lib/libcam sys/cam sys/cam/nvme
On Tue, Apr 02, 2019 at 07:37:53PM +, Alexander Motin wrote: > New Revision: 345815 > URL: https://svnweb.freebsd.org/changeset/base/345815 > > Log: > Make cam_error_print() decode NVMe commands. > > Modified: head/sys/cam/nvme/nvme_xpt.c > ... > @@ -769,11 +769,13 @@ nvme_proto_debug_out(union ccb *ccb) > { > char cdb_str[(sizeof(struct nvme_command) * 3) + 1]; > > - if (ccb->ccb_h.func_code != XPT_NVME_IO) > + if (ccb->ccb_h.func_code != XPT_NVME_IO || > + ccb->ccb_h.func_code != XPT_NVME_ADMIN) > return; PVS Studio complains that "Expression is always true. Probably the '&&' operator should be used here". Can you take a look? ./danfe ___ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"
svn commit: r345815 - in head: lib/libcam sys/cam sys/cam/nvme
Author: mav Date: Tue Apr 2 19:37:52 2019 New Revision: 345815 URL: https://svnweb.freebsd.org/changeset/base/345815 Log: Make cam_error_print() decode NVMe commands. MFC after:2 weeks Modified: head/lib/libcam/Makefile head/sys/cam/cam.c head/sys/cam/nvme/nvme_all.c head/sys/cam/nvme/nvme_all.h head/sys/cam/nvme/nvme_xpt.c Modified: head/lib/libcam/Makefile == --- head/lib/libcam/MakefileTue Apr 2 19:20:55 2019(r345814) +++ head/lib/libcam/MakefileTue Apr 2 19:37:52 2019(r345815) @@ -4,7 +4,7 @@ PACKAGE=lib${LIB} LIB= cam SHLIBDIR?= /lib SRCS= camlib.c scsi_cmdparse.c scsi_all.c scsi_da.c scsi_sa.c cam.c \ - ata_all.c smp_all.c + ata_all.c nvme_all.c smp_all.c INCS= camlib.h LIBADD=sbuf @@ -38,6 +38,7 @@ MLINKS+= cam.3 cam_open_device.3 \ .PATH: ${SRCTOP}/sys/cam \ ${SRCTOP}/sys/cam/ata \ + ${SRCTOP}/sys/cam/nvme \ ${SRCTOP}/sys/cam/mmc \ ${SRCTOP}/sys/cam/scsi Modified: head/sys/cam/cam.c == --- head/sys/cam/cam.c Tue Apr 2 19:20:55 2019(r345814) +++ head/sys/cam/cam.c Tue Apr 2 19:37:52 2019(r345815) @@ -415,7 +415,6 @@ cam_error_string(struct cam_device *device, union ccb switch (ccb->ccb_h.func_code) { case XPT_ATA_IO: ata_command_sbuf(>ataio, ); - sbuf_printf(, "\n"); break; case XPT_SCSI_IO: #ifdef _KERNEL @@ -423,17 +422,22 @@ cam_error_string(struct cam_device *device, union ccb #else /* !_KERNEL */ scsi_command_string(device, >csio, ); #endif /* _KERNEL/!_KERNEL */ - sbuf_printf(, "\n"); break; case XPT_SMP_IO: smp_command_sbuf(>smpio, , path_str, 79 - strlen(path_str), (proto_flags & CAM_ESMF_PRINT_FULL_CMD) ? 79 : 0); - sbuf_printf(, "\n"); break; + case XPT_NVME_IO: + case XPT_NVME_ADMIN: + nvme_command_sbuf(>nvmeio, ); + break; default: + sbuf_printf(, "CAM func %#x", + ccb->ccb_h.func_code); break; } + sbuf_printf(, "\n"); } if (flags & CAM_ESF_CAM_STATUS) { Modified: head/sys/cam/nvme/nvme_all.c == --- head/sys/cam/nvme/nvme_all.cTue Apr 2 19:20:55 2019 (r345814) +++ head/sys/cam/nvme/nvme_all.cTue Apr 2 19:37:52 2019 (r345815) @@ -111,37 +111,84 @@ nvme_opc2str[] = { "COMPARE", "RSVD-6", "RSVD-7", - "DATASET_MANAGEMENT" + "WRITE_ZEROES", + "DATASET_MANAGEMENT", + "RSVD-a", + "RSVD-b", + "RSVD-c", + "RESERVATION_REGISTER", + "RESERVATION_REPORT", + "RSVD-f", + "RSVD-10", + "RESERVATION_ACQUIRE", + "RSVD-12", + "RSVD-13", + "RSVD-14", + "RESERVATION_RELEASE", }; const char * -nvme_op_string(const struct nvme_command *cmd) +nvme_op_string(const struct nvme_command *cmd, int admin) { - if (cmd->opc >= nitems(nvme_opc2str)) - return "UNKNOWN"; - - return nvme_opc2str[cmd->opc]; + if (admin) { + return "ADMIN"; + } else { + if (cmd->opc >= nitems(nvme_opc2str)) + return "UNKNOWN"; + return nvme_opc2str[cmd->opc]; + } } const char * nvme_cmd_string(const struct nvme_command *cmd, char *cmd_string, size_t len) { + struct sbuf sb; + int error; + if (len == 0) + return (""); + + sbuf_new(, cmd_string, len, SBUF_FIXEDLEN); + nvme_cmd_sbuf(cmd, ); + + error = sbuf_finish(); + if (error != 0 && error != ENOMEM) + return (""); + + return(sbuf_data()); +} + +void +nvme_cmd_sbuf(const struct nvme_command *cmd, struct sbuf *sb) +{ + /* * cid, rsvd areas and mptr not printed, since they are used * only internally by the SIM. */ - snprintf(cmd_string, len, + sbuf_printf(sb, "opc=%x fuse=%x nsid=%x prp1=%llx prp2=%llx cdw=%x %x %x %x %x %x", cmd->opc, cmd->fuse, cmd->nsid, (unsigned long long)cmd->prp1, (unsigned long long)cmd->prp2, cmd->cdw10, cmd->cdw11, cmd->cdw12, cmd->cdw13, cmd->cdw14, cmd->cdw15); +} - return cmd_string; +/* +