Commit e7a121e3 authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Greg Kroah-Hartman
Browse files

dax: Avoid losing wakeup in dax_lock_mapping_entry



commit 25bbe21b upstream.

After calling get_unlocked_entry(), you have to call
put_unlocked_entry() to avoid subsequent waiters losing wakeups.

Fixes: c2a7d2a1 ("filesystem-dax: Introduce dax_lock_mapping_entry()")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9dec3855
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -217,6 +217,9 @@ static inline void *unlock_slot(struct address_space *mapping, void **slot)
	return (void *)entry;
}

static void put_unlocked_mapping_entry(struct address_space *mapping,
				       pgoff_t index, void *entry);

/*
 * Lookup entry in radix tree, wait for it to become unlocked if it is
 * exceptional entry and return it. The caller must call
@@ -256,10 +259,12 @@ static void *__get_unlocked_mapping_entry(struct address_space *mapping,
		revalidate = wait_fn();
		finish_wait(wq, &ewait.wait);
		xa_lock_irq(&mapping->i_pages);
		if (revalidate)
		if (revalidate) {
			put_unlocked_mapping_entry(mapping, index, entry);
			return ERR_PTR(-EAGAIN);
		}
	}
}

static bool entry_wait(void)
{