]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 26 Mar 2013 18:38:12 +0000 (11:38 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 26 Mar 2013 18:38:12 +0000 (11:38 -0700)
added patches:
nohz-make-tick_nohz_irq_exit-irq-safe.patch
udf-fix-bitmap-overflow-on-large-filesystems-with-small-block-size.patch

queue-3.4/nohz-make-tick_nohz_irq_exit-irq-safe.patch [new file with mode: 0644]
queue-3.4/series
queue-3.4/udf-fix-bitmap-overflow-on-large-filesystems-with-small-block-size.patch [new file with mode: 0644]

diff --git a/queue-3.4/nohz-make-tick_nohz_irq_exit-irq-safe.patch b/queue-3.4/nohz-make-tick_nohz_irq_exit-irq-safe.patch
new file mode 100644 (file)
index 0000000..6934c74
--- /dev/null
@@ -0,0 +1,68 @@
+From e5ab012c3271990e8457055c25cafddc1ae8aa6b Mon Sep 17 00:00:00 2001
+From: Frederic Weisbecker <fweisbec@gmail.com>
+Date: Wed, 20 Feb 2013 16:15:36 +0100
+Subject: nohz: Make tick_nohz_irq_exit() irq safe
+
+From: Frederic Weisbecker <fweisbec@gmail.com>
+
+commit e5ab012c3271990e8457055c25cafddc1ae8aa6b upstream.
+
+As it stands, irq_exit() may or may not be called with
+irqs disabled, depending on __ARCH_IRQ_EXIT_IRQS_DISABLED
+that the arch can define.
+
+It makes tick_nohz_irq_exit() unsafe. For example two
+interrupts can race in tick_nohz_stop_sched_tick(): the inner
+most one computes the expiring time on top of the timer list,
+then it's interrupted right before reprogramming the
+clock. The new interrupt enqueues a new timer list timer,
+it reprogram the clock to take it into account and it exits.
+The CPUs resumes the inner most interrupt and performs the clock
+reprogramming without considering the new timer list timer.
+
+This regression has been introduced by:
+     280f06774afedf849f0b34248ed6aff57d0f6908
+     ("nohz: Separate out irq exit and idle loop dyntick logic")
+
+Let's fix it right now with the appropriate protections.
+
+A saner long term solution will be to remove
+__ARCH_IRQ_EXIT_IRQS_DISABLED and mandate that irq_exit() is called
+with interrupts disabled.
+
+Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Ingo Molnar <mingo@kernel.org>
+Cc: Linus Torvalds <torvalds@linuxfoundation.org>
+Link: http://lkml.kernel.org/r/1361373336-11337-1-git-send-email-fweisbec@gmail.com
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Lingzhu Xiang <lxiang@redhat.com>
+Reviewed-by: CAI Qian <caiqian@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/time/tick-sched.c |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/kernel/time/tick-sched.c
++++ b/kernel/time/tick-sched.c
+@@ -496,12 +496,17 @@ void tick_nohz_idle_enter(void)
+  */
+ void tick_nohz_irq_exit(void)
+ {
++      unsigned long flags;
+       struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
+       if (!ts->inidle)
+               return;
++      local_irq_save(flags);
++
+       tick_nohz_stop_sched_tick(ts);
++
++      local_irq_restore(flags);
+ }
+ /**
index 61cc2a5af1c6aa6462cda187f5e72ec1cde144a6..bcd1b918ba8c649fa34ec5657175975551fb4056 100644 (file)
@@ -58,3 +58,5 @@ usb-xhci-fix-bit-definitions-for-iman-register.patch
 usb-xhci-correctly-enable-interrupts.patch
 usb-cdc-acm-fix-device-unregistration.patch
 usb-serial-fix-interface-refcounting.patch
+nohz-make-tick_nohz_irq_exit-irq-safe.patch
+udf-fix-bitmap-overflow-on-large-filesystems-with-small-block-size.patch
diff --git a/queue-3.4/udf-fix-bitmap-overflow-on-large-filesystems-with-small-block-size.patch b/queue-3.4/udf-fix-bitmap-overflow-on-large-filesystems-with-small-block-size.patch
new file mode 100644 (file)
index 0000000..d13bd73
--- /dev/null
@@ -0,0 +1,38 @@
+From 89b1f39eb4189de745fae554b0d614d87c8d5c63 Mon Sep 17 00:00:00 2001
+From: Jan Kara <jack@suse.cz>
+Date: Tue, 5 Feb 2013 13:59:56 +0100
+Subject: udf: Fix bitmap overflow on large filesystems with small block size
+
+From: Jan Kara <jack@suse.cz>
+
+commit 89b1f39eb4189de745fae554b0d614d87c8d5c63 upstream.
+
+For large UDF filesystems with 512-byte blocks the number of necessary
+bitmap blocks is larger than 2^16 so s_nr_groups in udf_bitmap overflows
+(the number will overflow for filesystems larger than 128 GB with
+512-byte blocks). That results in ENOSPC errors despite the filesystem
+has plenty of free space.
+
+Fix the problem by changing s_nr_groups' type to 'int'. That is enough
+even for filesystems 2^32 blocks (UDF maximum) and 512-byte blocksize.
+
+Reported-and-tested-by: v10lator@myway.de
+Signed-off-by: Jan Kara <jack@suse.cz>
+Cc: Jim Trigg <jtrigg@spamcop.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/udf/udf_sb.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/fs/udf/udf_sb.h
++++ b/fs/udf/udf_sb.h
+@@ -82,7 +82,7 @@ struct udf_virtual_data {
+ struct udf_bitmap {
+       __u32                   s_extLength;
+       __u32                   s_extPosition;
+-      __u16                   s_nr_groups;
++      int                     s_nr_groups;
+       struct buffer_head      **s_block_bitmap;
+ };