From: Arne Fitzenreiter Date: Mon, 13 Jul 2015 20:00:57 +0000 (+0200) Subject: kernel: fix trim dataloss on some solid state discs X-Git-Url: http://git.ipfire.org/?p=people%2Farne_f%2Fipfire-2.x.git;a=commitdiff_plain;h=c9ab30c5d31979ea7056261c9867cf42644b4a0d kernel: fix trim dataloss on some solid state discs disable trim on SuperSSpeed S238 update queued trim blacklist from kernel 4.2rc1 (add Samsung SSD 8xx and some Crucial and Micron SSD) --- diff --git a/lfs/linux b/lfs/linux index f59a709a5..33bdf8fd2 100644 --- 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 index 000000000..1745bbcbe --- /dev/null +++ b/src/patches/linux-3.14.43_SuperSSpeed_NOTRIM.patch @@ -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 index 000000000..f497070a0 --- /dev/null +++ b/src/patches/linux-3.14.43_new_qtrim_blacklist.patch @@ -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, },