Dan Williams dan.j.williams@intel.com writes:
Check for NULL entries before checking the entry order, otherwise NULL is misinterpreted as a present pte conflict. The 'order' check needs to happen before the locked check as an unlocked entry at the wrong order must fallback to lookup the correct order.
Please include the user-visible effects of the problem in the changelog.
Thanks, Jeff
Reported-by: Jeff Smits jeff.smits@intel.com Reported-by: Doug Nelson doug.nelson@intel.com Cc: stable@vger.kernel.org Fixes: 23c84eb78375 ("dax: Fix missed wakeup with PMD faults") Cc: Jan Kara jack@suse.cz Cc: Matthew Wilcox (Oracle) willy@infradead.org Signed-off-by: Dan Williams dan.j.williams@intel.com
fs/dax.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/fs/dax.c b/fs/dax.c index a71881e77204..08160011d94c 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -221,10 +221,11 @@ static void *get_unlocked_entry(struct xa_state *xas, unsigned int order) for (;;) { entry = xas_find_conflict(xas);
if (!entry || WARN_ON_ONCE(!xa_is_value(entry)))
if (dax_entry_order(entry) < order) return XA_RETRY_ENTRY;return entry;
if (!entry || WARN_ON_ONCE(!xa_is_value(entry)) ||
!dax_is_locked(entry))
if (!dax_is_locked(entry)) return entry;
wq = dax_entry_waitqueue(xas, entry, &ewait.key);