blk_run_page() is incorrectly using page->mapping, which makes it racy against
removal from swapcache.
Make block_sync_page() use page_mapping(), and remove bkl_run_page(), which
only had one caller.
int block_sync_page(struct page *page)
{
- blk_run_page(page);
+ struct address_space *mapping;
+
+ smp_mb();
+ mapping = page_mapping(page);
+ if (mapping)
+ blk_run_backing_dev(mapping->backing_dev_info, page);
return 0;
}
blk_run_backing_dev(mapping->backing_dev_info, NULL);
}
-static inline void blk_run_page(struct page *page)
-{
- struct address_space *mapping;
-
- smp_mb();
- mapping = page->mapping;
- if (mapping)
- blk_run_backing_dev(mapping->backing_dev_info, page);
-}
-
/*
* end_request() and friends. Must be called with the request queue spinlock
* acquired. All functions called within end_request() _must_be_ atomic.