Date: Fri, 15 Jul 2011 11:21:16 +0000 From: oleksandr@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r224268 - soc2011/oleksandr/oleksandr-head/head/sys/cam Message-ID: <20110715112116.62D38106566C@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: oleksandr Date: Fri Jul 15 11:21:16 2011 New Revision: 224268 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=224268 Log: Add new type of error: read and write Modified: soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c Modified: soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c ============================================================================== --- soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c Fri Jul 15 11:15:57 2011 (r224267) +++ soc2011/oleksandr/oleksandr-head/head/sys/cam/cam_xpt.c Fri Jul 15 11:21:16 2011 (r224268) @@ -4142,8 +4142,9 @@ { struct cam_sim *sim; int first; + int i,num_error=0; struct devstat *device_error; - devstat_error_flags error_flag=0; + devstat_error_flags error_flag[NUMBER_TYPE_ERRORS]; /* * If the error is fatal refer it to the type of non retry able. */ @@ -4152,7 +4153,8 @@ (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; + error_flag[num_error]=DEVSTAT_ERROR_NON_RETRIABLE; + num_error++; } /* * If the error is not fatal refer it to the type of retry able. @@ -4163,23 +4165,38 @@ (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; + 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 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); - } - } + 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) { /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110715112116.62D38106566C>