ata_eh_decide_disposition(9)
π ata_eh_decide_disposition β¨
okay so bestie, we're deep in the Kernel API Manual, section 9, and this one lives in ./drivers/ata because of course it does π«Ά
πΈ NAME πΈ
ata_eh_decide_disposition β literally decides the disposition of a qc based on sense data π
β¨ SYNOPSIS β¨
enum scsi_disposition ata_eh_decide_disposition (struct ata_queued_cmd
*qc );
π ARGUMENTS π
qcβ the qc we're examining π that's it, that's the whole argument list
π¦ DESCRIPTION π¦
okay so picture this, bestie π§ for a regular SCSI command, the SCSI completion callback (scsi_done) calls scsi_complete, which calls scsi_decide_disposition, which calls scsi_check_sense. and then scsi_complete finally calls scsi_finish_command. it's giving a whole relay race πββοΈπ¨
and that's totally fine for SCSI, because any eventual sense data is usually returned in the completion itself β without ever invoking SCSI EH. no cap β
BUT π for a QC, we always need to fetch the sense data explicitly using SCSI EH. always always. no shortcuts.
meanwhile, a command that's completed via SCSI EH gets completed a different way β using scsi_eh_flush_done_q, which calls scsi_finish_command directly, without ever calling scsi_check_sense. so that check literally never happens on that path π
so for a command that went through SCSI EH, it is the responsibility of the SCSI EH strategy handler to call scsi_decide_disposition β see e.g. how scsi_eh_get_sense calls scsi_decide_disposition for SCSI LLDDs that do not get the sense data as part of the completion. main character energy, honestly π
so yeah β for QC commands that went via SCSI EH, we need to callscsi_check_senseourselves, similar to howscsi_eh_get_sensecallsscsi_decide_disposition, which callsscsi_check_sense, in order to set the correct SCSI ML byte (if any). that's the whole vibe check right there β
LOCKING: EH context. periodt π
π RETURN π
one of these four, bestie:
SUCCESSFAILEDNEEDS_RETRYADD_TO_MLQUEUE
π SEE ALSO π
Kernel file ./drivers/ata/libata-eh.c, plus the whole squad π₯:
__ata_ehi_push_desc(9), ata_ehi_push_desc(9), ata_ehi_clear_desc(9), ata_port_desc(9), ata_port_pbar_desc(9), ata_internal_cmd_timeout(9), ata_internal_cmd_timed_out(9), ata_eh_acquire(9), ata_eh_release(9), ata_scsi_error(9), ata_scsi_cmd_error_handler(9), ata_scsi_port_error_handler(9), ata_port_wait_eh(9), ata_eh_set_pending(9), ata_qc_schedule_eh(9), ata_std_sched_eh(9), ata_std_end_eh(9), ata_port_schedule_eh(9), ata_link_abort(9), ata_port_abort(9), __ata_port_freeze(9), ata_port_freeze(9), ata_eh_freeze_port(9), ata_eh_thaw_port(9), ata_eh_qc_complete(9), ata_eh_qc_retry(9), ata_dev_disable(9), ata_eh_detach_dev(9), ata_eh_about_to_do(9), ata_eh_done(9), ata_err_string(9), atapi_eh_tur(9), ata_eh_request_sense(9), atapi_eh_request_sense(9), ata_eh_analyze_serror(9), ata_eh_analyze_tf(9), ata_eh_speed_down_verdict(9), ata_eh_speed_down(9), ata_eh_worth_retry(9), ata_eh_quiet(9), ata_eh_link_set_lpm(9), ata_eh_link_autopsy(9), ata_eh_autopsy(9), ata_get_cmd_name(9), ata_eh_link_report(9), ata_eh_report(9), ata_eh_set_mode(9), atapi_eh_clear_ua(9), ata_eh_maybe_retry_flush(9), ata_eh_recover(9), ata_eh_finish(9), ata_std_error_handler(9), ata_eh_handle_port_suspend(9), ata_eh_handle_port_resume(9)
and that's the whole page, bestie π tysm for reading, this came from ./drivers/ata and is dated October 2026 β catch you in the next manpage, mwah ππ
β¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms