logfs: fix deadlock in logfs_get_wblocks, hold and wait on super->s_write_mutex
authorPrasad Joshi <[email protected]>
Wed, 22 Dec 2010 01:24:19 +0000 (17:24 -0800)
committerLinus Torvalds <[email protected]>
Thu, 23 Dec 2010 03:43:33 +0000 (19:43 -0800)
do_logfs_journal_wl_pass() should use GFP_NOFS for memory allocation GC
code calls btree_insert32 with GFP_KERNEL while holding a mutex
super->s_write_mutex.

The same mutex is used in address_space_operations->writepage(), and a
call to writepage() could be triggered as a result of memory allocation
in btree_insert32, causing a deadlock.

Addresses https://bugzilla.kernel.org/show_bug.cgi?id=20342

Signed-off-by: Prasad Joshi <[email protected]>
Cc: Joern Engel <[email protected]>
Cc: Florian Mickler <[email protected]>
Cc: "Rafael J. Wysocki" <[email protected]>
Cc: Maciej Rutecki <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
fs/logfs/journal.c

index f46ee8b0e135eb62d00e45dc30bbee31c61c213a..9da29706f91cd74772169e6391333ae877a1fa05 100644 (file)
@@ -828,7 +828,7 @@ void do_logfs_journal_wl_pass(struct super_block *sb)
                super->s_journal_seg[i] = segno;
                super->s_journal_ec[i] = ec;
                logfs_set_segment_reserved(sb, segno);
-               err = btree_insert32(head, segno, (void *)1, GFP_KERNEL);
+               err = btree_insert32(head, segno, (void *)1, GFP_NOFS);
                BUG_ON(err); /* mempool should prevent this */
                err = logfs_erase_segment(sb, segno, 1);
                BUG_ON(err); /* FIXME: remount-ro would be nicer */