diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-04-12 03:31:46 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-10-07 12:36:09 -0800 |
commit | 9e453c46ce8b1c24d1e1b5e7b7c86f9abd4676d3 (patch) | |
tree | 372e0756be84d0258314c45ee17a7307228830f9 | |
parent | e139a254a229af7d00612bd9b2080a556d7e7e67 (diff) |
bcachefs: fix a deadlock
pagecache add lock/page lock locking inversion
-rw-r--r-- | drivers/md/bcache/fs-io.c | 6 |
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; } |