]> git.ipfire.org Git - people/arne_f/ipfire-2.x.git/commitdiff
kernel: fix trim dataloss on some solid state discs
authorArne Fitzenreiter <arne_f@ipfire.org>
Mon, 13 Jul 2015 20:00:57 +0000 (22:00 +0200)
committerArne Fitzenreiter <arne_f@ipfire.org>
Mon, 13 Jul 2015 20:00:57 +0000 (22:00 +0200)
disable trim on SuperSSpeed S238
update queued trim blacklist from kernel 4.2rc1
(add Samsung SSD 8xx and some Crucial and Micron SSD)

lfs/linux
src/patches/linux-3.14.43_SuperSSpeed_NOTRIM.patch [new file with mode: 0644]
src/patches/linux-3.14.43_new_qtrim_blacklist.patch [new file with mode: 0644]

index f59a709a5827eeab1e70cb3b54dea57011b5074b..33bdf8fd29f4e8aa97d9ffe33ed7e5744d7d0ebf 100644 (file)
--- a/lfs/linux
+++ b/lfs/linux
@@ -37,7 +37,7 @@ DIR_APP    = $(DIR_SRC)/$(THISAPP)
 CFLAGS     =
 CXXFLAGS   =
 
-PAK_VER    = 61
+PAK_VER    = 62
 DEPS      = ""
 
 VERSUFIX=ipfire$(KCFG)
@@ -161,6 +161,11 @@ endif
        # r8169 L23 patch
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.14.32-r8169_disable_L23.patch
 
+       # SuperSSpeed S238 NOTRIM patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.14.43_SuperSSpeed_NOTRIM.patch
+       # update the queued trim blacklist from kernel 4.2rc1
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.14.43_new_qtrim_blacklist.patch
+
        # HyperV 2008 patch
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.14.x-hyperv-2008-fix.patch
 
diff --git a/src/patches/linux-3.14.43_SuperSSpeed_NOTRIM.patch b/src/patches/linux-3.14.43_SuperSSpeed_NOTRIM.patch
new file mode 100644 (file)
index 0000000..1745bbc
--- /dev/null
@@ -0,0 +1,47 @@
+diff -Naur linux-3.14.43.org/drivers/ata/libata-core.c linux-3.14.43/drivers/ata/libata-core.c
+--- linux-3.14.43.org/drivers/ata/libata-core.c        2015-05-17 18:54:01.000000000 +0200
++++ linux-3.14.43/drivers/ata/libata-core.c    2015-07-11 19:15:01.450041507 +0200
+@@ -4229,6 +4229,9 @@
+       { "Micron_M550*",               NULL,   ATA_HORKAGE_NO_NCQ_TRIM, },
+       { "Crucial_CT*M550SSD*",        NULL,   ATA_HORKAGE_NO_NCQ_TRIM, },
++      /* devices that don't properly handle TRIM commands */
++      { "SuperSSpeed S238*",          NULL,   ATA_HORKAGE_NOTRIM, },
++
+       /*
+        * Some WD SATA-I drives spin up and down erratically when the link
+        * is put into the slumber mode.  We don't have full list of the
+diff -Naur linux-3.14.43.org/drivers/ata/libata-scsi.c linux-3.14.43/drivers/ata/libata-scsi.c
+--- linux-3.14.43.org/drivers/ata/libata-scsi.c        2015-05-17 18:54:01.000000000 +0200
++++ linux-3.14.43/drivers/ata/libata-scsi.c    2015-07-11 20:47:22.570021716 +0200
+@@ -2510,11 +2513,15 @@
+               rbuf[14] = (lowest_aligned >> 8) & 0x3f;
+               rbuf[15] = lowest_aligned;
+-              if (ata_id_has_trim(args->id)) {
+-                      rbuf[14] |= 0x80; /* TPE */
+-                      if (ata_id_has_zero_after_trim(args->id))
+-                              rbuf[14] |= 0x40; /* TPRZ */
++
++              if (!(dev->horkage & ATA_HORKAGE_NOTRIM)) { 
++                      if (ata_id_has_trim(args->id)) {
++                              rbuf[14] |= 0x80; /* TPE */
++
++                              if (ata_id_has_zero_after_trim(args->id))
++                                      rbuf[14] |= 0x40; /* TPRZ */
++                      }
+               }
+       }
+diff -Naur linux-3.14.43.org/include/linux/libata.h linux-3.14.43/include/linux/libata.h
+--- linux-3.14.43.org/include/linux/libata.h   2015-05-17 18:54:01.000000000 +0200
++++ linux-3.14.43/include/linux/libata.h       2015-07-11 19:13:03.190682173 +0200
+@@ -421,6 +421,7 @@
+       ATA_HORKAGE_NO_NCQ_TRIM = (1 << 19),    /* don't use queued TRIM */
+       ATA_HORKAGE_NOLPM       = (1 << 20),    /* don't use LPM */
+       ATA_HORKAGE_WD_BROKEN_LPM = (1 << 21),  /* some WDs have broken LPM */
++      ATA_HORKAGE_NOTRIM      = (1 << 22),    /* don't use TRIM */
+        /* DMA mask for user DMA control: User visible values; DO NOT
+           renumber */
diff --git a/src/patches/linux-3.14.43_new_qtrim_blacklist.patch b/src/patches/linux-3.14.43_new_qtrim_blacklist.patch
new file mode 100644 (file)
index 0000000..f497070
--- /dev/null
@@ -0,0 +1,18 @@
+diff -Naur linux-3.14.43.org/drivers/ata/libata-core.c linux-3.14.43/drivers/ata/libata-core.c
+--- linux-3.14.43.org/drivers/ata/libata-core.c        2015-07-13 17:58:28.126607225 +0200
++++ linux-3.14.43/drivers/ata/libata-core.c    2015-07-13 18:06:07.430782102 +0200
+@@ -4225,9 +4225,11 @@
+       /* devices that don't properly handle queued TRIM commands */
+       { "Micron_M500*",               NULL,   ATA_HORKAGE_NO_NCQ_TRIM, },
+-      { "Crucial_CT???M500SSD*",      NULL,   ATA_HORKAGE_NO_NCQ_TRIM, },
+-      { "Micron_M550*",               NULL,   ATA_HORKAGE_NO_NCQ_TRIM, },
+-      { "Crucial_CT*M550SSD*",        NULL,   ATA_HORKAGE_NO_NCQ_TRIM, },
++      { "Crucial_CT*M500*",           NULL,   ATA_HORKAGE_NO_NCQ_TRIM, },
++      { "Micron_M5[15]0*",            "MU01", ATA_HORKAGE_NO_NCQ_TRIM, },
++      { "Crucial_CT*M550*",           "MU01", ATA_HORKAGE_NO_NCQ_TRIM, },
++      { "Crucial_CT*MX100*",          "MU01", ATA_HORKAGE_NO_NCQ_TRIM, },
++      { "Samsung SSD 8*",             NULL,   ATA_HORKAGE_NO_NCQ_TRIM, },
+       /* devices that don't properly handle TRIM commands */
+       { "SuperSSpeed S238*",          NULL,   ATA_HORKAGE_NOTRIM, },