summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-04-12 03:31:46 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2016-10-07 12:36:09 -0800
commit9e453c46ce8b1c24d1e1b5e7b7c86f9abd4676d3 (patch)
tree372e0756be84d0258314c45ee17a7307228830f9
parente139a254a229af7d00612bd9b2080a556d7e7e67 (diff)
bcachefs: fix a deadlock
pagecache add lock/page lock locking inversion
-rw-r--r--drivers/md/bcache/fs-io.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/md/bcache/fs-io.c b/drivers/md/bcache/fs-io.c
index 471cb0619e4d..635afcb140fa 100644
--- a/drivers/md/bcache/fs-io.c
+++ b/drivers/md/bcache/fs-io.c
@@ -745,6 +745,9 @@ int bch_readpages(struct file *file, struct address_space *mapping,
pr_debug("reading %u pages", nr_pages);
+ if (current->pagecache_lock != &mapping->add_lock)
+ pagecache_add_get(&mapping->add_lock);
+
for_each_readpage_page(mapping, pages, nr_pages, page) {
again:
if (!rbio) {
@@ -767,6 +770,9 @@ again:
if (rbio)
bchfs_read(c, rbio, inode->i_ino);
+ if (current->pagecache_lock != &mapping->add_lock)
+ pagecache_add_put(&mapping->add_lock);
+
pr_debug("success");
return 0;
}