diff --git a/sm5/Makefile b/sm5/Makefile index a3496d744df84a0e0c08769b79107fd206dc5a59..e966995a6e4eed3cee6ccdb74d263e74a697f43f 100644 --- a/sm5/Makefile +++ b/sm5/Makefile @@ -1,6 +1,6 @@ # Makefile for smartmontools # -# $Id: Makefile,v 1.12 2002/10/11 12:48:27 ballen4705 Exp $ +# $Id: Makefile,v 1.13 2002/10/13 13:10:56 ballen4705 Exp $ # # Copyright (C) 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net> # @@ -14,8 +14,8 @@ # Mass Ave, Cambridge, MA 02139, USA. CC = gcc -# CFLAGS = -fsigned-char -Wall -g -CFLAGS = -fsigned-char -Wall -O2 +CFLAGS = -fsigned-char -Wall -g +# CFLAGS = -fsigned-char -Wall -O2 releasefiles=atacmds.c atacmds.h ataprint.c ataprint.h CHANGELOG COPYING extern.h Makefile\ README scsicmds.c scsicmds.h scsiprint.c scsiprint.h smartctl.8 smartctl.c smartctl.h\ diff --git a/sm5/VERSION b/sm5/VERSION index 00750edc07d6415dcc07ae0351e9397b0222b7ba..7ed6ff82de6bcc2a78243fc9c54d3ef5ac14da69 100644 --- a/sm5/VERSION +++ b/sm5/VERSION @@ -1 +1 @@ -3 +5 diff --git a/sm5/atacmds.c b/sm5/atacmds.c index a7d424ca2ba1d0c4aa3bcccb27b23d3d1048a9cd..c9078886d103e44aa8b484f13161eea41805c87d 100644 --- a/sm5/atacmds.c +++ b/sm5/atacmds.c @@ -1,4 +1,4 @@ -// $Id: atacmds.c,v 1.3 2002/10/12 11:10:01 ballen4705 Exp $ +// $Id: atacmds.c,v 1.4 2002/10/13 13:10:56 ballen4705 Exp $ /* * atacmds.c * @@ -22,7 +22,8 @@ #include "atacmds.h" -// Drive identity stuff shamelessly ripped from hdparm 5.2 +// These Drive Identity tables are taken from hdparm 5.2. That's the +// "Gold Standard" #define NOVAL_0 0x0000 #define NOVAL_1 0xffff /* word 81: minor version number */ @@ -159,38 +160,30 @@ int ataSmartSupport ( struct hd_driveid drive){ return 0; } -int ataReadSmartValues (int device, struct ata_smart_values *data) -{ - int i; - unsigned char chksum; - unsigned char buf[ HDIO_DRIVE_CMD_HDR_SIZE + - ATA_SMART_SEC_SIZE] = - { WIN_SMART, 0, SMART_READ_VALUES, 1}; - - if (ioctl ( device , HDIO_DRIVE_CMD, (unsigned char *) &buf ) != 0) - { - perror ("Smart Values Read failed"); - return -1; - } - chksum = 0; - - for ( i = HDIO_DRIVE_CMD_HDR_SIZE; - i < ATA_SMART_SEC_SIZE + HDIO_DRIVE_CMD_HDR_SIZE; - i++ ) - chksum += buf[i]; - - if ( (unsigned char) chksum != 0) - { - perror ("Smart Read Failed, Chksum error"); - return -1; - } - - memcpy( data, - &buf[HDIO_DRIVE_CMD_HDR_SIZE] , - ATA_SMART_SEC_SIZE ); - - return 0; - +int ataReadSmartValues (int device, struct ata_smart_values *data){ + int i; + unsigned char chksum=0; + unsigned char buf[HDIO_DRIVE_CMD_HDR_SIZE+ATA_SMART_SEC_SIZE]= + {WIN_SMART, 0, SMART_READ_VALUES, 1}; + + if (ioctl(device,HDIO_DRIVE_CMD,buf)){ + perror ("Smart Values Read failed"); + return -1; + } + + // compute checksum + for (i=0;i<ATA_SMART_SEC_SIZE;i++) + chksum+=buf[i+HDIO_DRIVE_CMD_HDR_SIZE]; + + // verify that checksum vanishes + if (chksum){ + perror ("Smart Read Failed, Checksum error!"); + return -1; + } + + // copy data and return + memcpy(data,buf+HDIO_DRIVE_CMD_HDR_SIZE,ATA_SMART_SEC_SIZE); + return 0; } @@ -369,8 +362,9 @@ int ataDisableAutoOffline (int device ) } -int ataSmartStatus (int device ) -{ +// Not being used correctly. Must examine the CL and CH registers to +// see what the smart status was. How to fix this? I don't know... +int ataSmartStatus (int device ){ unsigned char parms[4] = { WIN_SMART, 0, SMART_STATUS, 0}; if (ioctl ( device , HDIO_DRIVE_CMD, &parms) != 0) @@ -386,7 +380,7 @@ int ataSmartTest (int device, int testtype) { unsigned char parms[4] = { WIN_SMART, testtype, SMART_IMMEDIATE_OFFLINE, 0}; - + if (ioctl ( device , HDIO_DRIVE_CMD, &parms) != 0) { perror ("Smart Offline failed"); diff --git a/sm5/atacmds.cpp b/sm5/atacmds.cpp index 03ac761a9a59543d79776bfceeec7b59b23b2237..8b209009792b28f766305e41e6ce2e4cf127c09e 100644 --- a/sm5/atacmds.cpp +++ b/sm5/atacmds.cpp @@ -1,4 +1,4 @@ -// $Id: atacmds.cpp,v 1.3 2002/10/12 11:10:01 ballen4705 Exp $ +// $Id: atacmds.cpp,v 1.4 2002/10/13 13:10:56 ballen4705 Exp $ /* * atacmds.c * @@ -22,7 +22,8 @@ #include "atacmds.h" -// Drive identity stuff shamelessly ripped from hdparm 5.2 +// These Drive Identity tables are taken from hdparm 5.2. That's the +// "Gold Standard" #define NOVAL_0 0x0000 #define NOVAL_1 0xffff /* word 81: minor version number */ @@ -159,38 +160,30 @@ int ataSmartSupport ( struct hd_driveid drive){ return 0; } -int ataReadSmartValues (int device, struct ata_smart_values *data) -{ - int i; - unsigned char chksum; - unsigned char buf[ HDIO_DRIVE_CMD_HDR_SIZE + - ATA_SMART_SEC_SIZE] = - { WIN_SMART, 0, SMART_READ_VALUES, 1}; - - if (ioctl ( device , HDIO_DRIVE_CMD, (unsigned char *) &buf ) != 0) - { - perror ("Smart Values Read failed"); - return -1; - } - chksum = 0; - - for ( i = HDIO_DRIVE_CMD_HDR_SIZE; - i < ATA_SMART_SEC_SIZE + HDIO_DRIVE_CMD_HDR_SIZE; - i++ ) - chksum += buf[i]; - - if ( (unsigned char) chksum != 0) - { - perror ("Smart Read Failed, Chksum error"); - return -1; - } - - memcpy( data, - &buf[HDIO_DRIVE_CMD_HDR_SIZE] , - ATA_SMART_SEC_SIZE ); - - return 0; - +int ataReadSmartValues (int device, struct ata_smart_values *data){ + int i; + unsigned char chksum=0; + unsigned char buf[HDIO_DRIVE_CMD_HDR_SIZE+ATA_SMART_SEC_SIZE]= + {WIN_SMART, 0, SMART_READ_VALUES, 1}; + + if (ioctl(device,HDIO_DRIVE_CMD,buf)){ + perror ("Smart Values Read failed"); + return -1; + } + + // compute checksum + for (i=0;i<ATA_SMART_SEC_SIZE;i++) + chksum+=buf[i+HDIO_DRIVE_CMD_HDR_SIZE]; + + // verify that checksum vanishes + if (chksum){ + perror ("Smart Read Failed, Checksum error!"); + return -1; + } + + // copy data and return + memcpy(data,buf+HDIO_DRIVE_CMD_HDR_SIZE,ATA_SMART_SEC_SIZE); + return 0; } @@ -369,8 +362,9 @@ int ataDisableAutoOffline (int device ) } -int ataSmartStatus (int device ) -{ +// Not being used correctly. Must examine the CL and CH registers to +// see what the smart status was. How to fix this? I don't know... +int ataSmartStatus (int device ){ unsigned char parms[4] = { WIN_SMART, 0, SMART_STATUS, 0}; if (ioctl ( device , HDIO_DRIVE_CMD, &parms) != 0) @@ -386,7 +380,7 @@ int ataSmartTest (int device, int testtype) { unsigned char parms[4] = { WIN_SMART, testtype, SMART_IMMEDIATE_OFFLINE, 0}; - + if (ioctl ( device , HDIO_DRIVE_CMD, &parms) != 0) { perror ("Smart Offline failed"); diff --git a/sm5/atacmds.h b/sm5/atacmds.h index 1d72bcff78f7ce597e0ba59fa331f5c8eb8f31d4..ace3ccf89bc45497b9e9686754c30603e8a7bf36 100644 --- a/sm5/atacmds.h +++ b/sm5/atacmds.h @@ -1,4 +1,4 @@ -// $Id: atacmds.h,v 1.9 2002/10/12 11:10:01 ballen4705 Exp $ +// $Id: atacmds.h,v 1.10 2002/10/13 13:10:56 ballen4705 Exp $ /* * atacmds.h * @@ -114,8 +114,13 @@ struct ata_smart_attribute { union { unsigned short all; struct { - unsigned prefailure:1; - unsigned online:1; + unsigned prefailure:1; // 0=> low attribute from age/usage + // exceeding design limit, + // 1==prefailure + + unsigned online:1; // 0==> attribute only updated during + // off-line testing. 1==>only updated + // during on-line testing unsigned performance:1; unsigned errorrate:1; unsigned eventcount:1 ; @@ -130,6 +135,24 @@ struct ata_smart_attribute { } __attribute__ ((packed)); +// What follows is the ATA/ATAPI-4 Rev 13 data structure equivalent: +// Table 23 DEVICE SMART DATA STRUCTURE +#if 0 +struct ata_smart_values { + unsigned short int revnumber; + struct ata_smart_attribute vendor_attributes [NUMBER_ATA_SMART_ATTRIBUTES]; + unsigned char offline_data_collection_status; + unsigned char vendor_specific_363; //IBM # segments for offline collection + unsigned short int total_time_to_complete_off_line; // IBM different + unsigned char vendor_specific_366; // IBM curent segment pointer + unsigned char offline_data_collection_capability; + unsigned short int smart_capability; + unsigned char reserved_370_385;; + unsigned char vendor_specific_386-510; // IBM: self-test failure checkpoint + unsigned char chksum; +} __attribute__ ((packed)); +#endif + /* ata_smart_values is format of the read drive Attribute command */ /* see Table 34 of T13/1321D Rev 1 spec (Device SMART data structure) for *some* info */ @@ -137,9 +160,9 @@ struct ata_smart_values { unsigned short int revnumber; struct ata_smart_attribute vendor_attributes [NUMBER_ATA_SMART_ATTRIBUTES]; unsigned char offline_data_collection_status; - unsigned char self_test_exec_status; - unsigned short int total_time_to_complete_off_line; - unsigned char vendor_specific_366; + unsigned char self_test_exec_status; //IBM # segments for offline collection + unsigned short int total_time_to_complete_off_line; // IBM different + unsigned char vendor_specific_366; // IBM curent segment pointer unsigned char offline_data_collection_capability; unsigned short int smart_capability; unsigned char errorlog_capability; @@ -165,7 +188,7 @@ struct ata_smart_threshold_entry { /* Compare to ata_smart_values above */ struct ata_smart_thresholds { unsigned short int revnumber; - struct ata_smart_threshold_entry thres_entries[30]; + struct ata_smart_threshold_entry thres_entries[NUMBER_ATA_SMART_ATTRIBUTES]; unsigned char reserved[149]; unsigned char chksum; } __attribute__ ((packed)); diff --git a/sm5/ataprint.c b/sm5/ataprint.c index 93a5b2b1ddf84b61e2fc1c281b1b27525865b132..5c64fc0b04d83ba8a7fe13e5abaa4c469cf4cbd9 100644 --- a/sm5/ataprint.c +++ b/sm5/ataprint.c @@ -1,4 +1,4 @@ -// $Id: ataprint.c,v 1.7 2002/10/12 11:10:01 ballen4705 Exp $ +// $Id: ataprint.c,v 1.8 2002/10/13 13:10:56 ballen4705 Exp $ /* * ataprint.c * @@ -308,7 +308,7 @@ void PrintSmartAttribWithThres ( struct ata_smart_values data, printf ("Revision Number: %i\n", data.revnumber); printf ("Attribute Flag Value Worst Threshold Raw Value\n"); - for ( i = 0 ; i < 30 ; i++ ){ + for ( i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++ ){ // step through all vendor attributes if (data.vendor_attributes[i].id && thresholds.thres_entries[i].id){ ataPrintSmartAttribName(data.vendor_attributes[i].id); @@ -400,7 +400,7 @@ void ataPrintSmartThresholds (struct ata_smart_thresholds data) printf ("SMART Thresholds\n"); printf ("SMART Threshold Revision Number: %i\n", data.revnumber); - for ( i = 0 ; i < 30 ; i++) { + for ( i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++) { if (data.thres_entries[i].id) printf ("Attribute %3i threshold: %02x (%2i)\n", data.thres_entries[i].id, @@ -527,7 +527,7 @@ void ataPrintSmartSelfTestlog (struct ata_smart_selftestlog data){ printf("Warning - structure revision number does not match spec!\n"); if (data.mostrecenttest==0){ - printf("No self-test have been logged\n"); + printf("No self-tests have been logged\n"); return; } @@ -591,7 +591,7 @@ void ataPsuedoCheckSmart ( struct ata_smart_values data, struct ata_smart_thresholds thresholds) { int i; int failed = 0; - for (i = 0 ; i < 30 ; i++ ) { + for (i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++ ) { if (data.vendor_attributes[i].id && thresholds.thres_entries[i].id && data.vendor_attributes[i].status.flag.prefailure && @@ -603,85 +603,110 @@ void ataPsuedoCheckSmart ( struct ata_smart_values data, } } printf("%s\n", ( failed )? - "SMART drive overall health self-assessment test result: FAILED!\n" + "SMART overall-health self-assessment test result: FAILED!\n" "Drive failure expected in less than 24 hours. SAVE ALL DATA\n": - "SMART drive overall health self-assessment test result: PASSED\n"); + "SMART overall-health self-assessment test result: PASSED\n"); } -void ataPrintSmartAttribName ( unsigned char id ) -{ - switch (id) - { - - case 1: - printf("( 1)Raw Read Error Rate "); - break; - case 2: - printf("( 2)Throughput Performance "); - break; - case 3: - printf("( 3)Spin Up Time "); - break; - case 4: - printf("( 4)Start Stop Count "); - break; - case 5: - printf("( 5)Reallocated Sector Ct "); - break; - case 6: - printf("( 6)Read Channel Margin "); - break; - case 7: - printf("( 7)Seek Error Rate "); - break; - case 8: - printf("( 8)Seek Time Performance "); - break; - case 9: - printf("( 9)Power On Hours "); - break; - case 10: - printf("( 10)Spin Retry Count "); - break; - case 11: - printf("( 11)Calibration Retry Count"); - break; - case 12: - printf("( 12)Power Cycle Count "); - break; - case 13: - printf("( 13)Read Soft Error Rate "); - break; - case 191: - printf("(191)Gsense Error Rate "); - break; - case 192: - printf("(192)Power-Off Retract Count"); - break; - case 193: - printf("(193)Load Cycle Count "); - break; - case 194: - printf("(194)Temperature "); - break; - case 195: - printf("(195)Hardware ECC Recovered "); - break; - case 196: - printf("(196)Reallocated Event Count"); - break; - case 197: - printf("(197)Current Pending Sector "); - break; - case 198: - printf("(198)Offline Uncorrectable "); - break; - case 199: - printf("(199)UDMA CRC Error Count "); - break; - default: - printf("(%3d)Unknown Attribute ", id); - break; +void ataPrintSmartAttribName ( unsigned char id ){ + switch (id){ + + case 1: + printf("( 1)Raw Read Error Rate "); + break; + case 2: + printf("( 2)Throughput Performance "); + break; + case 3: + printf("( 3)Spin Up Time "); + break; + case 4: + printf("( 4)Start Stop Count "); + break; + case 5: + printf("( 5)Reallocated Sector Ct "); + break; + case 6: + printf("( 6)Read Channel Margin "); + break; + case 7: + printf("( 7)Seek Error Rate "); + break; + case 8: + printf("( 8)Seek Time Performance "); + break; + case 9: + printf("( 9)Power On Hours "); + break; + case 10: + printf("( 10)Spin Retry Count "); + break; + case 11: + printf("( 11)Calibration Retry Count"); + break; + case 12: + printf("( 12)Power Cycle Count "); + break; + case 13: + printf("( 13)Read Soft Error Rate "); + break; + case 191: + printf("(191)G-Sense Error Rate "); + break; + case 192: + printf("(192)Power-Off Retract Count"); + break; + case 193: + printf("(193)Load Cycle Count "); + break; + case 194: + printf("(194)Temperature "); + break; + case 195: + printf("(195)Hardware ECC Recovered "); + break; + case 196: + printf("(196)Reallocated Event Count"); + break; + case 197: + printf("(197)Current Pending Sector "); + break; + case 198: + printf("(198)Offline Uncorrectable "); + break; + case 199: + printf("(199)UDMA CRC Error Count "); + break; + case 220: + printf("(220)Disk Shift "); + break; + case 221: + printf("(221)G-Sense Error Rate "); + break; + case 222: + printf("(222)Loaded Hours "); + break; + case 223: + printf("(223)Load Retry Count "); + break; + case 224: + printf("(224)Load Friction "); + break; + case 225: + printf("(225)Load Cycle Count "); + break; + case 226: + printf("(226)Load-in Time "); + break; + case 227: + printf("(227)Torq-amp Count "); + break; + case 228: + printf("(228)Power-off Retract Count"); + break; + default: + printf("(%3d)Unknown Attribute ", id); + break; } } diff --git a/sm5/ataprint.cpp b/sm5/ataprint.cpp index e7d6ed2b38b86a3ca9f69f701e9d63f99997bd7f..be9528222cc21e95eb290858ffc1278af8ea6d47 100644 --- a/sm5/ataprint.cpp +++ b/sm5/ataprint.cpp @@ -1,4 +1,4 @@ -// $Id: ataprint.cpp,v 1.7 2002/10/12 11:10:01 ballen4705 Exp $ +// $Id: ataprint.cpp,v 1.8 2002/10/13 13:10:56 ballen4705 Exp $ /* * ataprint.c * @@ -308,7 +308,7 @@ void PrintSmartAttribWithThres ( struct ata_smart_values data, printf ("Revision Number: %i\n", data.revnumber); printf ("Attribute Flag Value Worst Threshold Raw Value\n"); - for ( i = 0 ; i < 30 ; i++ ){ + for ( i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++ ){ // step through all vendor attributes if (data.vendor_attributes[i].id && thresholds.thres_entries[i].id){ ataPrintSmartAttribName(data.vendor_attributes[i].id); @@ -400,7 +400,7 @@ void ataPrintSmartThresholds (struct ata_smart_thresholds data) printf ("SMART Thresholds\n"); printf ("SMART Threshold Revision Number: %i\n", data.revnumber); - for ( i = 0 ; i < 30 ; i++) { + for ( i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++) { if (data.thres_entries[i].id) printf ("Attribute %3i threshold: %02x (%2i)\n", data.thres_entries[i].id, @@ -527,7 +527,7 @@ void ataPrintSmartSelfTestlog (struct ata_smart_selftestlog data){ printf("Warning - structure revision number does not match spec!\n"); if (data.mostrecenttest==0){ - printf("No self-test have been logged\n"); + printf("No self-tests have been logged\n"); return; } @@ -591,7 +591,7 @@ void ataPsuedoCheckSmart ( struct ata_smart_values data, struct ata_smart_thresholds thresholds) { int i; int failed = 0; - for (i = 0 ; i < 30 ; i++ ) { + for (i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++ ) { if (data.vendor_attributes[i].id && thresholds.thres_entries[i].id && data.vendor_attributes[i].status.flag.prefailure && @@ -603,85 +603,110 @@ void ataPsuedoCheckSmart ( struct ata_smart_values data, } } printf("%s\n", ( failed )? - "SMART drive overall health self-assessment test result: FAILED!\n" + "SMART overall-health self-assessment test result: FAILED!\n" "Drive failure expected in less than 24 hours. SAVE ALL DATA\n": - "SMART drive overall health self-assessment test result: PASSED\n"); + "SMART overall-health self-assessment test result: PASSED\n"); } -void ataPrintSmartAttribName ( unsigned char id ) -{ - switch (id) - { - - case 1: - printf("( 1)Raw Read Error Rate "); - break; - case 2: - printf("( 2)Throughput Performance "); - break; - case 3: - printf("( 3)Spin Up Time "); - break; - case 4: - printf("( 4)Start Stop Count "); - break; - case 5: - printf("( 5)Reallocated Sector Ct "); - break; - case 6: - printf("( 6)Read Channel Margin "); - break; - case 7: - printf("( 7)Seek Error Rate "); - break; - case 8: - printf("( 8)Seek Time Performance "); - break; - case 9: - printf("( 9)Power On Hours "); - break; - case 10: - printf("( 10)Spin Retry Count "); - break; - case 11: - printf("( 11)Calibration Retry Count"); - break; - case 12: - printf("( 12)Power Cycle Count "); - break; - case 13: - printf("( 13)Read Soft Error Rate "); - break; - case 191: - printf("(191)Gsense Error Rate "); - break; - case 192: - printf("(192)Power-Off Retract Count"); - break; - case 193: - printf("(193)Load Cycle Count "); - break; - case 194: - printf("(194)Temperature "); - break; - case 195: - printf("(195)Hardware ECC Recovered "); - break; - case 196: - printf("(196)Reallocated Event Count"); - break; - case 197: - printf("(197)Current Pending Sector "); - break; - case 198: - printf("(198)Offline Uncorrectable "); - break; - case 199: - printf("(199)UDMA CRC Error Count "); - break; - default: - printf("(%3d)Unknown Attribute ", id); - break; +void ataPrintSmartAttribName ( unsigned char id ){ + switch (id){ + + case 1: + printf("( 1)Raw Read Error Rate "); + break; + case 2: + printf("( 2)Throughput Performance "); + break; + case 3: + printf("( 3)Spin Up Time "); + break; + case 4: + printf("( 4)Start Stop Count "); + break; + case 5: + printf("( 5)Reallocated Sector Ct "); + break; + case 6: + printf("( 6)Read Channel Margin "); + break; + case 7: + printf("( 7)Seek Error Rate "); + break; + case 8: + printf("( 8)Seek Time Performance "); + break; + case 9: + printf("( 9)Power On Hours "); + break; + case 10: + printf("( 10)Spin Retry Count "); + break; + case 11: + printf("( 11)Calibration Retry Count"); + break; + case 12: + printf("( 12)Power Cycle Count "); + break; + case 13: + printf("( 13)Read Soft Error Rate "); + break; + case 191: + printf("(191)G-Sense Error Rate "); + break; + case 192: + printf("(192)Power-Off Retract Count"); + break; + case 193: + printf("(193)Load Cycle Count "); + break; + case 194: + printf("(194)Temperature "); + break; + case 195: + printf("(195)Hardware ECC Recovered "); + break; + case 196: + printf("(196)Reallocated Event Count"); + break; + case 197: + printf("(197)Current Pending Sector "); + break; + case 198: + printf("(198)Offline Uncorrectable "); + break; + case 199: + printf("(199)UDMA CRC Error Count "); + break; + case 220: + printf("(220)Disk Shift "); + break; + case 221: + printf("(221)G-Sense Error Rate "); + break; + case 222: + printf("(222)Loaded Hours "); + break; + case 223: + printf("(223)Load Retry Count "); + break; + case 224: + printf("(224)Load Friction "); + break; + case 225: + printf("(225)Load Cycle Count "); + break; + case 226: + printf("(226)Load-in Time "); + break; + case 227: + printf("(227)Torq-amp Count "); + break; + case 228: + printf("(228)Power-off Retract Count"); + break; + default: + printf("(%3d)Unknown Attribute ", id); + break; } } diff --git a/sm5/smartmontools.spec b/sm5/smartmontools.spec index 52aa6312fb4222ace21764f4a50e677749074ef1..201c257ea404a70ce43caec7eb7756a20d4edd27 100644 --- a/sm5/smartmontools.spec +++ b/sm5/smartmontools.spec @@ -1,4 +1,4 @@ -Release: 2 +Release: 4 Summary: SMARTmontools - for monitoring S.M.A.R.T. disks and devices Name: smartmontools Version: 5.0