FAILED: patch "[PATCH] dax: Fix xarray entry association for mixed mappings" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 1571c029a2ff289683ddb0a32253850363bcb8a7 Mon Sep 17 00:00:00 2001
From: Jan Kara <[email protected]>
Date: Thu, 6 Jun 2019 11:10:28 +0200
Subject: [PATCH] dax: Fix xarray entry association for mixed mappings
When inserting entry into xarray, we store mapping and index in corresponding struct pages for memory error handling. When it happened that one process was mapping file at PMD granularity while another process at PTE granularity, we could wrongly deassociate PMD range and then reassociate PTE range leaving the rest of struct pages in PMD range without mapping information which could later cause missed notifications about memory errors. Fix the problem by calling the association / deassociation code if and only if we are really going to update the xarray (deassociating and associating zero or empty entries is just no-op so there's no reason to complicate the code with trying to avoid the calls for these cases).
fs/dax.c +4 -5
@@ -728,12 +728,11 @@ static void *dax_insert_entry(struct xa_state *xas,xas_reset (xas);xas_lock_irq (xas); -if (dax_entry_size (entry) !=dax_entry_size (new_entry)) { +if (dax_is_zero_entry (entry) ||dax_is_empty_entry (entry)) { +void *old; +dax_disassociate_entry (entry, mapping, false);dax_associate_entry (new_entry, mapping, vmf->vma, vmf->address); - } - -if (dax_is_zero_entry (entry) ||dax_is_empty_entry (entry)) {/* * Only swap our new entry into the page cache if the current * entry is a zero page or an empty entry. If a normal PTE or
@@ -742,7 +741,7 @@ static void *dax_insert_entry(struct xa_state *xas,* existing entry is a PMD, we will just leave the PMD in the * tree and dirty it if necessary. */ -void *old =dax_lock_entry (xas, new_entry); + old =dax_lock_entry (xas, new_entry);WARN_ON_ONCE (old !=xa_mk_value (xa_to_value (entry) |DAX_LOCKED )); entry = new_entry;