On Fri, Sep 24, 2021 at 09:09:59PM +0800, Shiyang Ruan wrote: > For reflinked files, one dax page may be associated more than once with > different fime mapping and index. It will report warning. Now, since > we have introduced dax-RMAP for this case and also have to keep its > functionality for other filesystems who are not support rmap, I add this > exception here. > > Signed-off-by: Shiyang Ruan <ruansy.fnst@xxxxxxxxxxx> > --- > fs/dax.c | 14 ++++++++------ > 1 file changed, 8 insertions(+), 6 deletions(-) > > diff --git a/fs/dax.c b/fs/dax.c > index 2536c105ec7f..1a57211b1bc9 100644 > --- a/fs/dax.c > +++ b/fs/dax.c > @@ -352,9 +352,10 @@ static void dax_associate_entry(void *entry, struct address_space *mapping, > for_each_mapped_pfn(entry, pfn) { > struct page *page = pfn_to_page(pfn); > > - WARN_ON_ONCE(page->mapping); > - page->mapping = mapping; > - page->index = index + i++; > + if (!page->mapping) { > + page->mapping = mapping; > + page->index = index + i++; It feels a little dangerous to have page->mapping for shared storage point to an actual address_space when there are really multiple potential address_spaces out there. If the mm or dax folks are ok with doing this this way then I'll live with it, but it seems like you'd want to leave /some/ kind of marker once you know that the page has multiple owners and therefore regular mm rmap via page->mapping won't work. --D > + } > } > } > > @@ -370,9 +371,10 @@ static void dax_disassociate_entry(void *entry, struct address_space *mapping, > struct page *page = pfn_to_page(pfn); > > WARN_ON_ONCE(trunc && page_ref_count(page) > 1); > - WARN_ON_ONCE(page->mapping && page->mapping != mapping); > - page->mapping = NULL; > - page->index = 0; > + if (page->mapping == mapping) { > + page->mapping = NULL; > + page->index = 0; > + } > } > } > > -- > 2.33.0 > > >