Skip to content

Commit 49e91e7

Browse files
David WoodhouseDavid Woodhouse
authored andcommitted
jffs2: Fix page lock / f->sem deadlock
With this fix, all code paths should now be obtaining the page lock before f->sem. Reported-by: Szabó Tamás <sztomi89@gmail.com> Tested-by: Thomas Betker <thomas.betker@rohde-schwarz.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com> Cc: stable@vger.kernel.org
1 parent 157078f commit 49e91e7

File tree

2 files changed

+11
-11
lines changed

2 files changed

+11
-11
lines changed

fs/jffs2/README.Locking

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@
22
JFFS2 LOCKING DOCUMENTATION
33
---------------------------
44

5-
At least theoretically, JFFS2 does not require the Big Kernel Lock
6-
(BKL), which was always helpfully obtained for it by Linux 2.4 VFS
7-
code. It has its own locking, as described below.
8-
95
This document attempts to describe the existing locking rules for
106
JFFS2. It is not expected to remain perfectly up to date, but ought to
117
be fairly close.
@@ -69,6 +65,7 @@ Ordering constraints:
6965
any f->sem held.
7066
2. Never attempt to lock two file mutexes in one thread.
7167
No ordering rules have been made for doing so.
68+
3. Never lock a page cache page with f->sem held.
7269

7370

7471
erase_completion_lock spinlock

fs/jffs2/gc.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,14 +1296,17 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era
12961296
BUG_ON(start > orig_start);
12971297
}
12981298

1299-
/* First, use readpage() to read the appropriate page into the page cache */
1300-
/* Q: What happens if we actually try to GC the _same_ page for which commit_write()
1301-
* triggered garbage collection in the first place?
1302-
* A: I _think_ it's OK. read_cache_page shouldn't deadlock, we'll write out the
1303-
* page OK. We'll actually write it out again in commit_write, which is a little
1304-
* suboptimal, but at least we're correct.
1305-
*/
1299+
/* The rules state that we must obtain the page lock *before* f->sem, so
1300+
* drop f->sem temporarily. Since we also hold c->alloc_sem, nothing's
1301+
* actually going to *change* so we're safe; we only allow reading.
1302+
*
1303+
* It is important to note that jffs2_write_begin() will ensure that its
1304+
* page is marked Uptodate before allocating space. That means that if we
1305+
* end up here trying to GC the *same* page that jffs2_write_begin() is
1306+
* trying to write out, read_cache_page() will not deadlock. */
1307+
mutex_unlock(&f->sem);
13061308
pg_ptr = jffs2_gc_fetch_page(c, f, start, &pg);
1309+
mutex_lock(&f->sem);
13071310

13081311
if (IS_ERR(pg_ptr)) {
13091312
pr_warn("read_cache_page() returned error: %ld\n",

0 commit comments

Comments
 (0)