diff --git a/sm5/CHANGELOG b/sm5/CHANGELOG index 59bf5e8bf423cfed9f799e877ff645297c922eee..4972d691f48f65f725002ac1a8f7e7e5c331d2b0 100644 --- a/sm5/CHANGELOG +++ b/sm5/CHANGELOG @@ -1,6 +1,6 @@ CHANGELOG for smartmontools -$Id: CHANGELOG,v 1.16 2002/10/23 14:35:42 ballen4705 Exp $ +$Id: CHANGELOG,v 1.17 2002/10/24 07:50:45 ballen4705 Exp $ Copyright (C) 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net> @@ -29,6 +29,8 @@ NOTES FOR NEXT RELEASE: smartmontools-5.0-11 + Changed name of -p (print version) option to -V + Minor change in philosophy: if a SMART command fails or the device appears incapable of a SMART command that the user has asked for, complain by printing an error message, but go ahead and try diff --git a/sm5/Makefile b/sm5/Makefile index ae1a2281d846d9ff4d44f7ec36091ca56b386fcf..994316e08a71c853c38c50a8267dfe0da48ef682 100644 --- a/sm5/Makefile +++ b/sm5/Makefile @@ -2,7 +2,7 @@ # # Home page: http://smartmontools.sourceforge.net # -# $Id: Makefile,v 1.20 2002/10/22 08:43:22 ballen4705 Exp $ +# $Id: Makefile,v 1.21 2002/10/24 07:50:45 ballen4705 Exp $ # # Copyright (C) 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net> # @@ -99,5 +99,5 @@ release: $(releasefiles) mv /usr/src/redhat/SRPMS/$(pkgname)*rpm . rm -f /usr/src/redhat/SOURCES/$(pkgname).tar.gz . cvs-script && cvs commit -m "release $(counter)" - . cvs-script && cvs tag "RELEASE_5_0_$(counter)" + . cvs-script && cvs tag -d "RELEASE_5_0_$(counter)" && cvs tag "RELEASE_5_0_$(counter)" echo `hostname` | grep -q ballen && echo $(newcounter) > VERSION diff --git a/sm5/README b/sm5/README index 711a3ccacea74118de7bf55aa950140bc23ca1b2..2694b6c4e92810f6c78bfb41efa962f97d4052b0 100644 --- a/sm5/README +++ b/sm5/README @@ -100,7 +100,7 @@ to run smartctl, use the syntax See the man page for full details. A summary of the options is: Read only: -p Print License/Copyright information. +V Print License/Copyright information. i Checks if the device supports S.M.A.R.T, and prints drive model information. c Checks if device has any S.M.A.R.T. Warranty Failures. This means @@ -150,8 +150,7 @@ for SCSI the devices are usually Examples: smartctl -e /dev/hda - enables SMART on hard drive smartctl -c /dev/sda - checks status of hard drive. - smartd - starts background daemon to - monitor hard drive status + smartd will scan for all devices that support SMART and poll them very thirty minutes for errors or for changes in attribute values. When an @@ -159,6 +158,10 @@ error or attribute value change occurs, it sends log information to the SYSLOG facility. Typically these messages and warnings appear in /var/log/messages. +smartd - starts background daemon to + monitor hard drive status +You can read about the options using man smartd. + == REFERENCES == If you need help in understanding the output of smartctl, a good place @@ -185,4 +188,4 @@ Fax: (408) 867-2115 E-Mail: 250-1752@mcimail.com. -$Id: README,v 1.8 2002/10/23 12:24:23 ballen4705 Exp $ +$Id: README,v 1.9 2002/10/24 07:50:45 ballen4705 Exp $ diff --git a/sm5/TODO b/sm5/TODO index 5a4c8869ffa9bfb38f0b243203c64c59694566f6..6a5464433abe28cee25e3936885755bba0350fd2 100644 --- a/sm5/TODO +++ b/sm5/TODO @@ -4,7 +4,7 @@ Home page of code is: http://smartmontools.sourceforge.net Copyright (C) 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net> -$Id: TODO,v 1.10 2002/10/23 15:19:55 ballen4705 Exp $ +$Id: TODO,v 1.11 2002/10/24 07:50:45 ballen4705 Exp $ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -34,6 +34,10 @@ Produce version for ATA/ATAPI-7 Modifications ------------- +Change input command line from using current command line format +(getopt) to getopt_long() for long input options. This will be +helpful in adding device specific options. + Command line option to specify devices to look for in smartd startup Print flags meanings in Vendor Attribute list -- not hex value -- diff --git a/sm5/ataprint.c b/sm5/ataprint.c index 3555732f2416e94edf2a32d61f96f46647474e46..af86a6b77e506174db2edce98b47cf0de97c541b 100644 --- a/sm5/ataprint.c +++ b/sm5/ataprint.c @@ -28,7 +28,7 @@ #include "smartctl.h" #include "extern.h" -const char *CVSid4="$Id: ataprint.c,v 1.30 2002/10/23 20:36:59 ballen4705 Exp $" +const char *CVSid4="$Id: ataprint.c,v 1.31 2002/10/24 07:50:45 ballen4705 Exp $" CVSID2 CVSID3 CVSID6; // Function for printing ASCII byte-swapped strings, skipping white @@ -940,7 +940,7 @@ int ataPrintMain (int fd){ smartautoofflineenable || smartautoofflinedisable) pout("\n"); - // START OF READ-ONLY OPTIONS APART FROM -p and -i + // START OF READ-ONLY OPTIONS APART FROM -V and -i if (checksmart || generalsmartvalues || smartvendorattrib || smarterrorlog || smartselftestlog) pout("=== START OF READ SMART DATA SECTION ===\n"); @@ -954,8 +954,13 @@ int ataPrintMain (int fd){ if (ataCheckSmart(smartval, smartthres,1)){ QUIETON; returnval|=FAILATTR; - pout("Failed Attributes:\n"); - PrintSmartAttribWithThres(smartval, smartthres,1); + if (smartvendorattrib) + pout("See vendor-specific Attribute list for failed Attributes.\n\n"); + else + { + pout("Failed Attributes:\n"); + PrintSmartAttribWithThres(smartval, smartthres,1); + } } else pout("No failed Attributes found.\n\n"); @@ -966,8 +971,12 @@ int ataPrintMain (int fd){ pout("SMART overall-health self-assessment test result: PASSED\n"); if (ataCheckSmart(smartval, smartthres,0)){ QUIETON; - pout("Please note the following marginal attributes:\n"); - PrintSmartAttribWithThres(smartval, smartthres,2); + if (smartvendorattrib) + pout("See vendor-specific Attribute list for marginal Attributes.\n\n"); + else { + pout("Please note the following marginal attributes:\n"); + PrintSmartAttribWithThres(smartval, smartthres,2); + } returnval|=FAILAGE; } else diff --git a/sm5/ataprint.cpp b/sm5/ataprint.cpp index acf26c5bbc43b5e9e9843e5257d1b16fa7955f24..358b15d53f80949bc516243faf74d778ebdde902 100644 --- a/sm5/ataprint.cpp +++ b/sm5/ataprint.cpp @@ -28,7 +28,7 @@ #include "smartctl.h" #include "extern.h" -const char *CVSid4="$Id: ataprint.cpp,v 1.30 2002/10/23 20:36:59 ballen4705 Exp $" +const char *CVSid4="$Id: ataprint.cpp,v 1.31 2002/10/24 07:50:45 ballen4705 Exp $" CVSID2 CVSID3 CVSID6; // Function for printing ASCII byte-swapped strings, skipping white @@ -940,7 +940,7 @@ int ataPrintMain (int fd){ smartautoofflineenable || smartautoofflinedisable) pout("\n"); - // START OF READ-ONLY OPTIONS APART FROM -p and -i + // START OF READ-ONLY OPTIONS APART FROM -V and -i if (checksmart || generalsmartvalues || smartvendorattrib || smarterrorlog || smartselftestlog) pout("=== START OF READ SMART DATA SECTION ===\n"); @@ -954,8 +954,13 @@ int ataPrintMain (int fd){ if (ataCheckSmart(smartval, smartthres,1)){ QUIETON; returnval|=FAILATTR; - pout("Failed Attributes:\n"); - PrintSmartAttribWithThres(smartval, smartthres,1); + if (smartvendorattrib) + pout("See vendor-specific Attribute list for failed Attributes.\n\n"); + else + { + pout("Failed Attributes:\n"); + PrintSmartAttribWithThres(smartval, smartthres,1); + } } else pout("No failed Attributes found.\n\n"); @@ -966,8 +971,12 @@ int ataPrintMain (int fd){ pout("SMART overall-health self-assessment test result: PASSED\n"); if (ataCheckSmart(smartval, smartthres,0)){ QUIETON; - pout("Please note the following marginal attributes:\n"); - PrintSmartAttribWithThres(smartval, smartthres,2); + if (smartvendorattrib) + pout("See vendor-specific Attribute list for marginal Attributes.\n\n"); + else { + pout("Please note the following marginal attributes:\n"); + PrintSmartAttribWithThres(smartval, smartthres,2); + } returnval|=FAILAGE; } else diff --git a/sm5/smartctl.8 b/sm5/smartctl.8 index a5ae46a5f6a2e62350aee6501b0274e5fab38b5b..eeb22914a65a3ee73f9222e34ae43d96caab59a3 100644 --- a/sm5/smartctl.8 +++ b/sm5/smartctl.8 @@ -1,6 +1,6 @@ \# Copyright (C) 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net> \# -\# $Id: smartctl.8,v 1.16 2002/10/23 15:15:43 ballen4705 Exp $ +\# $Id: smartctl.8,v 1.17 2002/10/24 07:50:45 ballen4705 Exp $ \# \# This program is free software; you can redistribute it and/or modify it \# under the terms of the GNU General Public License as published by the Free @@ -15,11 +15,11 @@ \# at the Concurrent Systems Laboratory (now part of the Storage Systems \# Research Center), Jack Baskin School of Engineering, University of \# California, Santa Cruz. http://ssrc.soe.ucsc.edu/ -.TH SMARTCTL 8 "$Date: 2002/10/23 15:15:43 $" "smartmontools-5.0" +.TH SMARTCTL 8 "$Date: 2002/10/24 07:50:45 $" "smartmontools-5.0" .SH NAME smartctl \- S.M.A.R.T. control utility .SH SYNOPSIS -.B smartctl \-[piqQaedtTfFcgvlLm[O|S|s|X|x|A]] device +.B smartctl \-[ViqQaedtTfFcgvlLm[O|S|s|X|x|A]] device .SH DESCRIPTION .B smartctl @@ -72,11 +72,11 @@ DATA, RUN/ABORT TESTS. .TP .B SHOW INFORMATION: .TP -.B p -Print: Prints version, Copyright, License, home page and CVS-id +.B V +Version: Prints version, Copyright, License, home page and CVS-id information for your copy of .B smartctl. -Please include the CVS and version information if you are reporting +Please include this information if you are reporting bugs or problems. .TP .B i @@ -86,12 +86,11 @@ Says if the device supports S.M.A.R.T., and if so, whether S.M.A.R.T. support is currently enabled or disabled. .TP .B q -Quiet mode: Only print: For the '\-l' option, -errors recorded in the SMART error log; For the '\-L' option, -errors recorded in the device self-test log; For the '\-c' -SMART "disk failing" status or device attributes -(pre-failure or usage) which failed either now or -in the past; For the '\-v' option device attributes (pre-failure or usage) +Quiet mode: Only print: For the '\-l' option, errors recorded in the +SMART error log; For the '\-L' option, errors recorded in the device +self-test log; For the '\-c' SMART "disk failing" status or device +attributes (pre-failure or usage) which failed either now or in the +past; For the '\-v' option device attributes (pre-failure or usage) which failed either now or in the past. .TP .B Q @@ -441,4 +440,4 @@ Please let us know if there is an on\-line source for this document. .SH CVS ID OF THIS PAGE: -$Id: smartctl.8,v 1.16 2002/10/23 15:15:43 ballen4705 Exp $ +$Id: smartctl.8,v 1.17 2002/10/24 07:50:45 ballen4705 Exp $ diff --git a/sm5/smartctl.h b/sm5/smartctl.h index cf815644e7ae002199151f1f8aabd144de61653e..188c1db7ff91b007c4010c2481ca3cfd97e08479 100644 --- a/sm5/smartctl.h +++ b/sm5/smartctl.h @@ -26,7 +26,7 @@ #define __SMARTCTL_H_ #ifndef CVSID6 -#define CVSID6 "$Id: smartctl.h,v 1.9 2002/10/23 12:24:24 ballen4705 Exp $\n" +#define CVSID6 "$Id: smartctl.h,v 1.10 2002/10/24 07:50:45 ballen4705 Exp $\n" #endif /* Defines for command line options */ @@ -49,7 +49,7 @@ #define SMARTAUTOOFFLINEDISABLE 'T' #define SMARTAUTOSAVEENABLE 'f' #define SMARTAUTOSAVEDISABLE 'F' -#define PRINTCOPYLEFT 'p' +#define PRINTCOPYLEFT 'V' #define SMART009MINUTES 'm' #define QUIETMODE 'q' #define VERYQUIETMODE 'Q' diff --git a/sm5/smartd.8 b/sm5/smartd.8 index 5fa159ac9c3102fa1438898900e72d3ff1948898..5bb6c5b6667462e3bdac9ecf06ecd0e69213c3c2 100644 --- a/sm5/smartd.8 +++ b/sm5/smartd.8 @@ -13,12 +13,12 @@ \# at the Concurrent Systems Laboratory (now part of the Storage Systems \# Research Center), Jack Baskin School of Engineering, University of \# California, Santa Cruz. http://ssrc.soe.ucsc.edu/ -.TH SMARTD 8 "$Date: 2002/10/14 15:26:30 $" "smartmontools-5.0" +.TH SMARTD 8 "$Date: 2002/10/24 07:50:45 $" "smartmontools-5.0" .SH NAME smartd \- S.M.A.R.T. Daemon .SH SYNOPSIS .B smartd -[\-pX\] +[\-VX\] .SH DESCRIPTION .B smartd @@ -61,11 +61,11 @@ messages are harmless.] OPTIONS .TP p -Prints license, copyright, and version information onto STDOUT or into the SYSLOG -log (normally /var/log/messages) and then exits. +Version: Prints license, copyright, and CVS version information onto STDOUT or into the SYSLOG +log (normally /var/log/messages) and then exits. Please include this information if you are reporting bugs. .TP X -Runs smartd in "debug" mode. In this mode, it does not fork and +eXamine: Runs smartd in "debug" mode. In this mode, it does not fork and displays status information to STDOUT. @@ -178,4 +178,4 @@ Please let us know if there is an on\-line source for this document. .SH CVS ID OF THIS PAGE: -$Id: smartd.8,v 1.7 2002/10/14 15:26:30 ballen4705 Exp $ +$Id: smartd.8,v 1.8 2002/10/24 07:50:45 ballen4705 Exp $ diff --git a/sm5/smartd.c b/sm5/smartd.c index b0498622b1acfb5561b0a0c004d990ebd706772c..4ef4577c1e549e8206ecdea411e415bdfe596cc3 100644 --- a/sm5/smartd.c +++ b/sm5/smartd.c @@ -36,7 +36,7 @@ #include "smartd.h" extern const char *CVSid1, *CVSid2; -const char *CVSid3="$Id: smartd.c,v 1.15 2002/10/23 20:36:59 ballen4705 Exp $" +const char *CVSid3="$Id: smartd.c,v 1.16 2002/10/24 07:50:45 ballen4705 Exp $" CVSID1 CVSID4 CVSID7; int daemon_init(void){ @@ -86,14 +86,19 @@ void pout(char *fmt, ...){ } -/* prints help information for command syntax */ -void Usage ( void){ - printout(LOG_INFO,"smartd version %d.%d-%d - S.M.A.R.T. Daemon\n", +void printhead(){ + printout(LOG_INFO,"smartd version %d.%d-%d - S.M.A.R.T. Daemon\n" + "Home page is http://smartmontools.sourceforge.net\n\n", RELEASE_MAJOR, RELEASE_MINOR,SMARTMONTOOLS_VERSION); - printout(LOG_INFO,"usage: smartd -[opts] \n"); - printout(LOG_INFO,"Read Only Commands:\n"); - printout(LOG_INFO,"\t\t%c\t\tStart smartd in debug Mode\n",DEBUGMODE); - printout(LOG_INFO,"\t\t%c\t\tPrint License and Copyright information\n",PRINTCOPYLEFT); +} + +/* prints help information for command syntax */ +void Usage (void){ + printhead(); + printout(LOG_INFO,"usage: smartd -[opts] \n\n"); + printout(LOG_INFO,"Read Only Options:\n"); + printout(LOG_INFO," %c Start smartd in debug Mode\n",DEBUGMODE); + printout(LOG_INFO," %c Print License, Copyright, and version information\n",PRINTCOPYLEFT); } // scan to see what ata devices there are, and if they support SMART @@ -354,9 +359,7 @@ void printone(const char *cvsid){ return; } - char copyleftstring[]= -"Home page of smartd is " PROJECTHOME "\n\n" "smartd comes with ABSOLUTELY NO WARRANTY. This\n" "is free software, and you are welcome to redistribute it\n" "under the terms of the GNU General Public License Version 2.\n" @@ -393,6 +396,7 @@ int main (int argc, char **argv){ case '?': default: debugmode=1; + printout(LOG_INFO,"\n"); Usage(); exit(-1); } @@ -400,8 +404,7 @@ int main (int argc, char **argv){ if (printcopyleft){ debugmode=1; - printout(LOG_INFO,"smartd version %d.%d-%d Copyright (C) Bruce Allen 2002\n", - RELEASE_MAJOR,RELEASE_MINOR,SMARTMONTOOLS_VERSION); + printhead(); printout(LOG_INFO,copyleftstring); printout(LOG_INFO,"CVS version IDs of files used to build this code are:\n"); printone(CVSid3); @@ -410,8 +413,7 @@ int main (int argc, char **argv){ exit(0); } - printout(LOG_INFO,"smartd version %d.%d-%d Copyright (C) Bruce Allen 2002\n", - RELEASE_MAJOR,RELEASE_MINOR,SMARTMONTOOLS_VERSION); + printhead(); if (!debugmode){ daemon_init(); diff --git a/sm5/smartd.cpp b/sm5/smartd.cpp index a4080846a8982c767df8fb66672d6b04d119db05..2b23965f1c1fac7fd040d91e08f9165c34bc47cc 100644 --- a/sm5/smartd.cpp +++ b/sm5/smartd.cpp @@ -36,7 +36,7 @@ #include "smartd.h" extern const char *CVSid1, *CVSid2; -const char *CVSid3="$Id: smartd.cpp,v 1.15 2002/10/23 20:36:59 ballen4705 Exp $" +const char *CVSid3="$Id: smartd.cpp,v 1.16 2002/10/24 07:50:45 ballen4705 Exp $" CVSID1 CVSID4 CVSID7; int daemon_init(void){ @@ -86,14 +86,19 @@ void pout(char *fmt, ...){ } -/* prints help information for command syntax */ -void Usage ( void){ - printout(LOG_INFO,"smartd version %d.%d-%d - S.M.A.R.T. Daemon\n", +void printhead(){ + printout(LOG_INFO,"smartd version %d.%d-%d - S.M.A.R.T. Daemon\n" + "Home page is http://smartmontools.sourceforge.net\n\n", RELEASE_MAJOR, RELEASE_MINOR,SMARTMONTOOLS_VERSION); - printout(LOG_INFO,"usage: smartd -[opts] \n"); - printout(LOG_INFO,"Read Only Commands:\n"); - printout(LOG_INFO,"\t\t%c\t\tStart smartd in debug Mode\n",DEBUGMODE); - printout(LOG_INFO,"\t\t%c\t\tPrint License and Copyright information\n",PRINTCOPYLEFT); +} + +/* prints help information for command syntax */ +void Usage (void){ + printhead(); + printout(LOG_INFO,"usage: smartd -[opts] \n\n"); + printout(LOG_INFO,"Read Only Options:\n"); + printout(LOG_INFO," %c Start smartd in debug Mode\n",DEBUGMODE); + printout(LOG_INFO," %c Print License, Copyright, and version information\n",PRINTCOPYLEFT); } // scan to see what ata devices there are, and if they support SMART @@ -354,9 +359,7 @@ void printone(const char *cvsid){ return; } - char copyleftstring[]= -"Home page of smartd is " PROJECTHOME "\n\n" "smartd comes with ABSOLUTELY NO WARRANTY. This\n" "is free software, and you are welcome to redistribute it\n" "under the terms of the GNU General Public License Version 2.\n" @@ -393,6 +396,7 @@ int main (int argc, char **argv){ case '?': default: debugmode=1; + printout(LOG_INFO,"\n"); Usage(); exit(-1); } @@ -400,8 +404,7 @@ int main (int argc, char **argv){ if (printcopyleft){ debugmode=1; - printout(LOG_INFO,"smartd version %d.%d-%d Copyright (C) Bruce Allen 2002\n", - RELEASE_MAJOR,RELEASE_MINOR,SMARTMONTOOLS_VERSION); + printhead(); printout(LOG_INFO,copyleftstring); printout(LOG_INFO,"CVS version IDs of files used to build this code are:\n"); printone(CVSid3); @@ -410,8 +413,7 @@ int main (int argc, char **argv){ exit(0); } - printout(LOG_INFO,"smartd version %d.%d-%d Copyright (C) Bruce Allen 2002\n", - RELEASE_MAJOR,RELEASE_MINOR,SMARTMONTOOLS_VERSION); + printhead(); if (!debugmode){ daemon_init(); diff --git a/sm5/smartd.h b/sm5/smartd.h index 40eeb79c66da0f7f4f24b59c491e4f104c8e4351..0e6c13577e6b31a7631506986d42ac4b0b7a5ebc 100644 --- a/sm5/smartd.h +++ b/sm5/smartd.h @@ -23,13 +23,13 @@ */ #ifndef CVSID7 -#define CVSID7 "$Id: smartd.h,v 1.6 2002/10/22 09:44:55 ballen4705 Exp $\n" +#define CVSID7 "$Id: smartd.h,v 1.7 2002/10/24 07:50:45 ballen4705 Exp $\n" #endif /* Defines for command line options */ #define DEBUGMODE 'X' #define EMAILNOTIFICATION 'e' -#define PRINTCOPYLEFT 'p' +#define PRINTCOPYLEFT 'V' /* Boolean Values */ #define TRUE 0x01 diff --git a/sm5/smartmontools.spec b/sm5/smartmontools.spec index 06212412444107358c3b0928145735fd3230749d..8c382839a6e48a7126637f0a1d71ec351ed5f2b0 100644 --- a/sm5/smartmontools.spec +++ b/sm5/smartmontools.spec @@ -101,6 +101,101 @@ fi %define date %(echo `LC_ALL="C" date +"%a %b %d %Y"`) %changelog +* Thu Oct 24 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net> +- Changed name of -p (print version) option to -V +- Minor change in philosophy: if a SMART command fails or the device + appears incapable of a SMART command that the user has asked for, + complain by printing an error message, but go ahead and try + anyway. Since unimplemented SMART commands should just return an + error but not cause disk problems, this should't cause any + difficulty. +- Added two new flags: q and Q. q is quiet mode - only print: For + the -l option, errors recorded in the SMART error log; For the -L + option, errors recorded in the device self-test log; For the -c + SMART "disk failing" status or device attributes (pre-failure or + usage) which failed either now or in the past; For the -v option + device attributes (pre-failure or usage) which failed either now + or in the past. Q is Very Quiet mode: Print no ouput. The only + way to learn about what was found is to use the exit status of + smartctl. +- smartctl now returns sensible values (bitmask). See smartctl.h + for the values, and the man page for documentation. +- The SMART status check now uses the correct ATA call. If failure + is detected we search through attributes to list the failed ones. + If the SMART status check shows GOOD, we then look to see if their + are any usage attributes or prefail attributes have failed at any + time. If so we print them. +- Modified function that prints vendor attributes to say if the + attribute has currently failed or has ever failed. +- -p option now prints out license info and CVS strings for all + modules in the code, nicely formatted. +- Previous versions of this code (and Smartsuite) only generate + SMART failure errors if the value of an attribute is below the + threshold and the prefailure bit is set. However the ATA Spec + (ATA4 <=Rev 4) says that it is a SMART failure if the value of an + attribute is LESS THAN OR EQUAL to the threshold and the + prefailure bit is set. This is now fixed in both smartctl and + smartd. Note that this is a troubled subject -- the original + SFF 8035i specification defining SMART was inconsistent about + this. One section says that Attribute==Threshold is pass, + and another section says it is fail. However the ATA specs are + consistent and say Attribute==Threshold is a fail. +- smartd did not print the correct value of any failing SMART attribute. It + printed the index in the attribute table, not the attribute + ID. This is fixed. +- when starting self-tests in captive mode ioctl returns EIO because + the drive has been busied out. Detect this and don't return an eror + in this case. Check this this is correct (or how to fix it?) + - fixed possible error in how to determine ATA standard support + for devices with no ATA minor revision number. +- device opened only in read-only not read-write mode. Don't need R/W + access to get smart data. Check this with Andre. +- smartctl now handles all possible choices of "multiple options" + gracefully. It goes through the following phases of operation, + in order: INFORMATION, ENABLE/DISABLE, DISPLAY DATA, RUN/ABORT TESTS. + Documentation has bee updated to explain the different phases of + operation. Control flow through ataPrintMain() + simplified. +- If reading device identity information fails, try seeing if the info + can be accessed using a "DEVICE PACKET" command. This way we can + at least get device info. +- Modified Makefile to automatically tag CVS archive on issuance of + a release +- Modified drive detection so minor device ID code showing ATA-3 rev + 0 (no SMART) is known to not be SMART capable. +- Now verify the checksum of the device ID data structure, and of the + attributes threshold structure. Before neither of these + structures had their checksums verified. +- New behavior vis-a-vis checksums. If they are wrong, we log + warning messages to stdout, stderr, and syslog, but carry on + anyway. All functions now call a checksumwarning routine if the + checksum doesn't vanish as it should. +- Changed Read Hard Disk Identity function to get fresh info from + the disk on each call rather than to use the values that were read + upon boot-up into the BIOS. This is the biggest change in this + release. The ioctl(device, HDIO_GET_IDENTITY, buf ) call should + be avoided in such code. Note that if people get garbled strings + for the model, serial no and firmware versions of their drives, + then blame goes here (the BIOS does the byte swapping for you, + apparently!) +- Function ataSmartSupport now looks at correct bits in drive + identity structure to verify first that these bits are valid, + before using them. +- Function ataIsSmartEnabled() written which uses the Drive ID state + information to tell if SMART is enabled or not. We'll carry this + along for the moment without using it. +- Function ataDoesSmartWork() guaranteed to work if the device + supports SMART. +- Replace some numbers by #define MACROS +- Wrote Function TestTime to return test time associated with each + different type of test. +- Thinking of the future, have added a new function called + ataSmartStatus2(). Eventually when I understand how to use the + TASKFILE API and am sure that this works correctly, it will + replace ataSmartStatus(). This queries the drive directly to + see if the SMART status is OK, rather than comparing thresholds to + attribute values ourselves. But I need to get some drives that fail + their SMART status to check it. * Thu Oct 17 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net> - Removed extraneous space before some error message printing. - Fixed some character buffers that were too short for contents.