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

oleksandr at FreeBSD.org oleksandr at FreeBSD.org
Tue Aug 16 22:13:10 UTC 2011


Author: oleksandr
Date: Tue Aug 16 22:13:07 2011
New Revision: 225169
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=225169

Log:
  Review the type of errors

Modified:
  soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_periph.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_periph.c
==============================================================================
--- soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_periph.c	Tue Aug 16 21:51:29 2011	(r225168)
+++ soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_periph.c	Tue Aug 16 22:13:07 2011	(r225169)
@@ -1701,7 +1701,8 @@
 	openings = relsim_flags = 0;
         
         struct devstat *device_error = NULL;
-	devstat_error_flags error_flag_ret = 0, error_flag_type = 0;
+	devstat_error_flags error_flag_ret = 0, error_flag_type = 0,
+                            error_flag_sense = 0;
         /*
          * If the error is not critical refer it to the type of retry able. 
          */
@@ -1732,17 +1733,30 @@
          */
         if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE && 
             error_flag_ret != 0) 
-                error_flag_type=DEVSTAT_ERROR_OTHER_ERROR;
+                error_flag_type = DEVSTAT_ERROR_OTHER_ERROR;
         /*
          * If an error is present, search for an appropriate structure 
          * in devstat and increase the corresponding counter of errors.
          */
+        int sense_key, error_code, asc, ascq;
+        scsi_extract_sense(&ccb->csio.sense_data, 
+                           &error_code, &sense_key, &asc, &ascq);
+        if (sense_key == SSD_KEY_RECOVERED_ERROR && error_flag_ret != 0)
+                error_flag_sense = DEVSTAT_ERROR_RECOVERED;
+        if (sense_key == SSD_KEY_NOT_READY && error_flag_ret != 0)
+                error_flag_sense = DEVSTAT_ERROR_NOT_READY;
+        if (sense_key == SSD_KEY_MEDIUM_ERROR && error_flag_ret != 0)
+                error_flag_sense = DEVSTAT_ERROR_MEDIUM_ERROR;
+        if (sense_key == SSD_KEY_HARDWARE_ERROR && error_flag_ret != 0)
+                error_flag_sense = DEVSTAT_ERROR_HARDWARE;
+        if (sense_key == SSD_KEY_ILLEGAL_REQUEST && error_flag_ret != 0)
+                error_flag_sense = DEVSTAT_ERROR_ILLEGAL_REQ;
         if (error_flag_ret) {
                if ((device_error = devstat_search(
                             ccb->ccb_h.path->periph->periph_name,
         	            ccb->ccb_h.path->periph->unit_number)) != NULL) {
-                       devstat_add_error(device_error, 
-                                         error_flag_ret | error_flag_type); 
+                       devstat_add_error(device_error, error_flag_ret | 
+                                         error_flag_type | error_flag_sense); 
                }
         } 
 	switch (status) {

Modified: soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c
==============================================================================
--- soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c	Tue Aug 16 21:51:29 2011	(r225168)
+++ soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c	Tue Aug 16 22:13:07 2011	(r225169)
@@ -385,6 +385,16 @@
                 ds->dev_error.read_error++;
         if ((error_flag | DEVSTAT_ERROR_OTHER_ERROR) == error_flag) 
                 ds->dev_error.other_error++;
+        if ((error_flag | DEVSTAT_ERROR_RECOVERED) == error_flag)
+                ds->dev_error.recovered++;
+        if ((error_flag | DEVSTAT_ERROR_NOT_READY) == error_flag)
+                ds->dev_error.not_ready++;
+        if ((error_flag | DEVSTAT_ERROR_MEDIUM_ERROR) == error_flag)
+                ds->dev_error.medium_error++;
+        if ((error_flag | DEVSTAT_ERROR_HARDWARE) == error_flag)
+                ds->dev_error.hardware++;
+        if ((error_flag | DEVSTAT_ERROR_ILLEGAL_REQ) == error_flag)
+                ds->dev_error.illegal_req++;
 }
 /*
  * 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	Tue Aug 16 21:51:29 2011	(r225168)
+++ soc2011/oleksandr/oleksandr-head/head/sys/sys/devicestat.h	Tue Aug 16 22:13:07 2011	(r225169)
@@ -98,11 +98,16 @@
  * These flags indicates the type of disk error.
  */
 typedef enum {
-        DEVSTAT_ERROR_RETRIABLE     = 0x01,
-        DEVSTAT_ERROR_NON_RETRIABLE = 0x02,
-        DEVSTAT_ERROR_READ_ERROR    = 0x04, 
-        DEVSTAT_ERROR_WRITE_ERROR   = 0x08,
-        DEVSTAT_ERROR_OTHER_ERROR   = 0x10
+        DEVSTAT_ERROR_RETRIABLE     = 0x001,
+        DEVSTAT_ERROR_NON_RETRIABLE = 0x002,
+        DEVSTAT_ERROR_READ_ERROR    = 0x004, 
+        DEVSTAT_ERROR_WRITE_ERROR   = 0x008,
+        DEVSTAT_ERROR_OTHER_ERROR   = 0x010,
+        DEVSTAT_ERROR_RECOVERED     = 0x020,
+        DEVSTAT_ERROR_NOT_READY     = 0x040,
+        DEVSTAT_ERROR_MEDIUM_ERROR  = 0x080,
+        DEVSTAT_ERROR_HARDWARE      = 0x100,
+        DEVSTAT_ERROR_ILLEGAL_REQ   = 0x200
 } devstat_error_flags;
 /*
  * These types are intended to aid statistics gathering/display programs.
@@ -146,6 +151,11 @@
         int         read_error;
         int         write_error;
         int         other_error;
+        int         recovered;
+        int         not_ready;
+        int         medium_error;
+        int         hardware;
+        int         illegal_req;
 } devstat_device_error;
 /*
  * XXX: Next revision should add
@@ -209,7 +219,7 @@
 				  devstat_support_flags flags,
 				  devstat_type_flags device_type,
 				  devstat_priority priority);
-struct devstat *devstat_search(const char *dev_name, u_int32_t unit_namber);
+struct devstat *devstat_search(const char *dev_name, u_int32_t unit_number);
 void devstat_remove_entry(struct devstat *ds);
 void devstat_start_transaction(struct devstat *ds, struct bintime *now);
 void devstat_start_transaction_bio(struct devstat *ds, struct bio *bp);


More information about the svn-soc-all mailing list