socsvn commit: r224062 -
soc2011/oleksandr/oleksandr-head/head/sys/cam
oleksandr at FreeBSD.org
oleksandr at FreeBSD.org
Fri Jul 8 21:49:17 UTC 2011
Author: oleksandr
Date: Fri Jul 8 21:49:15 2011
New Revision: 224062
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=224062
Log:
Identification type of errors and increased the counter in devstat
Modified:
soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_ccb.h
soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c
Modified: soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_ccb.h
==============================================================================
--- soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_ccb.h Fri Jul 8 21:44:21 2011 (r224061)
+++ soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_ccb.h Fri Jul 8 21:49:15 2011 (r224062)
@@ -304,6 +304,7 @@
/* Callback on completion function */
xpt_opcode func_code; /* XPT function code */
u_int32_t status; /* Status returned by CAM subsystem */
+ u_int32_t status_test; /* CAM status for test disk error */
struct cam_path *path; /* Compiled path for this ccb */
path_id_t path_id; /* Path ID for the request */
target_id_t target_id; /* Target device ID */
Modified: soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c
==============================================================================
--- soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c Fri Jul 8 21:44:21 2011 (r224061)
+++ soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c Fri Jul 8 21:49:15 2011 (r224062)
@@ -38,6 +38,7 @@
#include <sys/kernel.h>
#include <sys/time.h>
#include <sys/conf.h>
+#include <sys/devicestat.h>
#include <sys/fcntl.h>
#include <sys/interrupt.h>
#include <sys/sbuf.h>
@@ -4140,8 +4141,45 @@
xpt_done(union ccb *done_ccb)
{
struct cam_sim *sim;
- int first;
-
+ int first;
+ struct devstat *device_error;
+ devstat_error_flags error_flag=0;
+ /*
+ * 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=DEVSTAT_ERROR_NON_RETRIABLE;
+ }
+ /*
+ * 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=DEVSTAT_ERROR_RETRIABLE;
+ }
+ /*
+ * If an error is present, search for an appropriate structure
+ * in devstat and increase the corresponding counter of errors.
+ */
+ if (error_flag) {
+ 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_start_transaction(device_error, NULL);
+ devstat_add_error(device_error, error_flag);
+ devstat_end_transaction(device_error,done_ccb->csio.dxfer_len,
+ DEVSTAT_TAG_ORDERED,DEVSTAT_WRITE, NULL, NULL);
+ }
+ }
CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_done\n"));
if ((done_ccb->ccb_h.func_code & XPT_FC_QUEUED) != 0) {
/*
More information about the svn-soc-all
mailing list