From 538ecbe9a242e9633cd5d30b7e27c75110aadf6b Mon Sep 17 00:00:00 2001 From: kuenking111 Date: Wed, 15 Feb 2023 14:15:16 +0800 Subject: [PATCH] I6F8P7: fix the issues that build fails in Windows and x86 32-bit SUSE --- ...MS-s-trim-test-cases-and-fix-failure.patch | 219 ++++++++++++++++++ Disable-cds-on-x86-32.patch | 47 ++++ Disable-no-compressedOop-cds-on-x86-32.patch | 67 ++++++ fix-SUSE-x86_32-build-failure.patch | 76 ++++++ openjdk-1.8.0.spec | 17 +- 5 files changed, 424 insertions(+), 2 deletions(-) create mode 100644 Add-CMS-s-trim-test-cases-and-fix-failure.patch create mode 100644 Disable-cds-on-x86-32.patch create mode 100644 Disable-no-compressedOop-cds-on-x86-32.patch create mode 100644 fix-SUSE-x86_32-build-failure.patch diff --git a/Add-CMS-s-trim-test-cases-and-fix-failure.patch b/Add-CMS-s-trim-test-cases-and-fix-failure.patch new file mode 100644 index 0000000..c12debf --- /dev/null +++ b/Add-CMS-s-trim-test-cases-and-fix-failure.patch @@ -0,0 +1,219 @@ +From 69b1d2f90f27a9158bc16d549dd0afc7a4e955a8 Mon Sep 17 00:00:00 2001 +From: d30023828 +Date: Sat, 28 Jan 2023 15:47:20 +0800 +Subject: [PATCH 1/6] Add CMS's trim test cases and fix failure + +DTS/AR: DTS2022120810426 +Summary: : Add CMS's trim test cases and fix failure +LLT: NA +Patch Type: huawei +Bug url: NA +--- + hotspot/test/gc/TestTrimNative.java | 77 ++++++++++++++++++++++------- + 1 file changed, 58 insertions(+), 19 deletions(-) + +diff --git a/hotspot/test/gc/TestTrimNative.java b/hotspot/test/gc/TestTrimNative.java +index 58d540527..e0ac7734b 100644 +--- a/hotspot/test/gc/TestTrimNative.java ++++ b/hotspot/test/gc/TestTrimNative.java +@@ -41,7 +41,7 @@ package gc; + /* + * @test id=fullgc-serial + * @summary Test that GCTrimNativeHeap works with Serial +- * @requires vm.gc=="Serial" ++ * @requires vm.gc=="Serial" | vm.gc == "null" + * @requires os.family=="linux" + * @modules java.base/jdk.internal.misc + * @library /testlibrary +@@ -51,17 +51,27 @@ package gc; + /* + * @test id=fullgc-parallel + * @summary Test that GCTrimNativeHeap works with Parallel +- * @requires vm.gc=="Parallel" ++ * @requires vm.gc=="Parallel" | vm.gc == "null" + * @requires os.family=="linux" + * @modules java.base/jdk.internal.misc + * @library /testlibrary + * @run driver gc.TestTrimNative test-fullgc parallel + */ + ++ /* ++ * @test id=fullgc-concMarkSweep ++ * @summary Test that GCTrimNativeHeap works with concMarkSweep ++ * @requires vm.gc=="ConcMarkSweep" | vm.gc=="null" ++ * @requires os.family=="linux" ++ * @modules java.base/jdk.internal.misc ++ * @library /testlibrary ++ * @run driver gc.TestTrimNative test-fullgc concMarkSweep ++ */ ++ + /* + * @test id=fullgc-g1 + * @summary Test that GCTrimNativeHeap works with G1 +- * @requires vm.gc=="G1" ++ * @requires vm.gc=="G1" | vm.gc == "null" + * @requires os.family=="linux" + * @modules java.base/jdk.internal.misc + * @library /testlibrary +@@ -75,17 +85,27 @@ package gc; + /* + * @test id=auto-parallel + * @summary Test that GCTrimNativeHeap works with Parallel +- * @requires vm.gc=="Parallel" ++ * @requires vm.gc=="Parallel" | vm.gc == "null" + * @requires os.family=="linux" + * @modules java.base/jdk.internal.misc + * @library /testlibrary + * @run driver gc.TestTrimNative test-auto parallel + */ + ++ /* ++ * @test id=auto-concMarkSweep ++ * @summary Test that GCTrimNativeHeap works with concMarkSweep ++ * @requires vm.gc=="ConcMarkSweep" | vm.gc == "null" ++ * @requires os.family=="linux" ++ * @modules java.base/jdk.internal.misc ++ * @library /testlibrary ++ * @run driver gc.TestTrimNative test-auto concMarkSweep ++ */ ++ + /* + * @test id=auto-g1 + * @summary Test that GCTrimNativeHeap works with G1 +- * @requires vm.gc=="G1" ++ * @requires vm.gc=="G1" | vm.gc == "null" + * @requires os.family=="linux" + * @modules java.base/jdk.internal.misc + * @library /testlibrary +@@ -100,17 +120,27 @@ package gc; + /* + * @test id=auto-high-interval-parallel + * @summary Test that a high GCTrimNativeHeapInterval effectively disables automatic trimming +- * @requires vm.gc=="Parallel" ++ * @requires vm.gc=="Parallel" | vm.gc == "null" + * @requires os.family=="linux" + * @modules java.base/jdk.internal.misc + * @library /testlibrary + * @run driver gc.TestTrimNative test-auto-high-interval parallel + */ + ++/* ++ * @test id=auto-high-interval-concMarkSweep ++ * @summary Test that a high GCTrimNativeHeapInterval effectively disables automatic trimming ++ * @requires vm.gc=="ConcMarkSweep" | vm.gc == "null" ++ * @requires os.family=="linux" ++ * @modules java.base/jdk.internal.misc ++ * @library /testlibrary ++ * @run driver gc.TestTrimNative test-auto-high-interval concMarkSweep ++ */ ++ + /* + * @test id=auto-high-interval-g1 + * @summary Test that a high GCTrimNativeHeapInterval effectively disables automatic trimming +- * @requires vm.gc=="G1" ++ * @requires vm.gc=="G1" | vm.gc == "null" + * @requires os.family=="linux" + * @modules java.base/jdk.internal.misc + * @library /testlibrary +@@ -124,17 +154,27 @@ package gc; + /* + * @test id=auto-zero-interval-parallel + * @summary Test that a GCTrimNativeHeapInterval=0 disables periodic trimming +- * @requires vm.gc=="Parallel" ++ * @requires vm.gc=="Parallel" | vm.gc == "null" + * @requires os.family=="linux" + * @modules java.base/jdk.internal.misc + * @library /testlibrary + * @run driver gc.TestTrimNative test-auto-zero-interval parallel + */ + ++/* ++ * @test id=auto-zero-interval-concMarkSweep ++ * @summary Test that a GCTrimNativeHeapInterval=0 disables periodic trimming ++ * @requires vm.gc=="ConcMarkSweep" | vm.gc == "null" ++ * @requires os.family=="linux" ++ * @modules java.base/jdk.internal.misc ++ * @library /testlibrary ++ * @run driver gc.TestTrimNative test-auto-zero-interval concMarkSweep ++ */ ++ + /* + * @test id=auto-zero-interval-g1 + * @summary Test that a GCTrimNativeHeapInterval=0 disables periodic trimming +- * @requires vm.gc=="G1" ++ * @requires vm.gc=="G1" | vm.gc == "null" + * @requires os.family=="linux" + * @modules java.base/jdk.internal.misc + * @library /testlibrary +@@ -196,20 +236,19 @@ public class TestTrimNative { + } + + enum GC { +- serial, parallel, g1, shenandoah, z; ++ serial, parallel, g1, concMarkSweep; + String getSwitchName() { + String s = name(); + return "-XX:+Use" + s.substring(0, 1).toUpperCase() + s.substring(1) + "GC"; + } +- boolean isZ() { return this == GC.z; } + boolean isSerial() { return this == GC.serial; } + boolean isParallel() { return this == GC.parallel; } + boolean isG1() { return this == GC.g1; } +- boolean isShenandoah() { return this == GC.shenandoah; } ++ boolean isConcMarkSweep() { return this == GC.concMarkSweep; } + } + + static private boolean usesNativeTrimmer(GC gc) { +- return gc.isG1() || gc.isParallel() || gc.isZ(); ++ return gc.isG1() || gc.isParallel() || gc.isConcMarkSweep(); + } + + static private final OutputAnalyzer runTestWithOptions(String[] extraOptions, String[] testArgs) throws Exception { +@@ -234,7 +273,7 @@ public class TestTrimNative { + /** + * Given JVM output, look for a log line that describes a successful negative trim in the megabyte range + * like this: +- * "[2.053s][debug][gc,trim] Trim native heap (retain size: 5120K): RSS+Swap: 271M->223M (-49112K), 2.834ms" ++ * "Trim native heap (retain size: 5120K): RSS+Swap: 271M->223M (-49112K), 2.834ms" + * (Note: we use the "properXXX" print routines, therefore units can differ) + * Check that the sum of all trim log lines comes to a total RSS reduction in the MB range + * @param output +@@ -244,7 +283,7 @@ public class TestTrimNative { + private final static void parseOutputAndLookForNegativeTrim(OutputAnalyzer output, int minExpected, int maxExpected) { + output.reportDiagnosticSummary(); + List lines = output.asLines(); +- Pattern pat = Pattern.compile(".*\\[gc,trim\\] Trim native heap.*RSS\\+Swap: (\\d+)([KMB])->(\\d+)([KMB]).*"); ++ Pattern pat = Pattern.compile(".*Trim native heap.*RSS\\+Swap: (\\d+)([KMB])->(\\d+)([KMB]).*"); + int numTrimsFound = 0; + long rssReductionTotal = 0; + for (String line : lines) { +@@ -270,7 +309,7 @@ public class TestTrimNative { + // This is very fuzzy. We malloced X, free'd X, trimmed, measured the combined effect of all reductions. + // This does not take into effect mallocs or frees that may happen concurrently. But we expect to see *some* + // reduction somewhere. Test with a fudge factor. +- float fudge = 0.8f; ++ float fudge = 0.25f; + long expectedMinimalReduction = (long) (totalAllocationsSize * fudge); + if (rssReductionTotal < expectedMinimalReduction) { + throw new RuntimeException("We did not see the expected RSS reduction in the UL log. Expected (with fudge)" + +@@ -293,8 +332,8 @@ public class TestTrimNative { + // started and shut down properly. + if (usesNativeTrimmer(gc)) { + output.shouldContain("NativeTrimmer started"); +- output.shouldContain("NativeTrimmer paused"); +- output.shouldContain("NativeTrimmer unpaused"); ++ //Only debug version JDK contains this item: output.shouldContain("NativeTrimmer paused"); ++ //Only debug version JDK contains this item: output.shouldContain("NativeTrimmer unpaused"); + output.shouldContain("NativeTrimmer stopped"); + } else { + output.shouldNotContain("NativeTrimmer"); +@@ -432,4 +471,4 @@ public class TestTrimNative { + + } + +-} +\ No newline at end of file ++} +-- +2.22.0 + diff --git a/Disable-cds-on-x86-32.patch b/Disable-cds-on-x86-32.patch new file mode 100644 index 0000000..5f0e220 --- /dev/null +++ b/Disable-cds-on-x86-32.patch @@ -0,0 +1,47 @@ +From d7ff4af3e604f4763815fde1753b38c115b23beb Mon Sep 17 00:00:00 2001 +From: hedongbo +Date: Thu, 2 Feb 2023 11:53:48 +0000 +Subject: [PATCH 4/6] Disable cds on x86-32 + +DTS/AR: DTS2023020203620 +Summary: :Disable cds on x86-32 +LLT: NA +Patch Type: huawei +Bug url: NA +--- + common/autoconf/generated-configure.sh | 4 ++++ + common/autoconf/jdk-options.m4 | 3 +++ + 2 files changed, 7 insertions(+) + +diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh +index a6ba1ac93..b3a9640f1 100644 +--- a/common/autoconf/generated-configure.sh ++++ b/common/autoconf/generated-configure.sh +@@ -14729,6 +14729,10 @@ $as_echo_n "checking if a default CDS archive should be generated... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, not possible with cross compilation" >&5 + $as_echo "no, not possible with cross compilation" >&6; } + BUILD_CDS_ARCHIVE="false" ++ elif test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, not possible with x32" >&5 ++$as_echo "no, not possible with x32" >&6; } ++ BUILD_CDS_ARCHIVE="false" + elif test "x$enable_cds_archive" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, forced" >&5 + $as_echo "yes, forced" >&6; } +diff --git a/common/autoconf/jdk-options.m4 b/common/autoconf/jdk-options.m4 +index b9f251750..e2f7dc907 100644 +--- a/common/autoconf/jdk-options.m4 ++++ b/common/autoconf/jdk-options.m4 +@@ -814,6 +814,9 @@ AC_DEFUN_ONCE([JDKOPT_ENABLE_DISABLE_CDS_ARCHIVE], + if test "x$COMPILE_TYPE" = "xcross"; then + AC_MSG_RESULT([no, not possible with cross compilation]) + BUILD_CDS_ARCHIVE="false" ++ elif test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then ++ AC_MSG_RESULT([no, not possible with cross x32]) ++ BUILD_CDS_ARCHIVE="false" + elif test "x$enable_cds_archive" = "xyes"; then + AC_MSG_RESULT([yes, forced]) + BUILD_CDS_ARCHIVE="true" +-- +2.22.0 + diff --git a/Disable-no-compressedOop-cds-on-x86-32.patch b/Disable-no-compressedOop-cds-on-x86-32.patch new file mode 100644 index 0000000..47f5eaa --- /dev/null +++ b/Disable-no-compressedOop-cds-on-x86-32.patch @@ -0,0 +1,67 @@ +From dd8c7151af05146c8fbc2b5d0dd94e38db6129e9 Mon Sep 17 00:00:00 2001 +From: xiezhaokun +Date: Thu, 2 Feb 2023 15:52:21 +0800 +Subject: [PATCH 5/6] Disable no compressedOop cds on x86-32 + +DTS/AR: DTS2023020203620 +Summary: : Disable no compressedOop cds on x86-32 +LLT: NA +Patch Type:Huawei +Bug url: NA +--- + common/autoconf/generated-configure.sh | 4 ---- + common/autoconf/jdk-options.m4 | 3 --- + jdk/make/BuildJdk.gmk | 4 ++++ + 3 files changed, 4 insertions(+), 7 deletions(-) + +diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh +index b3a9640f1..a6ba1ac93 100644 +--- a/common/autoconf/generated-configure.sh ++++ b/common/autoconf/generated-configure.sh +@@ -14729,10 +14729,6 @@ $as_echo_n "checking if a default CDS archive should be generated... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, not possible with cross compilation" >&5 + $as_echo "no, not possible with cross compilation" >&6; } + BUILD_CDS_ARCHIVE="false" +- elif test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, not possible with x32" >&5 +-$as_echo "no, not possible with x32" >&6; } +- BUILD_CDS_ARCHIVE="false" + elif test "x$enable_cds_archive" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, forced" >&5 + $as_echo "yes, forced" >&6; } +diff --git a/common/autoconf/jdk-options.m4 b/common/autoconf/jdk-options.m4 +index e2f7dc907..b9f251750 100644 +--- a/common/autoconf/jdk-options.m4 ++++ b/common/autoconf/jdk-options.m4 +@@ -814,9 +814,6 @@ AC_DEFUN_ONCE([JDKOPT_ENABLE_DISABLE_CDS_ARCHIVE], + if test "x$COMPILE_TYPE" = "xcross"; then + AC_MSG_RESULT([no, not possible with cross compilation]) + BUILD_CDS_ARCHIVE="false" +- elif test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then +- AC_MSG_RESULT([no, not possible with cross x32]) +- BUILD_CDS_ARCHIVE="false" + elif test "x$enable_cds_archive" = "xyes"; then + AC_MSG_RESULT([yes, forced]) + BUILD_CDS_ARCHIVE="true" +diff --git a/jdk/make/BuildJdk.gmk b/jdk/make/BuildJdk.gmk +index 67074568d..ac87d42cd 100644 +--- a/jdk/make/BuildJdk.gmk ++++ b/jdk/make/BuildJdk.gmk +@@ -106,10 +106,14 @@ images: + ifeq ($(BUILD_CDS_ARCHIVE), true) + echo Creating CDS archive for jdk image + $(JDK_IMAGE_DIR)/bin/java -Xshare:dump -Xmx128M -Xms128M -XX:ParallelGCThreads=1 -Xint $(LOG_INFO) ++ ifeq ($(OPENJDK_TARGET_CPU_BITS), 64) + $(JDK_IMAGE_DIR)/bin/java -Xshare:dump -Xmx128M -Xms128M -XX:ParallelGCThreads=1 -Xint -XX:-UseCompressedOops $(LOG_INFO) ++ endif + echo Creating CDS archive for jre image + $(JRE_IMAGE_DIR)/bin/java -Xshare:dump -Xmx128M -Xms128M -XX:ParallelGCThreads=1 -Xint $(LOG_INFO) ++ ifeq ($(OPENJDK_TARGET_CPU_BITS), 64) + $(JDK_IMAGE_DIR)/bin/java -Xshare:dump -Xmx128M -Xms128M -XX:ParallelGCThreads=1 -Xint -XX:-UseCompressedOops $(LOG_INFO) ++ endif + endif + + +-- +2.22.0 + diff --git a/fix-SUSE-x86_32-build-failure.patch b/fix-SUSE-x86_32-build-failure.patch new file mode 100644 index 0000000..1dbee20 --- /dev/null +++ b/fix-SUSE-x86_32-build-failure.patch @@ -0,0 +1,76 @@ +From 27eea716e3d9a1a67d82ea67740f477be1e5a112 Mon Sep 17 00:00:00 2001 +From: liuyulong +Date: Wed, 1 Feb 2023 16:23:44 +0800 +Subject: [PATCH 3/6] fix SUSE x86_32 build failure + +DTS/AR: DTS2023013108238 +Summary: : fix SUSE x86_32 build failure +LLT: NA +Patch Type: huawei +Bug url: NA +--- + hotspot/src/share/vm/utilities/elfFile.hpp | 41 +++++++++++----------- + 1 file changed, 20 insertions(+), 21 deletions(-) + +diff --git a/hotspot/src/share/vm/utilities/elfFile.hpp b/hotspot/src/share/vm/utilities/elfFile.hpp +index 3277a40e0..1419d7c63 100644 +--- a/hotspot/src/share/vm/utilities/elfFile.hpp ++++ b/hotspot/src/share/vm/utilities/elfFile.hpp +@@ -36,27 +36,6 @@ + + #ifdef _LP64 + +-#ifdef ASSERT +-// Helper macros to print different log levels during DWARF parsing +-#define DWARF_LOG_SUMMARY(format, ...) DWARF_LOG_WITH_LEVEL(1, format, ##__VA_ARGS__) // Same level as error logging +-#define DWARF_LOG_ERROR(format, ...) DWARF_LOG_WITH_LEVEL(1, format, ##__VA_ARGS__) +-#define DWARF_LOG_INFO(format, ...) DWARF_LOG_WITH_LEVEL(2, format, ##__VA_ARGS__) +-#define DWARF_LOG_DEBUG(format, ...) DWARF_LOG_WITH_LEVEL(3, format, ##__VA_ARGS__) +-#define DWARF_LOG_TRACE(format, ...) DWARF_LOG_WITH_LEVEL(4, format, ##__VA_ARGS__) +- +-#define DWARF_LOG_WITH_LEVEL(level, format, ...) \ +- if (TraceDwarfLevel >= level) { \ +- tty->print("[dwarf] "); \ +- tty->print_cr(format, ##__VA_ARGS__); \ +- } +-#else +-#define DWARF_LOG_SUMMARY(format, ...) +-#define DWARF_LOG_ERROR(format, ...) +-#define DWARF_LOG_INFO(format, ...) +-#define DWARF_LOG_DEBUG(format, ...) +-#define DWARF_LOG_TRACE(format, ...) +-#endif +- + typedef Elf64_Half Elf_Half; + typedef Elf64_Word Elf_Word; + typedef Elf64_Off Elf_Off; +@@ -93,6 +72,26 @@ typedef Elf32_Sym Elf_Sym; + #include "memory/allocation.hpp" + #include "utilities/decoder.hpp" + ++#ifdef ASSERT ++// Helper macros to print different log levels during DWARF parsing ++#define DWARF_LOG_SUMMARY(format, ...) DWARF_LOG_WITH_LEVEL(1, format, ##__VA_ARGS__) // Same level as error logging ++#define DWARF_LOG_ERROR(format, ...) DWARF_LOG_WITH_LEVEL(1, format, ##__VA_ARGS__) ++#define DWARF_LOG_INFO(format, ...) DWARF_LOG_WITH_LEVEL(2, format, ##__VA_ARGS__) ++#define DWARF_LOG_DEBUG(format, ...) DWARF_LOG_WITH_LEVEL(3, format, ##__VA_ARGS__) ++#define DWARF_LOG_TRACE(format, ...) DWARF_LOG_WITH_LEVEL(4, format, ##__VA_ARGS__) ++ ++#define DWARF_LOG_WITH_LEVEL(level, format, ...) \ ++ if (TraceDwarfLevel >= level) { \ ++ tty->print("[dwarf] "); \ ++ tty->print_cr(format, ##__VA_ARGS__); \ ++ } ++#else ++#define DWARF_LOG_SUMMARY(format, ...) ++#define DWARF_LOG_ERROR(format, ...) ++#define DWARF_LOG_INFO(format, ...) ++#define DWARF_LOG_DEBUG(format, ...) ++#define DWARF_LOG_TRACE(format, ...) ++#endif + + class ElfStringTable; + class ElfSymbolTable; +-- +2.22.0 + diff --git a/openjdk-1.8.0.spec b/openjdk-1.8.0.spec index 704ab5e..3f11162 100644 --- a/openjdk-1.8.0.spec +++ b/openjdk-1.8.0.spec @@ -916,7 +916,7 @@ Provides: java-%{javaver}-%{origin}-accessibility%{?1} = %{epoch}:%{version}-%{r Name: java-%{javaver}-%{origin} Version: %{javaver}.%{updatever}.%{buildver} -Release: 1 +Release: 2 # java-1.5.0-ibm from jpackage.org set Epoch to 1 for unknown reasons # and this change was brought into RHEL-4. java-1.5.0-ibm packages # also included the epoch in their virtual provides. This created a @@ -1180,7 +1180,10 @@ Patch295: Fix-AsyncGCLog-s-content-consistent-bug.patch # 8u362 Patch296: 8178968-AArch64-Remove-non-standard-code-cache-size.patch Patch297: 8185736-missing-default-exception-handler-in-calls-t.patch - +Patch298: Add-CMS-s-trim-test-cases-and-fix-failure.patch +Patch299: Disable-cds-on-x86-32.patch +Patch300: Disable-no-compressedOop-cds-on-x86-32.patch +Patch301: fix-SUSE-x86_32-build-failure.patch ############################################# # @@ -1699,6 +1702,10 @@ pushd %{top_level_dir_name} %patch295 -p1 %patch296 -p1 %patch297 -p1 +%patch298 -p1 +%patch299 -p1 +%patch300 -p1 +%patch301 -p1 popd # System library fixes @@ -2323,6 +2330,12 @@ cjc.mainProgram(arg) %endif %changelog +* Wed Feb 15 2023 kuenking111 - 1:1.8.0.362-b09.2 +- add Add-CMS-s-trim-test-cases-and-fix-failure.patch +- add Disable-cds-on-x86-32.patch +- add Disable-no-compressedOop-cds-on-x86-32.patch +- add fix-SUSE-x86_32-build-failure.patch + * Mon Jan 30 2023 kuenking111 - 1:1.8.0.362-b09.1 - add 8178968-AArch64-Remove-non-standard-code-cache-size.patch - add 8185736-missing-default-exception-handler-in-calls-t.patch