diff options
author | Xin LI <delphij@FreeBSD.org> | 2011-11-03 22:13:21 +0000 |
---|---|---|
committer | Xin LI <delphij@FreeBSD.org> | 2011-11-03 22:13:21 +0000 |
commit | c3e2dd8fa2a9f6f35415c730902f05c1defb785d (patch) | |
tree | 7d3b098ebe6d7ab2fdafd2de2b402012428acaee | |
parent | 1fa70883c38da58997b3f31026889cd635fb8ac0 (diff) |
Notes
-rw-r--r-- | sysutils/smartmontools/Makefile | 1 | ||||
-rw-r--r-- | sysutils/smartmontools/files/patch-freebsd9 | 13 | ||||
-rw-r--r-- | sysutils/smartmontools/files/patch-lsibugs | 44 |
3 files changed, 58 insertions, 0 deletions
diff --git a/sysutils/smartmontools/Makefile b/sysutils/smartmontools/Makefile index 6622eb116de5..c92939322cff 100644 --- a/sysutils/smartmontools/Makefile +++ b/sysutils/smartmontools/Makefile @@ -7,6 +7,7 @@ PORTNAME= smartmontools PORTVERSION= 5.42 +PORTREVISION= 1 CATEGORIES= sysutils MASTER_SITES= SF diff --git a/sysutils/smartmontools/files/patch-freebsd9 b/sysutils/smartmontools/files/patch-freebsd9 new file mode 100644 index 000000000000..c34f077cd6cd --- /dev/null +++ b/sysutils/smartmontools/files/patch-freebsd9 @@ -0,0 +1,13 @@ +--- os_freebsd.cpp 2011/11/03 17:50:35 3466 ++++ os_freebsd.cpp 2011/11/03 20:06:19 3468 +@@ -1058,8 +1058,8 @@ + } + + if (iop->sensep) { +- memcpy(iop->sensep,&(ccb->csio.sense_data),sizeof(struct scsi_sense_data)); +- iop->resp_sense_len = sizeof(struct scsi_sense_data); ++ iop->resp_sense_len = ccb->csio.sense_len - ccb->csio.sense_resid; ++ memcpy(iop->sensep,&(ccb->csio.sense_data),iop->resp_sense_len); + } + + iop->scsi_status = ccb->csio.scsi_status; diff --git a/sysutils/smartmontools/files/patch-lsibugs b/sysutils/smartmontools/files/patch-lsibugs new file mode 100644 index 000000000000..60f7988291e3 --- /dev/null +++ b/sysutils/smartmontools/files/patch-lsibugs @@ -0,0 +1,44 @@ +--- os_freebsd.cpp 2011/10/06 16:43:44 3423 ++++ os_freebsd.cpp 2011/11/03 17:50:35 3466 +@@ -1013,6 +1013,20 @@ + warnx("error allocating ccb"); + return -ENOMEM; + } ++ // mfi SAT layer is known to be buggy ++ if(!strcmp("mfi",m_camdev->sim_name)) { ++ if (iop->cmnd[0] == SAT_ATA_PASSTHROUGH_12 || iop->cmnd[0] == SAT_ATA_PASSTHROUGH_16) { ++ // Controller does not return ATA output registers in SAT sense data ++ if (iop->cmnd[2] & (1 << 5)) // chk_cond ++ return set_err(ENOSYS, "ATA return descriptor not supported by controller firmware"); ++ } ++ // SMART WRITE LOG SECTOR causing media errors ++ if ((iop->cmnd[0] == SAT_ATA_PASSTHROUGH_16 && iop->cmnd[14] == ATA_SMART_CMD ++ && iop->cmnd[3]==0 && iop->cmnd[4] == ATA_SMART_WRITE_LOG_SECTOR) || ++ (iop->cmnd[0] == SAT_ATA_PASSTHROUGH_12 && iop->cmnd[9] == ATA_SMART_CMD && ++ iop->cmnd[3] == ATA_SMART_WRITE_LOG_SECTOR)) ++ return set_err(ENOSYS, "SMART WRITE LOG SECTOR command is not supported by controller firmware"); ++ } + + // clear out structure, except for header that was filled in for us + bzero(&(&ccb->ccb_h)[1], +@@ -1590,12 +1604,18 @@ + return this; + } + +- // SAT or USB ? ++ // SAT or USB, skip MFI controllers because of bugs + { + smart_device * newdev = smi()->autodetect_sat_device(this, req_buff, len); +- if (newdev) ++ if (newdev) { + // NOTE: 'this' is now owned by '*newdev' ++ if(!strcmp("mfi",m_camdev->sim_name)) { ++ newdev->close(); ++ newdev->set_err(ENOSYS, "SATA device detected,\n" ++ "MegaRAID SAT layer is reportedly buggy, use '-d sat' to try anyhow"); ++ } + return newdev; ++ } + } + + // Nothing special found
\ No newline at end of file |