From owner-svn-soc-all@FreeBSD.ORG Tue Aug 2 16:17:51 2011 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id 5B1E21065672 for ; Tue, 2 Aug 2011 16:17:49 +0000 (UTC) (envelope-from oleksandr@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Tue, 02 Aug 2011 16:17:49 +0000 Date: Tue, 02 Aug 2011 16:17:49 +0000 From: oleksandr@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20110802161749.5B1E21065672@hub.freebsd.org> Cc: Subject: socsvn commit: r224846 - in soc2011/oleksandr/oleksandr-head/head/sys: cam kern sys X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Aug 2011 16:17:51 -0000 Author: oleksandr Date: Tue Aug 2 16:17:49 2011 New Revision: 224846 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=224846 Log: Change the place where error br detected Modified: soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_ccb.h soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_periph.c 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_ccb.h ============================================================================== --- soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_ccb.h Tue Aug 2 15:35:43 2011 (r224845) +++ soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_ccb.h Tue Aug 2 16:17:49 2011 (r224846) @@ -304,7 +304,6 @@ /* 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_periph.c ============================================================================== --- soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_periph.c Tue Aug 2 15:35:43 2011 (r224845) +++ soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_periph.c Tue Aug 2 16:17:49 2011 (r224846) @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -1698,7 +1699,54 @@ frozen = (status & CAM_DEV_QFRZN) != 0; status &= CAM_STATUS_MASK; openings = relsim_flags = 0; - + + struct devstat *device_error = NULL; + devstat_error_flags error_flag_ret = 0, error_flag_type = 0; + /* + * If the error is not fatal refer it to the type of retry able. + */ + if (status == CAM_SEL_TIMEOUT || status == CAM_SCSI_BUSY || + status == CAM_SIM_QUEUED || status == CAM_FUNC_NOTAVAIL || + status == CAM_REQ_INVALID) + error_flag_ret = DEVSTAT_ERROR_RETRIABLE; + /* + * If the error is fatal refer it to the type of non retry able. + */ + if (status == CAM_REQ_CMP_ERR || status == CAM_TID_INVALID || + status == CAM_SCSI_STATUS_ERROR || status == CAM_AUTOSENSE_FAIL || + status == CAM_LUN_INVALID) + error_flag_ret = DEVSTAT_ERROR_NON_RETRIABLE; + /* + * If the error is write error refer it to the type of write error. + */ + if (ccb->ccb_h.flags == CAM_DIR_OUT && status != CAM_REQ_CMP && + error_flag_ret != 0) + error_flag_type = DEVSTAT_ERROR_WRITE_ERROR; + /* + * If the error is read error refer it to the type of read error + */ + if (ccb->ccb_h.flags == CAM_DIR_IN && status != CAM_REQ_CMP && + error_flag_ret != 0) + error_flag_type = DEVSTAT_ERROR_READ_ERROR; + /* + * If the request is countrol and there is no action with data * refer it to the type of other error. + */ + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE && + status != CAM_REQ_CMP && error_flag_ret != 0) + 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. + */ + if (error_flag_ret) { + device_error = devstat_search( + ccb->ccb_h.path->periph->periph_name, + ccb->ccb_h.path->periph->unit_number); + if (device_error != NULL) { + devstat_add_error(device_error, + error_flag_ret | error_flag_type); + } + } switch (status) { case CAM_REQ_CMP: error = 0; Modified: soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c ============================================================================== --- soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c Tue Aug 2 15:35:43 2011 (r224845) +++ soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c Tue Aug 2 16:17:49 2011 (r224846) @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -4142,69 +4141,7 @@ { struct cam_sim *sim; int first; - 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; - 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; - num_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; - 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; - 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++) { - 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) - devstat_add_error(device_error, error_flag[i]); - } - } + CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_done\n")); if ((done_ccb->ccb_h.func_code & XPT_FC_QUEUED) != 0) { /* Modified: soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c ============================================================================== --- soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c Tue Aug 2 15:35:43 2011 (r224845) +++ soc2011/oleksandr/oleksandr-head/head/sys/kern/subr_devstat.c Tue Aug 2 16:17:49 2011 (r224846) @@ -375,15 +375,15 @@ void devstat_add_error(struct devstat *ds, devstat_error_flags error_flag) { - if (error_flag == DEVSTAT_ERROR_RETRIABLE) + if ((error_flag | DEVSTAT_ERROR_RETRIABLE) == error_flag) ds->dev_error.retriable++; - if (error_flag == DEVSTAT_ERROR_NON_RETRIABLE) + if ((error_flag | DEVSTAT_ERROR_NON_RETRIABLE) == error_flag) ds->dev_error.non_retriable++; - if (error_flag == DEVSTAT_ERROR_WRITE_ERROR) + if ((error_flag | DEVSTAT_ERROR_WRITE_ERROR) == error_flag) ds->dev_error.write_error++; - if (error_flag == DEVSTAT_ERROR_READ_ERROR) + if ((error_flag | DEVSTAT_ERROR_READ_ERROR) == error_flag) ds->dev_error.read_error++; - if (error_flag == DEVSTAT_ERROR_OTHER_ERROR) + if ((error_flag | DEVSTAT_ERROR_OTHER_ERROR) == error_flag) ds->dev_error.other_error++; } /* Modified: soc2011/oleksandr/oleksandr-head/head/sys/sys/devicestat.h ============================================================================== --- soc2011/oleksandr/oleksandr-head/head/sys/sys/devicestat.h Tue Aug 2 15:35:43 2011 (r224845) +++ soc2011/oleksandr/oleksandr-head/head/sys/sys/devicestat.h Tue Aug 2 16:17:49 2011 (r224846) @@ -54,7 +54,6 @@ * kernel. */ #define DEVSTAT_VERSION 6 -#define NUMBER_TYPE_ERRORS 2 /* * These flags specify which statistics features are supported or not @@ -101,9 +100,9 @@ typedef enum { DEVSTAT_ERROR_RETRIABLE = 0x01, DEVSTAT_ERROR_NON_RETRIABLE = 0x02, - DEVSTAT_ERROR_READ_ERROR = 0x03, - DEVSTAT_ERROR_WRITE_ERROR = 0x04, - DEVSTAT_ERROR_OTHER_ERROR = 0x05 + DEVSTAT_ERROR_READ_ERROR = 0x04, + DEVSTAT_ERROR_WRITE_ERROR = 0x08, + DEVSTAT_ERROR_OTHER_ERROR = 0x10 } devstat_error_flags; /* * These types are intended to aid statistics gathering/display programs.