]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 7 Jun 2025 07:24:09 +0000 (09:24 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 7 Jun 2025 07:24:09 +0000 (09:24 +0200)
added patches:
orangefs-adjust-counting-code-to-recover-from-665575cf.patch
rtc-fix-offset-calculation-for-.start_secs-0.patch
rtc-make-rtc_time64_to_tm-support-dates-before-1970.patch

queue-6.14/orangefs-adjust-counting-code-to-recover-from-665575cf.patch [new file with mode: 0644]
queue-6.14/rtc-fix-offset-calculation-for-.start_secs-0.patch [new file with mode: 0644]
queue-6.14/rtc-make-rtc_time64_to_tm-support-dates-before-1970.patch [new file with mode: 0644]
queue-6.14/series

diff --git a/queue-6.14/orangefs-adjust-counting-code-to-recover-from-665575cf.patch b/queue-6.14/orangefs-adjust-counting-code-to-recover-from-665575cf.patch
new file mode 100644 (file)
index 0000000..4250fe6
--- /dev/null
@@ -0,0 +1,56 @@
+From hubcap@kernel.org  Sat Jun  7 09:09:20 2025
+From: hubcap@kernel.org
+Date: Wed,  4 Jun 2025 11:23:02 -0400
+Subject: orangefs: adjust counting code to recover from 665575cf
+To: stable@vger.kernel.org
+Cc: Mike Marshall <hubcap@omnibond.com>, hubcapsc@gmail.com
+Message-ID: <20250604152308.216963-2-hubcap@kernel.org>
+
+From: Mike Marshall <hubcap@omnibond.com>
+
+A late commit to 6.14-rc7 (665575cf) broke orangefs. This is a several line
+adjustment to some counters needed to keep orangefs from deadlocking
+when writing page cache data out to the filesystem.
+
+Signed-off-by: Mike Marshall <hubcap@omnibond.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/orangefs/inode.c |    9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+--- a/fs/orangefs/inode.c
++++ b/fs/orangefs/inode.c
+@@ -32,12 +32,13 @@ static int orangefs_writepage_locked(str
+       len = i_size_read(inode);
+       if (PagePrivate(page)) {
+               wr = (struct orangefs_write_range *)page_private(page);
+-              WARN_ON(wr->pos >= len);
+               off = wr->pos;
+-              if (off + wr->len > len)
++              if ((off + wr->len > len) && (off <= len))
+                       wlen = len - off;
+               else
+                       wlen = wr->len;
++              if (wlen == 0)
++                      wlen = wr->len;
+       } else {
+               WARN_ON(1);
+               off = page_offset(page);
+@@ -46,8 +47,6 @@ static int orangefs_writepage_locked(str
+               else
+                       wlen = PAGE_SIZE;
+       }
+-      /* Should've been handled in orangefs_invalidate_folio. */
+-      WARN_ON(off == len || off + wlen > len);
+       WARN_ON(wlen == 0);
+       bvec_set_page(&bv, page, wlen, off % PAGE_SIZE);
+@@ -340,6 +339,8 @@ static int orangefs_write_begin(struct f
+                       wr->len += len;
+                       goto okay;
+               } else {
++                      wr->pos = pos;
++                      wr->len = len;
+                       ret = orangefs_launder_folio(folio);
+                       if (ret)
+                               return ret;
diff --git a/queue-6.14/rtc-fix-offset-calculation-for-.start_secs-0.patch b/queue-6.14/rtc-fix-offset-calculation-for-.start_secs-0.patch
new file mode 100644 (file)
index 0000000..b0dcc2d
--- /dev/null
@@ -0,0 +1,54 @@
+From fe9f5f96cfe8b82d0f24cbfa93718925560f4f8d Mon Sep 17 00:00:00 2001
+From: Alexandre Mergnat <amergnat@baylibre.com>
+Date: Mon, 28 Apr 2025 12:06:48 +0200
+Subject: rtc: Fix offset calculation for .start_secs < 0
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Alexandre Mergnat <amergnat@baylibre.com>
+
+commit fe9f5f96cfe8b82d0f24cbfa93718925560f4f8d upstream.
+
+The comparison
+
+        rtc->start_secs > rtc->range_max
+
+has a signed left-hand side and an unsigned right-hand side.
+So the comparison might become true for negative start_secs which is
+interpreted as a (possibly very large) positive value.
+
+As a negative value can never be bigger than an unsigned value
+the correct representation of the (mathematical) comparison
+
+        rtc->start_secs > rtc->range_max
+
+in C is:
+
+        rtc->start_secs >= 0 && rtc->start_secs > rtc->range_max
+
+Use that to fix the offset calculation currently used in the
+rtc-mt6397 driver.
+
+Fixes: 989515647e783 ("rtc: Add one offset seconds to expand RTC range")
+Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
+Reviewed-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
+Link: https://lore.kernel.org/r/20250428-enable-rtc-v4-2-2b2f7e3f9349@baylibre.com
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/rtc/class.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/rtc/class.c
++++ b/drivers/rtc/class.c
+@@ -327,7 +327,7 @@ static void rtc_device_get_offset(struct
+        *
+        * Otherwise the offset seconds should be 0.
+        */
+-      if (rtc->start_secs > rtc->range_max ||
++      if ((rtc->start_secs >= 0 && rtc->start_secs > rtc->range_max) ||
+           rtc->start_secs + range_secs - 1 < rtc->range_min)
+               rtc->offset_secs = rtc->start_secs - rtc->range_min;
+       else if (rtc->start_secs > rtc->range_min)
diff --git a/queue-6.14/rtc-make-rtc_time64_to_tm-support-dates-before-1970.patch b/queue-6.14/rtc-make-rtc_time64_to_tm-support-dates-before-1970.patch
new file mode 100644 (file)
index 0000000..b4a42d1
--- /dev/null
@@ -0,0 +1,85 @@
+From 7df4cfef8b351fec3156160bedfc7d6d29de4cce Mon Sep 17 00:00:00 2001
+From: Alexandre Mergnat <amergnat@baylibre.com>
+Date: Mon, 28 Apr 2025 12:06:47 +0200
+Subject: rtc: Make rtc_time64_to_tm() support dates before 1970
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Alexandre Mergnat <amergnat@baylibre.com>
+
+commit 7df4cfef8b351fec3156160bedfc7d6d29de4cce upstream.
+
+Conversion of dates before 1970 is still relevant today because these
+dates are reused on some hardwares to store dates bigger than the
+maximal date that is representable in the device's native format.
+This prominently and very soon affects the hardware covered by the
+rtc-mt6397 driver that can only natively store dates in the interval
+1900-01-01 up to 2027-12-31. So to store the date 2028-01-01 00:00:00
+to such a device, rtc_time64_to_tm() must do the right thing for
+time=-2208988800.
+
+Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
+Reviewed-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
+Link: https://lore.kernel.org/r/20250428-enable-rtc-v4-1-2b2f7e3f9349@baylibre.com
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/rtc/lib.c |   24 +++++++++++++++++++-----
+ 1 file changed, 19 insertions(+), 5 deletions(-)
+
+--- a/drivers/rtc/lib.c
++++ b/drivers/rtc/lib.c
+@@ -46,24 +46,38 @@ EXPORT_SYMBOL(rtc_year_days);
+  * rtc_time64_to_tm - converts time64_t to rtc_time.
+  *
+  * @time:     The number of seconds since 01-01-1970 00:00:00.
+- *            (Must be positive.)
++ *            Works for values since at least 1900
+  * @tm:               Pointer to the struct rtc_time.
+  */
+ void rtc_time64_to_tm(time64_t time, struct rtc_time *tm)
+ {
+-      unsigned int secs;
+-      int days;
++      int days, secs;
+       u64 u64tmp;
+       u32 u32tmp, udays, century, day_of_century, year_of_century, year,
+               day_of_year, month, day;
+       bool is_Jan_or_Feb, is_leap_year;
+-      /* time must be positive */
++      /*
++       * Get days and seconds while preserving the sign to
++       * handle negative time values (dates before 1970-01-01)
++       */
+       days = div_s64_rem(time, 86400, &secs);
++      /*
++       * We need 0 <= secs < 86400 which isn't given for negative
++       * values of time. Fixup accordingly.
++       */
++      if (secs < 0) {
++              days -= 1;
++              secs += 86400;
++      }
++
+       /* day of the week, 1970-01-01 was a Thursday */
+       tm->tm_wday = (days + 4) % 7;
++      /* Ensure tm_wday is always positive */
++      if (tm->tm_wday < 0)
++              tm->tm_wday += 7;
+       /*
+        * The following algorithm is, basically, Proposition 6.3 of Neri
+@@ -93,7 +107,7 @@ void rtc_time64_to_tm(time64_t time, str
+        * thus, is slightly different from [1].
+        */
+-      udays           = ((u32) days) + 719468;
++      udays           = days + 719468;
+       u32tmp          = 4 * udays + 3;
+       century         = u32tmp / 146097;
index a3818dace48d39f00aab0fd4470f2e926b67539f..3e106f15f13d195bac293bb953f6b03be46b095c 100644 (file)
@@ -4,3 +4,6 @@ pinctrl-armada-37xx-set-gpio-output-value-before-setting-direction.patch
 clk-samsung-correct-clock-summary-for-hsi1-block.patch
 acpi-cpufreq-fix-nominal_freq-units-to-khz-in-get_max_boost_ratio.patch
 documentation-acpi-use-all-string-data-node-references.patch
+rtc-make-rtc_time64_to_tm-support-dates-before-1970.patch
+rtc-fix-offset-calculation-for-.start_secs-0.patch
+orangefs-adjust-counting-code-to-recover-from-665575cf.patch