On Fri, 22 May 2020 09:18:25 +0200 Guoqing Jiang <guoqing.jiang@xxxxxxxxxxxxxxx> wrote: > >> - ClearPagePrivate(page); > >> - set_page_private(newpage, page_private(page)); > >> - set_page_private(page, 0); > >> - put_page(page); > >> + set_page_private(newpage, detach_page_private(page)); > > attach_page_private(newpage, detach_page_private(page)); > > Mattew had suggested it as follows, but not sure if we can reorder of > the setup of > the bh and setting PagePrivate, so I didn't want to break the original > syntax. > > @@ -797,11 +797,7 @@ static int __buffer_migrate_page(struct address_space *mapping, > if (rc != MIGRATEPAGE_SUCCESS) > goto unlock_buffers; > > - ClearPagePrivate(page); > - set_page_private(newpage, page_private(page)); > - set_page_private(page, 0); > - put_page(page); > - get_page(newpage); > + attach_page_private(newpage, detach_page_private(page)); > > bh = head; > do { > @@ -810,8 +806,6 @@ static int __buffer_migrate_page(struct address_space *mapping, > > } while (bh != head); > > - SetPagePrivate(newpage); > - > if (mode != MIGRATE_SYNC_NO_COPY) This is OK - coherency between PG_private and the page's buffer ring is maintained by holding lock_page(). I have (effectively) applied the above change.