svn commit: r345815 - in head: lib/libcam sys/cam sys/cam/nvme

2019-09-03 Thread Alexander Motin
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

2019-05-22 Thread Alexander Motin
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

2019-05-22 Thread Alexey Dokuchaev
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

2019-04-02 Thread Alexander Motin
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;
+/*
+