diff options
Diffstat (limited to 'abs/core/libatasmart')
-rw-r--r-- | abs/core/libatasmart/0001-Dont-test-undefined-bits.patch | 28 | ||||
-rw-r--r-- | abs/core/libatasmart/0002-Drop-our-own-many-bad-sectors-heuristic.patch | 93 | ||||
-rw-r--r-- | abs/core/libatasmart/PKGBUILD | 21 |
3 files changed, 137 insertions, 5 deletions
diff --git a/abs/core/libatasmart/0001-Dont-test-undefined-bits.patch b/abs/core/libatasmart/0001-Dont-test-undefined-bits.patch new file mode 100644 index 0000000..9b32bba --- /dev/null +++ b/abs/core/libatasmart/0001-Dont-test-undefined-bits.patch @@ -0,0 +1,28 @@ +Author: Phillip Susi <psusi@ubuntu.com> +Subject: fix an incorrect IO error reading SMART status +Description: The read SMART status command's return status + was testing for a success/failure value that included 8 + bits that are "N/A" according to the standard, and required + that they be zeros. At least some drives do not fill them + with zeros, so correct this by masking off the undefined + bits. +Bug: https://bugs.freedesktop.org/show_bug.cgi?id=61998 +Bug-Ubuntu: https://launchpad.net/bugs/1143495 + +Index: b/atasmart.c +=================================================================== +--- a/atasmart.c ++++ b/atasmart.c +@@ -925,10 +925,10 @@ + /* SAT/USB bridges truncate packets, so we only check for 4F, + * not for 2C on those */ + if ((d->type == SK_DISK_TYPE_ATA_PASSTHROUGH_12 || cmd[3] == htons(0x00C2U)) && +- cmd[4] == htons(0x4F00U)) ++ (cmd[4] & htons(0xFF00U)) == htons(0x4F00U)) + *good = TRUE; + else if ((d->type == SK_DISK_TYPE_ATA_PASSTHROUGH_12 || cmd[3] == htons(0x002CU)) && +- cmd[4] == htons(0xF400U)) ++ (cmd[4] & htons(0xFF00U)) == htons(0xF400U)) + *good = FALSE; + else { + errno = EIO; diff --git a/abs/core/libatasmart/0002-Drop-our-own-many-bad-sectors-heuristic.patch b/abs/core/libatasmart/0002-Drop-our-own-many-bad-sectors-heuristic.patch new file mode 100644 index 0000000..0655ca4 --- /dev/null +++ b/abs/core/libatasmart/0002-Drop-our-own-many-bad-sectors-heuristic.patch @@ -0,0 +1,93 @@ +From 6846b7c2431dbeaddd9f931c609b522c04e55732 Mon Sep 17 00:00:00 2001 +From: Martin Pitt <martin.pitt@ubuntu.com> +Date: Fri, 19 Mar 2010 14:56:06 +0100 +Subject: [PATCH 2/2] Drop our own "many bad sectors" heuristic + +This currently causes a lot of false positives, because in many cases our +threshold is either overly pessimistically low, or the raw value is implausibly +high. Just use the normalized values vs. threshold for now. + +Bug: https://bugs.freedesktop.org/show_bug.cgi?id=25772 +Bug-Ubuntu: https://launchpad.net/bugs/438136 +--- + atasmart.c | 33 +++++++++++---------------------- + 1 files changed, 11 insertions(+), 22 deletions(-) + +Index: libatasmart/atasmart.c +=================================================================== +--- libatasmart.orig/atasmart.c 2012-05-23 08:34:14.007836753 +0200 ++++ libatasmart/atasmart.c 2012-05-23 08:34:43.903835695 +0200 +@@ -130,6 +130,8 @@ + SkBool current_pending_sector_found:1; + uint64_t reallocated_sector_count; + uint64_t current_pending_sector; ++ SkBool reallocated_sector_count_bad:1; ++ SkBool current_pending_sector_bad:1; + + void *blob; + }; +@@ -2190,16 +2192,23 @@ + if (a->pretty_unit != SK_SMART_ATTRIBUTE_UNIT_SECTORS) + return; + ++ if (!a->current_value_valid) ++ return; ++ + if (!strcmp(a->name, "reallocated-sector-count")) { + if (a->pretty_value > d->reallocated_sector_count) + d->reallocated_sector_count = a->pretty_value; + d->reallocated_sector_count_found = TRUE; ++ if (a->good_now_valid && !a->good_now) ++ d->reallocated_sector_count_bad = TRUE; + } + + if (!strcmp(a->name, "current-pending-sector")) { + if (a->pretty_value > d->current_pending_sector) + d->current_pending_sector = a->pretty_value; + d->current_pending_sector_found = TRUE; ++ if (a->good_now_valid && !a->good_now) ++ d->current_pending_sector_bad = TRUE; + } + } + +@@ -2255,24 +2264,9 @@ + return _P(map[overall]); + } + +-static uint64_t u64log2(uint64_t n) { +- unsigned r; +- +- if (n <= 1) +- return 0; +- +- r = 0; +- for (;;) { +- n = n >> 1; +- if (!n) +- return r; +- r++; +- } +-} +- + int sk_disk_smart_get_overall(SkDisk *d, SkSmartOverall *overall) { + SkBool good; +- uint64_t sectors, sector_threshold; ++ uint64_t sectors; + + assert(d); + assert(overall); +@@ -2293,13 +2287,7 @@ + return -1; + sectors = 0; + } else { +- +- /* We use log2(n_sectors)*1024 as a threshold here. We +- * had to pick something, and this makes a bit of +- * sense, or doesn't it? */ +- sector_threshold = u64log2(d->size/512) * 1024; +- +- if (sectors >= sector_threshold) { ++ if (d->reallocated_sector_count_bad || d->current_pending_sector_bad) { + *overall = SK_SMART_OVERALL_BAD_SECTOR_MANY; + return 0; + } diff --git a/abs/core/libatasmart/PKGBUILD b/abs/core/libatasmart/PKGBUILD index 0d003c0..6e1fed5 100644 --- a/abs/core/libatasmart/PKGBUILD +++ b/abs/core/libatasmart/PKGBUILD @@ -1,15 +1,27 @@ -# $Id: PKGBUILD 198126 2013-10-30 12:56:47Z allan $ +# $Id$ # Maintainer: Jan de Groot <jgc@archlinux.org> pkgname=libatasmart pkgver=0.19 -pkgrel=2 +pkgrel=3 pkgdesc="ATA S.M.A.R.T. Reading and Parsing Library" arch=('i686' 'x86_64') license=('LGPL') -depends=('udev') +depends=('libsystemd') +makedepends=('systemd') url="http://0pointer.de/blog/projects/being-smart.html" -source=("http://0pointer.de/public/${pkgname}-${pkgver}.tar.xz") +source=(http://0pointer.de/public/${pkgname}-${pkgver}.tar.xz + 0001-Dont-test-undefined-bits.patch + 0002-Drop-our-own-many-bad-sectors-heuristic.patch) +md5sums=('53afe2b155c36f658e121fe6def33e77' + 'eb5d0468b0d47d099e5164372a21f9da' + 'cebd1fbed0b05d0458177d6d3ad4ea3f') + +prepare() { + cd $pkgname-$pkgver + patch -Np1 -i ../0001-Dont-test-undefined-bits.patch + patch -Np1 -i ../0002-Drop-our-own-many-bad-sectors-heuristic.patch +} build() { cd "${srcdir}/${pkgname}-${pkgver}" @@ -25,4 +37,3 @@ package() { cd "${srcdir}/${pkgname}-${pkgver}" make DESTDIR="${pkgdir}" install } -md5sums=('53afe2b155c36f658e121fe6def33e77') |