dax: Avoid losing wakeup in dax_lock_mapping_entry
commit 25bbe21bf427a81b8e3ccd480ea0e1d940256156 upstream. After calling get_unlocked_entry(), you have to call put_unlocked_entry() to avoid subsequent waiters losing wakeups. Fixes: c2a7d2a11552 ("filesystem-dax: Introduce dax_lock_mapping_entry()") Cc: stable@vger.kernel.org Signed-off-by: Matthew Wilcox <willy@infradead.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
9dec38554a
commit
e7a121e34c
7
fs/dax.c
7
fs/dax.c
@ -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,8 +259,10 @@ 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user