socsvn commit: r224488 - in soc2011/oleksandr/oleksandr-head/head/sys: cam kern sys

oleksandr at FreeBSD.org oleksandr at FreeBSD.org
Fri Jul 22 11:19:55 UTC 2011


Author: oleksandr
Date: Fri Jul 22 11:19:53 2011
New Revision: 224488
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=224488

Log:
  Add new type of disk error:other that including errors associated with requests for control

Modified:
  soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c
  soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c
  soc2011/oleksandr/oleksandr-head/head/sys/sys/devicestat.h

Modified: soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c
==============================================================================
--- soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c	Fri Jul 22 09:39:49 2011	(r224487)
+++ soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c	Fri Jul 22 11:19:53 2011	(r224488)
@@ -4142,58 +4142,66 @@
 {
 	struct cam_sim *sim;
         int	first;
-        int     i,num_error=0;
+        int     i, num_error = 0;
         struct devstat *device_error;
 	devstat_error_flags error_flag[NUMBER_TYPE_ERRORS];
         /*
          * If the error is fatal refer it to the type of non retry able. 
          */
-        if ((done_ccb->ccb_h.status_test==CAM_REQ_CMP_ERR)||
-            (done_ccb->ccb_h.status_test==CAM_TID_INVALID)||
-            (done_ccb->ccb_h.status_test==CAM_SCSI_STATUS_ERROR)||
-            (done_ccb->ccb_h.status_test==CAM_AUTOSENSE_FAIL)||
-            (done_ccb->ccb_h.status_test==CAM_LUN_INVALID)) {
-                error_flag[num_error]=DEVSTAT_ERROR_NON_RETRIABLE;
+        if (done_ccb->ccb_h.status_test == CAM_REQ_CMP_ERR ||
+            done_ccb->ccb_h.status_test == CAM_TID_INVALID ||
+            done_ccb->ccb_h.status_test == CAM_SCSI_STATUS_ERROR ||
+            done_ccb->ccb_h.status_test == CAM_AUTOSENSE_FAIL ||
+            done_ccb->ccb_h.status_test == CAM_LUN_INVALID) {
+                error_flag[num_error] = DEVSTAT_ERROR_NON_RETRIABLE;
                 num_error++;
         }
         /*
          * If the error is not fatal refer it to the type of retry able. 
          */
-        if ((done_ccb->ccb_h.status_test==CAM_SEL_TIMEOUT)||
-            (done_ccb->ccb_h.status_test==CAM_SCSI_BUSY)||
-            (done_ccb->ccb_h.status_test==CAM_SIM_QUEUED)||
-            (done_ccb->ccb_h.status_test==CAM_FUNC_NOTAVAIL)||
-            (done_ccb->ccb_h.status_test==CAM_REQ_INVALID)||
-            (done_ccb->ccb_h.status_test==CAM_REQUEUE_REQ)) {
-                error_flag[num_error]=DEVSTAT_ERROR_RETRIABLE;
+        if (done_ccb->ccb_h.status_test == CAM_SEL_TIMEOUT ||
+            done_ccb->ccb_h.status_test == CAM_SCSI_BUSY ||
+            done_ccb->ccb_h.status_test == CAM_SIM_QUEUED ||
+            done_ccb->ccb_h.status_test == CAM_FUNC_NOTAVAIL ||
+            done_ccb->ccb_h.status_test == CAM_REQ_INVALID ||
+            done_ccb->ccb_h.status_test == CAM_REQUEUE_REQ) {
+                error_flag[num_error] = DEVSTAT_ERROR_RETRIABLE;
                 num_error++;
         }
         /*
-         * If the error is write error refer it to the type of write error
+         * If the error is write error refer it to the type of write error.
          */
-        if ((done_ccb->ccb_h.flags==CAM_DIR_OUT)&&
-            (done_ccb->ccb_h.status_test!=CAM_REQ_CMP)) {
-                error_flag[num_error]=DEVSTAT_ERROR_WRITE_ERROR;
+        if (done_ccb->ccb_h.flags == CAM_DIR_OUT &&
+            done_ccb->ccb_h.status_test != CAM_REQ_CMP) {
+                error_flag[num_error] = DEVSTAT_ERROR_WRITE_ERROR;
                 num_error++;
         }
         /*
          * If the error is read error refer it to the type of read error
          */
-        if ((done_ccb->ccb_h.flags==CAM_DIR_IN)&&
-            (done_ccb->ccb_h.status_test!=CAM_REQ_CMP)) {
-                error_flag[num_error]=DEVSTAT_ERROR_READ_ERROR;
+        if (done_ccb->ccb_h.flags == CAM_DIR_IN &&
+            done_ccb->ccb_h.status_test != CAM_REQ_CMP) {
+                error_flag[num_error] = DEVSTAT_ERROR_READ_ERROR;
+                num_error++;
+        }
+        /*
+         * If the request is countrol and there is no action with data                   * refer it to the type of other error.
+         */
+        if (((done_ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE) && 
+             done_ccb->ccb_h.status_test != CAM_REQ_CMP) {
+                error_flag[num_error]=DEVSTAT_ERROR_OTHER_ERROR;
                 num_error++;
         }
         /*
          * If an error is present, search for an appropriate structure 
          * in devstat and increase the corresponding counter of errors.
          */
-        for (i=0;i<num_error;i++) {  
+        for (i = 0 ;i < num_error; i++) {  
                 if (error_flag[i]) { 
-                        device_error= devstat_search(
-                                done_ccb->ccb_h.path->periph->periph_name,
-        	                done_ccb->ccb_h.path->periph->unit_number);
-                        if (device_error!=NULL) 
+                        device_error = devstat_search(
+                            done_ccb->ccb_h.path->periph->periph_name,
+        	            done_ccb->ccb_h.path->periph->unit_number);
+                        if (device_error != NULL) 
                                 devstat_add_error(device_error, error_flag[i]);
                 }
         } 

Modified: soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c
==============================================================================
--- soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c	Fri Jul 22 09:39:49 2011	(r224487)
+++ soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c	Fri Jul 22 11:19:53 2011	(r224488)
@@ -212,11 +212,11 @@
         mtx_assert(&devstat_mutex, MA_NOTOWNED);
         int status_match = 0;
         devstat_head = &device_statq;
-        if (STAILQ_EMPTY(&device_statq)==0) {
+        if (STAILQ_EMPTY(&device_statq) == 0) {
                 STAILQ_FOREACH(dv_error, devstat_head, dev_links) {
-                        if ((strcmp(dev_name,dv_error->device_name)==0)&&
-                            (unit_number==dv_error->unit_number))  {
-                                status_match=1;
+                        if (strcmp(dev_name,dv_error->device_name) == 0 &&
+                            unit_number == dv_error->unit_number)  {
+                                status_match = 1;
                                 break;
                         }  
                 }
@@ -227,7 +227,7 @@
 	          printf("devstat_search: HELP! "
                          "no appropriate device "
                          "for name %p unit %d\n",
-                         dev_name, unit_number);
+                         dev_name, unit_number); 
                   return NULL; 
         }
 }
@@ -375,14 +375,16 @@
 void 
 devstat_add_error(struct devstat *ds, devstat_error_flags error_flag)
 {
-        if (error_flag==DEVSTAT_ERROR_RETRIABLE) 
+        if (error_flag == DEVSTAT_ERROR_RETRIABLE) 
                 ds->dev_error.retriable++; 
-        if (error_flag==DEVSTAT_ERROR_NON_RETRIABLE) 
+        if (error_flag == DEVSTAT_ERROR_NON_RETRIABLE) 
                 ds->dev_error.non_retriable++; 
-        if (error_flag==DEVSTAT_ERROR_WRITE_ERROR) 
+        if (error_flag == DEVSTAT_ERROR_WRITE_ERROR) 
                 ds->dev_error.write_error++;  
-        if (error_flag==DEVSTAT_ERROR_READ_ERROR) 
+        if (error_flag == DEVSTAT_ERROR_READ_ERROR) 
                 ds->dev_error.read_error++;
+        if (error_flag == DEVSTAT_ERROR_OTHER_ERROR) 
+                ds->dev_error.other_error++;
 }
 /*
  * This is the sysctl handler for the devstat package.  The data pushed out

Modified: soc2011/oleksandr/oleksandr-head/head/sys/sys/devicestat.h
==============================================================================
--- soc2011/oleksandr/oleksandr-head/head/sys/sys/devicestat.h	Fri Jul 22 09:39:49 2011	(r224487)
+++ soc2011/oleksandr/oleksandr-head/head/sys/sys/devicestat.h	Fri Jul 22 11:19:53 2011	(r224488)
@@ -102,7 +102,8 @@
         DEVSTAT_ERROR_RETRIABLE     = 0x01,
         DEVSTAT_ERROR_NON_RETRIABLE = 0x02,
         DEVSTAT_ERROR_READ_ERROR    = 0x03, 
-        DEVSTAT_ERROR_WRITE_ERROR   = 0x04
+        DEVSTAT_ERROR_WRITE_ERROR   = 0x04,
+        DEVSTAT_ERROR_OTHER_ERROR   = 0x05
 } devstat_error_flags;
 /*
  * These types are intended to aid statistics gathering/display programs.
@@ -145,6 +146,7 @@
         int         non_retriable;
         int         read_error;
         int         write_error;
+        int         other_error;
 } devstat_device_error;
 /*
  * XXX: Next revision should add


More information about the svn-soc-all mailing list