diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2010-10-18 08:32:35 +0300 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2010-10-21 11:15:18 +0300 |
commit | 3601ba27353a968df843454e4b81155376682505 (patch) | |
tree | 144263a6c1d1255f260788da3d8f5593e2ad6bb4 /fs/ubifs/super.c | |
parent | 39037559e651c417fb68b828926dc61cd5d6e5e2 (diff) | |
download | lwn-3601ba27353a968df843454e4b81155376682505.tar.gz lwn-3601ba27353a968df843454e4b81155376682505.zip |
UBIFS: do not forget to cancel timers
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>
Diffstat (limited to 'fs/ubifs/super.c')
-rw-r--r-- | fs/ubifs/super.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 6ff2f802bd7e..9a47c9f0ad07 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -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); } } |