UBIFS: do not forget to cancel timers
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Mon, 18 Oct 2010 05:32:35 +0000 (08:32 +0300)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Thu, 21 Oct 2010 08:15:18 +0000 (11:15 +0300)
This is a bug-fix: when we unmount, and we are currently in R/O
mode because of an error - we do not sync write-buffers, which
means we also do not cancel write-buffer timers we may possibly
have armed. This patch fixes the issue.

The issue can easily be reproduced by enabling UBIFS failure debug
mode (echo 4 > /sys/module/ubifs/parameters/debug_tsts) and
unmounting as soon as a failure happen. At some point the system
oopses because we have an armed hrtimer but UBIFS is unmounted
already.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
fs/ubifs/super.c

index 6ff2f802bd7e7aa754dafe96a47886591b8cacda..9a47c9f0ad07e69fddc57f5debc488982aab9429 100644 (file)
@@ -1772,6 +1772,10 @@ static void ubifs_put_super(struct super_block *sb)
                                 */
                                ubifs_err("failed to write master node, "
                                          "error %d", err);
+               } else {
+                       for (i = 0; i < c->jhead_cnt; i++)
+                               /* Make sure write-buffer timers are canceled */
+                               hrtimer_cancel(&c->jheads[i].wbuf.timer);
                }
        }