Commit 1d0e6636 authored by HardenedBSD Sync Service's avatar HardenedBSD Sync Service
Browse files

Merge remote-tracking branch 'freebsd/stable/12' into hardened/12-stable/master

parents 739b18b1 e265658e
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# #
# PROVIDE: ctld # PROVIDE: ctld
# REQUIRE: FILESYSTEMS # REQUIRE: FILESYSTEMS NETWORKING
# BEFORE: DAEMON # BEFORE: DAEMON
# KEYWORD: nojail # KEYWORD: nojail
......
...@@ -3489,6 +3489,7 @@ adaspindown(uint8_t cmd, int flags) ...@@ -3489,6 +3489,7 @@ adaspindown(uint8_t cmd, int flags)
struct ada_softc *softc; struct ada_softc *softc;
struct ccb_ataio local_ccb; struct ccb_ataio local_ccb;
int error; int error;
int mode;
CAM_PERIPH_FOREACH(periph, &adadriver) { CAM_PERIPH_FOREACH(periph, &adadriver) {
/* If we paniced with lock held - not recurse here. */ /* If we paniced with lock held - not recurse here. */
...@@ -3504,6 +3505,52 @@ adaspindown(uint8_t cmd, int flags) ...@@ -3504,6 +3505,52 @@ adaspindown(uint8_t cmd, int flags)
continue; continue;
} }
/*
* Additionally check if we would spin up the drive instead of
* spinning it down.
*/
if (cmd == ATA_IDLE_IMMEDIATE) {
memset(&local_ccb, 0, sizeof(local_ccb));
xpt_setup_ccb(&local_ccb.ccb_h, periph->path,
CAM_PRIORITY_NORMAL);
local_ccb.ccb_h.ccb_state = ADA_CCB_DUMP;
cam_fill_ataio(&local_ccb, 0, NULL, CAM_DIR_NONE,
0, NULL, 0, ada_default_timeout * 1000);
ata_28bit_cmd(&local_ccb, ATA_CHECK_POWER_MODE,
0, 0, 0);
local_ccb.cmd.flags |= CAM_ATAIO_NEEDRESULT;
error = cam_periph_runccb((union ccb *)&local_ccb,
adaerror, /*cam_flags*/0,
/*sense_flags*/ SF_NO_RECOVERY | SF_NO_RETRY,
softc->disk->d_devstat);
if (error != 0) {
xpt_print(periph->path,
"Failed to read current power mode\n");
} else {
mode = local_ccb.res.sector_count;
#ifdef DIAGNOSTIC
if (bootverbose) {
xpt_print(periph->path,
"disk power mode 0x%02x\n", mode);
}
#endif
switch (mode) {
case 0x00:
case 0x01:
if (bootverbose) {
xpt_print(periph->path,
"already spun down\n");
}
cam_periph_unlock(periph);
continue;
default:
break;
}
}
}
if (bootverbose) if (bootverbose)
xpt_print(periph->path, "spin-down\n"); xpt_print(periph->path, "spin-down\n");
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment