Patch "jffs2: Fix page lock / f->sem deadlock" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
jffs2: Fix page lock / f->sem deadlock
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
jffs2-fix-page-lock-f-sem-deadlock.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
49e91e7079febe59a20ca885a87dd1c54240d0f1Mon Sep 17 00:00:00 2001
From: David Woodhouse <[email protected]>
Date: Mon, 1 Feb 2016 12:37:20 +0000
Subject: jffs2: Fix page lock / f->sem deadlock
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: David Woodhouse <[email protected]>
commit 49e91e7079febe59a20ca885a87dd1c54240d0f1 upstream.
With this fix, all code paths should now be obtaining the page lock before f->sem.
--- fs/jffs2/README.Locking | 5 +---- fs/jffs2/gc.c | 17 ++++++++++------- 2 files changed, 11 insertions(+), 11 deletions(-)
fs/jffs2/README.Locking +1 -4
@@ -2,10 +2,6 @@ JFFS2 LOCKING DOCUMENTATION --------------------------- -At least theoretically, JFFS2 does not require the Big Kernel Lock -(BKL), which was always helpfully obtained for it by Linux 2.4 VFS -code. It has its own locking, as described below. - This document attempts to describe the existing locking rules for JFFS2. It is not expected to remain perfectly up to date, but ought to be fairly close.
@@ -69,6 +65,7 @@ Ordering constraints: any f->sem held. 2. Never attempt to lock two file mutexes in one thread. No ordering rules have been made for doing so. + 3. Never lock a page cache page with f->sem held. erase_completion_lock spinlock
fs/jffs2/gc.c +10 -7
@@ -1296,14 +1296,17 @@ static int jffs2_garbage_collect_dnode(sBUG_ON (start > orig_start); } -/* First, use readpage() to read the appropriate page into the page cache */ -/* Q: What happens if we actually try to GC the _same_ page for which commit_write() -* triggered garbage collection in the first place? -* A: I _think_ it's OK. read_cache_page shouldn't deadlock, we'll write out the -* page OK. We'll actually write it out again in commit_write, which is a little -* suboptimal, but at least we're correct. -*/ +/* The rules state that we must obtain the page lock *before* f->sem, so +* drop f->sem temporarily. Since we also hold c->alloc_sem, nothing's +* actually going to *change* so we're safe; we only allow reading. +* +* It is important to note that jffs2_write_begin() will ensure that its +* page is marked Uptodate before allocating space. That means that if we +* end up here trying to GC the *same* page that jffs2_write_begin() is +* trying to write out, read_cache_page() will not deadlock. */ +mutex_unlock (&f->sem); pg_ptr =jffs2_gc_fetch_page (c, f, start, &pg); +mutex_lock (&f->sem);if (IS_ERR (pg_ptr)) { pr_warn("read_cache_page() returned error: %ld\n",
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/revert-jffs2-fix-lock-acquisition-order-bug-in-jffs2_write_begin.patch queue-3.14/jffs2-fix-page-lock-f-sem-deadlock.patch queue-3.14/fix-directory-hardlinks-from-deleted-directories.patch