dax: Fix deadlock in dax_lock_mapping_entry()
authorJan Kara <jack@suse.cz>
Thu, 27 Sep 2018 11:23:32 +0000 (13:23 +0200)
committerDan Williams <dan.j.williams@intel.com>
Thu, 27 Sep 2018 17:56:15 +0000 (10:56 -0700)
When dax_lock_mapping_entry() has to sleep to obtain entry lock, it will
fail to unlock mapping->i_pages spinlock and thus immediately deadlock
against itself when retrying to grab the entry lock again. Fix the
problem by unlocking mapping->i_pages before retrying.

Fixes: c2a7d2a11552 ("filesystem-dax: Introduce dax_lock_mapping_entry()")
Reported-by: Barret Rhoden <brho@google.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
fs/dax.c

index f32d7125ad0f237d61173cd72383683ac380c4e4..e4ef8af31aa646fae08dd08010e77d1df57a53d0 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -447,6 +447,7 @@ bool dax_lock_mapping_entry(struct page *page)
                        xa_unlock_irq(&mapping->i_pages);
                        break;
                } else if (IS_ERR(entry)) {
+                       xa_unlock_irq(&mapping->i_pages);
                        WARN_ON_ONCE(PTR_ERR(entry) != -EAGAIN);
                        continue;
                }