📄 dasd_3990_erp.c
字号:
} else { /* all other data checks */ DASD_MESSAGE (KERN_DEBUG, device, "%s", "Uncorrectable data check with retry count " "exhausted..."); erp = dasd_3990_erp_action_5 (erp); } return erp;} /* end dasd_3990_erp_data_check *//* * DASD_3990_ERP_OVERRUN * * DESCRIPTION * Handles 24 byte 'Overrun' error. * * PARAMETER * erp current erp_head * RETURN VALUES * erp new erp_head - pointer to new ERP */ccw_req_t *dasd_3990_erp_overrun (ccw_req_t *erp, char *sense){ dasd_device_t *device = erp->device; erp->function = dasd_3990_erp_overrun; DASD_MESSAGE (KERN_DEBUG, device, "%s", "Overrun - service overrun or overrun" " error requested by channel"); erp = dasd_3990_erp_action_5 (erp); return erp;} /* end dasd_3990_erp_overrun *//* * DASD_3990_ERP_INV_FORMAT * * DESCRIPTION * Handles 24 byte 'Invalid Track Format' error. * * PARAMETER * erp current erp_head * RETURN VALUES * erp new erp_head - pointer to new ERP */ccw_req_t *dasd_3990_erp_inv_format (ccw_req_t *erp, char *sense){ dasd_device_t *device = erp->device; erp->function = dasd_3990_erp_inv_format; if (sense[2] & SNS2_ENV_DATA_PRESENT) { DASD_MESSAGE (KERN_DEBUG, device, "%s", "Track format error when destaging or " "staging data"); dasd_3990_handle_env_data (erp, sense); erp = dasd_3990_erp_action_4 (erp, sense); } else { DASD_MESSAGE (KERN_ERR, device, "%s", "Invalid Track Format - Fatal error should have " "been handled within the interrupt handler"); erp= dasd_3990_erp_cleanup (erp, CQR_STATUS_FAILED); } return erp;} /* end dasd_3990_erp_inv_format *//* * DASD_3990_ERP_EOC * * DESCRIPTION * Handles 24 byte 'End-of-Cylinder' error. * * PARAMETER * erp already added default erp * RETURN VALUES * erp pointer to original (failed) cqr. */ccw_req_t *dasd_3990_erp_EOC (ccw_req_t *default_erp, char *sense){ dasd_device_t *device = default_erp->device; DASD_MESSAGE (KERN_ERR, device, "%s", "End-of-Cylinder - must never happen"); /* implement action 7 - BUG */ return dasd_3990_erp_cleanup (default_erp, CQR_STATUS_FAILED);} /* end dasd_3990_erp_EOC *//* * DASD_3990_ERP_ENV_DATA * * DESCRIPTION * Handles 24 byte 'Environmental-Data Present' error. * * PARAMETER * erp current erp_head * RETURN VALUES * erp new erp_head - pointer to new ERP */ccw_req_t *dasd_3990_erp_env_data (ccw_req_t *erp, char *sense){ dasd_device_t *device = erp->device; erp->function = dasd_3990_erp_env_data; DASD_MESSAGE (KERN_DEBUG, device, "%s", "Environmental data present"); dasd_3990_handle_env_data (erp, sense); /* don't retry on disabled interface */ if (sense[7] != 0x0F) { erp = dasd_3990_erp_action_4 (erp, sense); } else { erp = dasd_3990_erp_cleanup (erp, CQR_STATUS_IN_IO); } return erp;} /* end dasd_3990_erp_env_data *//* * DASD_3990_ERP_NO_REC * * DESCRIPTION * Handles 24 byte 'No Record Found' error. * * PARAMETER * erp already added default ERP * * RETURN VALUES * erp new erp_head - pointer to new ERP */ccw_req_t *dasd_3990_erp_no_rec (ccw_req_t *default_erp, char *sense){ dasd_device_t *device = default_erp->device; DASD_MESSAGE (KERN_ERR, device, "%s", "No Record Found - Fatal error should " "have been handled within the interrupt handler"); return dasd_3990_erp_cleanup (default_erp, CQR_STATUS_FAILED);} /* end dasd_3990_erp_no_rec *//* * DASD_3990_ERP_FILE_PROT * * DESCRIPTION * Handles 24 byte 'File Protected' error. * Note: Seek related recovery is not implemented because * wee don't use the seek command yet. * * PARAMETER * erp current erp_head * RETURN VALUES * erp new erp_head - pointer to new ERP */ccw_req_t *dasd_3990_erp_file_prot (ccw_req_t *erp){ dasd_device_t *device = erp->device; DASD_MESSAGE (KERN_ERR, device, "%s", "File Protected"); return dasd_3990_erp_cleanup (erp, CQR_STATUS_FAILED);} /* end dasd_3990_erp_file_prot *//* * DASD_3990_ERP_INSPECT_24 * * DESCRIPTION * Does a detailed inspection of the 24 byte sense data * and sets up a related error recovery action. * * PARAMETER * sense sense data of the actual error * erp pointer to the currently created default ERP * * RETURN VALUES * erp pointer to the (addtitional) ERP */ccw_req_t *dasd_3990_erp_inspect_24 (ccw_req_t *erp, char *sense){ ccw_req_t *erp_filled = NULL; /* Check sense for .... */ /* 'Command Reject' */ if ((erp_filled == NULL) && (sense[0] & SNS0_CMD_REJECT)) { erp_filled = dasd_3990_erp_com_rej (erp, sense); } /* 'Intervention Required' */ if ((erp_filled == NULL) && (sense[0] & SNS0_INTERVENTION_REQ)) { erp_filled = dasd_3990_erp_int_req (erp); } /* 'Bus Out Parity Check' */ if ((erp_filled == NULL) && (sense[0] & SNS0_BUS_OUT_CHECK)) { erp_filled = dasd_3990_erp_bus_out (erp); } /* 'Equipment Check' */ if ((erp_filled == NULL) && (sense[0] & SNS0_EQUIPMENT_CHECK)) { erp_filled = dasd_3990_erp_equip_check (erp, sense); } /* 'Data Check' */ if ((erp_filled == NULL) && (sense[0] & SNS0_DATA_CHECK)) { erp_filled = dasd_3990_erp_data_check (erp, sense); } /* 'Overrun' */ if ((erp_filled == NULL) && (sense[0] & SNS0_OVERRUN)) { erp_filled = dasd_3990_erp_overrun (erp, sense); } /* 'Invalid Track Format' */ if ((erp_filled == NULL) && (sense[1] & SNS1_INV_TRACK_FORMAT)) { erp_filled = dasd_3990_erp_inv_format (erp, sense); } /* 'End-of-Cylinder' */ if ((erp_filled == NULL) && (sense[1] & SNS1_EOC)) { erp_filled = dasd_3990_erp_EOC (erp, sense); } /* 'Environmental Data' */ if ((erp_filled == NULL) && (sense[2] & SNS2_ENV_DATA_PRESENT)) { erp_filled = dasd_3990_erp_env_data (erp, sense); } /* 'No Record Found' */ if ((erp_filled == NULL) && (sense[1] & SNS1_NO_REC_FOUND)) { erp_filled = dasd_3990_erp_no_rec (erp, sense); } /* 'File Protected' */ if ((erp_filled == NULL) && (sense[1] & SNS1_FILE_PROTECTED)) { erp_filled = dasd_3990_erp_file_prot (erp); } /* other (unknown) error - do default ERP */ if (erp_filled == NULL) { erp_filled = erp; } return erp_filled;} /* END dasd_3990_erp_inspect_24 *//* ***************************************************************************** * 32 byte sense ERP functions (only) ***************************************************************************** *//* * DASD_3990_ERPACTION_10_32 * * DESCRIPTION * Handles 32 byte 'Action 10' of Single Program Action Codes. * Just retry and if retry doesn't work, return with error. * * PARAMETER * erp current erp_head * sense current sense data * RETURN VALUES * erp modified erp_head */ccw_req_t *dasd_3990_erp_action_10_32 (ccw_req_t *erp, char *sense){ dasd_device_t *device = erp->device; erp->retries = 256; erp->function = dasd_3990_erp_action_10_32; DASD_MESSAGE (KERN_DEBUG, device, "%s", "Perform logging requested"); return erp;} /* end dasd_3990_erp_action_10_32 *//* * DASD_3990_ERP_ACTION_1B_32 * * DESCRIPTION * Handles 32 byte 'Action 1B' of Single Program Action Codes. * A write operation could not be finished because of an unexpected * condition. * The already created 'default erp' is used to get the link to * the erp chain, but it can not be used for this recovery * action because it contains no DE/LO data space. * * PARAMETER * default_erp already added default erp. * sense current sense data * * RETURN VALUES * erp new erp or * default_erp in case of imprecise ending or error */ccw_req_t *dasd_3990_erp_action_1B_32 (ccw_req_t *default_erp, char *sense){ dasd_device_t *device = default_erp->device; __u32 cpa = 0; ccw_req_t *cqr; ccw_req_t *erp; DE_eckd_data_t *DE_data; char *LO_data; /* LO_eckd_data_t */ ccw1_t *ccw; DASD_MESSAGE (KERN_DEBUG, device, "%s", "Write not finished because of unexpected condition"); default_erp->function = dasd_3990_erp_action_1B_32; /* determine the original cqr */ cqr = default_erp; while (cqr->refers != NULL){ cqr = cqr->refers; } /* for imprecise ending just do default erp */ if (sense[1] & 0x01) { DASD_MESSAGE (KERN_DEBUG, device, "%s", "Imprecise ending is set - just retry");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -