diff -Naurp ../smartmontools-5.39.regfix/atacmds.cpp ../smartmontools-5.39/atacmds.cpp --- ../smartmontools-5.39.regfix/atacmds.cpp 2010-01-20 15:47:48.099341028 +0100 +++ ../smartmontools-5.39/atacmds.cpp 2010-01-20 16:13:58.380345000 +0100 @@ -2370,13 +2370,17 @@ int ataPrintSmartSelfTestlog(const ata_s uint64_t lba48 = (log->lbafirstfailure < 0xffffffff ? log->lbafirstfailure : 0xffffffffffffULL); // Print entry - bool errorfound = ataPrintSmartSelfTestEntry(testno, - log->selftestnumber, log->selfteststatus, log->timestamp, - lba48, !allentries, noheaderprinted); - - // keep track of time of most recent error - if (errorfound && !hours) - hours=log->timestamp; + if (ataPrintSmartSelfTestEntry(testno, + log->selftestnumber, log->selfteststatus, + log->timestamp, lba48, !allentries, noheaderprinted)) { + + // Self-test showed an error + retval++; + + // keep track of time of most recent error + if (!hours) + hours = log->timestamp; + } } } if (!allentries && retval) diff -Naurp ../smartmontools-5.39.regfix/ataprint.cpp ../smartmontools-5.39/ataprint.cpp --- ../smartmontools-5.39.regfix/ataprint.cpp 2010-01-20 15:47:48.099341028 +0100 +++ ../smartmontools-5.39/ataprint.cpp 2010-01-20 16:12:24.039465040 +0100 @@ -3,8 +3,8 @@ * * Home page of code is: http://smartmontools.sourceforge.net * - * Copyright (C) 2002-9 Bruce Allen - * Copyright (C) 2008-9 Christian Franke + * Copyright (C) 2002-10 Bruce Allen + * Copyright (C) 2008-10 Christian Franke * Copyright (C) 1999-2000 Michael Cornwell * * This program is free software; you can redistribute it and/or modify @@ -2066,7 +2066,6 @@ int ataPrintMain (ata_device * device, c || options.smart_ext_selftest_log || options.sataphy || !options.log_requests.empty() ) { - PRINT_ON(con); if (isGeneralPurposeLoggingCapable(&drive)) pout("General Purpose Logging (GPL) feature set supported\n"); @@ -2087,31 +2086,26 @@ int ataPrintMain (ata_device * device, c // Read SMART Log directory if (need_smart_logdir) { if (ataReadLogDirectory(device, &smartlogdir_buf, false)){ - PRINT_OFF(con); pout("Read SMART Log Directory failed.\n\n"); failuretest(OPTIONAL_CMD, returnval|=FAILSMART); } else smartlogdir = &smartlogdir_buf; } - PRINT_ON(con); // Read GP Log directory if (need_gp_logdir) { if (ataReadLogDirectory(device, &gplogdir_buf, true)){ - PRINT_OFF(con); pout("Read GP Log Directory failed.\n\n"); failuretest(OPTIONAL_CMD, returnval|=FAILSMART); } else gplogdir = &gplogdir_buf; } - PRINT_ON(con); // Print log directories if ((options.gp_logdir && gplogdir) || (options.smart_logdir && smartlogdir)) PrintLogDirectories(gplogdir, smartlogdir); - PRINT_OFF(con); // Print log pages for (i = 0; i < options.log_requests.size(); i++) { diff -Naurp ../smartmontools-5.39.regfix/CHANGELOG ../smartmontools-5.39/CHANGELOG --- ../smartmontools-5.39.regfix/CHANGELOG 2010-01-20 15:47:48.100527305 +0100 +++ ../smartmontools-5.39/CHANGELOG 2010-01-20 16:28:38.174340078 +0100 @@ -45,6 +45,20 @@ NOTES FOR FUTURE RELEASES: see TODO file smartmontools 5.39 2009-12-09 + [CF] Linux: Allow smartd 'DEVICESCAN -d sat' (ticket #13). + Detects (S)ATA devices behind a standard SAT layer + (Vendor ID: "ATA "), but not USB bridges with SAT support. + Only added for backward compatibility with 5.38. + No longer needed as 'DEVICESCAN' without '-d' includes these devices. + + [CF] smartd: Fix directive '-l selftest' (ticket #36) + Regression was introduced with r2773. + + [CF] smartctl: Don't print log directory if '-q errorsonly' is specified. + + [CF] smartctl: Fix option '-q, --quietmode' (ticket #11). + Regression was introduced with r2807. + [CF] do_release: Commit CHANGELOG and NEWS also. Allow to review changes. [CF] Linux: Add workaround for Adaptec series 2, 5 and 5Z controllers diff -Naurp ../smartmontools-5.39.regfix/NEWS ../smartmontools-5.39/NEWS --- ../smartmontools-5.39.regfix/NEWS 2010-01-20 15:47:48.104527238 +0100 +++ ../smartmontools-5.39/NEWS 2010-01-20 16:28:51.388652458 +0100 @@ -8,6 +8,9 @@ http://smartmontools.svn.sourceforge.net Date 2009-12-09 Summary: smartmontools release 5.39 (UNSTABLE/EXPERIMENTAL) ----------------------------------------------------------- +- Fix regression in smartctl option '-q, --quietmode'. +- Fix regression in smartd directive '-l selftest' +- Linux: Allow smartd 'DEVICESCAN -d sat'. - Sourcecode repository moved from CVS to SVN - Support for USB devices with Cypress, JMicron and Sunplus USB bridges - USB device type autodetection for some devices on Linux, Windows and FreeBSD diff -Naurp ../smartmontools-5.39.regfix/os_linux.cpp ../smartmontools-5.39/os_linux.cpp --- ../smartmontools-5.39.regfix/os_linux.cpp 2010-01-20 15:47:48.106527477 +0100 +++ ../smartmontools-5.39/os_linux.cpp 2010-01-20 16:28:19.456339800 +0100 @@ -831,17 +831,22 @@ class linux_scsi_device public /*extends*/ linux_smart_device { public: - linux_scsi_device(smart_interface * intf, const char * dev_name, const char * req_type); + linux_scsi_device(smart_interface * intf, const char * dev_name, + const char * req_type, bool scanning = false); virtual smart_device * autodetect_open(); virtual bool scsi_pass_through(scsi_cmnd_io * iop); + +private: + bool m_scanning; ///< true if created within scan_smart_devices }; linux_scsi_device::linux_scsi_device(smart_interface * intf, - const char * dev_name, const char * req_type) + const char * dev_name, const char * req_type, bool scanning /*= false*/) : smart_device(intf, dev_name, "scsi", req_type), - linux_smart_device(O_RDWR | O_NONBLOCK, O_RDONLY | O_NONBLOCK) + linux_smart_device(O_RDWR | O_NONBLOCK, O_RDONLY | O_NONBLOCK), + m_scanning(scanning) { } @@ -2646,8 +2651,13 @@ smart_device * linux_scsi_device::autode return this; // No Autodetection if device type was specified by user - if (*get_req_type()) - return this; + bool sat_only = false; + if (*get_req_type()) { + // Detect SAT if device object was created by scan_smart_devices(). + if (!(m_scanning && !strcmp(get_req_type(), "sat"))) + return this; + sat_only = true; + } // The code below is based on smartd.cpp:SCSIFilterKnown() @@ -2668,36 +2678,43 @@ smart_device * linux_scsi_device::autode int avail_len = req_buff[4] + 5; int len = (avail_len < req_len ? avail_len : req_len); - if (len < 36) + if (len < 36) { + if (sat_only) { + close(); + set_err(EIO, "INQUIRY too short for SAT"); + } return this; + } // Use INQUIRY to detect type + if (!sat_only) { - // 3ware ? - if (!memcmp(req_buff + 8, "3ware", 5) || !memcmp(req_buff + 8, "AMCC", 4)) { - close(); - set_err(EINVAL, "AMCC/3ware controller, please try adding '-d 3ware,N',\n" - "you may need to replace %s with /dev/twaN or /dev/tweN", get_dev_name()); - return this; - } + // 3ware ? + if (!memcmp(req_buff + 8, "3ware", 5) || !memcmp(req_buff + 8, "AMCC", 4)) { + close(); + set_err(EINVAL, "AMCC/3ware controller, please try adding '-d 3ware,N',\n" + "you may need to replace %s with /dev/twaN or /dev/tweN", get_dev_name()); + return this; + } - // DELL? - if (!memcmp(req_buff + 8, "DELL PERC", 12) || !memcmp(req_buff + 8, "MegaRAID", 8)) { - close(); - set_err(EINVAL, "DELL or MegaRaid controller, please try adding '-d megaraid,N'"); - return this; - } + // DELL? + if (!memcmp(req_buff + 8, "DELL PERC", 12) || !memcmp(req_buff + 8, "MegaRAID", 8)) { + close(); + set_err(EINVAL, "DELL or MegaRaid controller, please try adding '-d megaraid,N'"); + return this; + } - // Marvell ? - if (len >= 42 && !memcmp(req_buff + 36, "MVSATA", 6)) { - //pout("Device %s: using '-d marvell' for ATA disk with Marvell driver\n", get_dev_name()); - close(); - smart_device_auto_ptr newdev( - new linux_marvell_device(smi(), get_dev_name(), get_req_type()) - ); - newdev->open(); // TODO: Can possibly pass open fd - delete this; - return newdev.release(); + // Marvell ? + if (len >= 42 && !memcmp(req_buff + 36, "MVSATA", 6)) { + //pout("Device %s: using '-d marvell' for ATA disk with Marvell driver\n", get_dev_name()); + close(); + smart_device_auto_ptr newdev( + new linux_marvell_device(smi(), get_dev_name(), get_req_type()) + ); + newdev->open(); // TODO: Can possibly pass open fd + delete this; + return newdev.release(); + } } // SAT or USB ? @@ -2709,6 +2726,11 @@ smart_device * linux_scsi_device::autode } // Nothing special found + + if (sat_only) { + close(); + set_err(EIO, "Not a SAT device"); + } return this; } @@ -2891,7 +2913,7 @@ bool linux_smart_interface::get_dev_list if (autodetect) dev = autodetect_smart_device(name); else if (is_scsi) - dev = new linux_scsi_device(this, name, req_type); + dev = new linux_scsi_device(this, name, req_type, true /*scanning*/); else dev = new linux_ata_device(this, name, req_type); if (dev) // autodetect_smart_device() may return nullptr. @@ -2917,7 +2939,8 @@ bool linux_smart_interface::scan_smart_d type = ""; bool scan_ata = (!*type || !strcmp(type, "ata" )); - bool scan_scsi = (!*type || !strcmp(type, "scsi")); + // "sat" detection will be later handled in linux_scsi_device::autodetect_open() + bool scan_scsi = (!*type || !strcmp(type, "scsi") || !strcmp(type, "sat")); if (!(scan_ata || scan_scsi)) return true; diff -Naurp ../smartmontools-5.39.regfix/smartctl.cpp ../smartmontools-5.39/smartctl.cpp --- ../smartmontools-5.39.regfix/smartctl.cpp 2010-01-20 15:47:48.215402112 +0100 +++ ../smartmontools-5.39/smartctl.cpp 2010-01-20 16:12:24.039465040 +0100 @@ -3,8 +3,8 @@ * * Home page of code is: http://smartmontools.sourceforge.net * - * Copyright (C) 2002-9 Bruce Allen - * Copyright (C) 2008-9 Christian Franke + * Copyright (C) 2002-10 Bruce Allen + * Copyright (C) 2008-10 Christian Franke * Copyright (C) 2000 Michael Cornwell * * This program is free software; you can redistribute it and/or modify @@ -730,7 +730,7 @@ const char * parse_options(int argc, cha // print output is switchable, then start with the print output // turned off if (con->printing_switchable) - con->dont_print = false; + con->dont_print = true; // error message if user has asked for more than one test if (testcnt > 1) {