--- 25-akpm/fs/buffer.c | 5 ++++- 25-akpm/include/linux/blkdev.h | 2 +- 25-akpm/mm/filemap.c | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff -puN fs/buffer.c~per-backing_dev-unplugging-block_sync_page-fix fs/buffer.c --- 25/fs/buffer.c~per-backing_dev-unplugging-block_sync_page-fix 2004-03-14 13:07:33.992736096 -0800 +++ 25-akpm/fs/buffer.c 2004-03-14 13:07:34.000734880 -0800 @@ -2928,7 +2928,10 @@ EXPORT_SYMBOL(try_to_free_buffers); int block_sync_page(struct page *page) { - blk_run_address_space(page->mapping); + struct address_space *mapping; + smp_mb(); + mapping = page->mapping; + blk_run_address_space(mapping); return 0; } diff -puN include/linux/blkdev.h~per-backing_dev-unplugging-block_sync_page-fix include/linux/blkdev.h --- 25/include/linux/blkdev.h~per-backing_dev-unplugging-block_sync_page-fix 2004-03-14 13:07:33.993735944 -0800 +++ 25-akpm/include/linux/blkdev.h 2004-03-14 13:07:34.002734576 -0800 @@ -527,7 +527,7 @@ static inline request_queue_t *bdev_get_ static inline void blk_run_backing_dev(struct backing_dev_info *bdi) { - if (bdi) + if (bdi && bdi->unplug_io_fn) bdi->unplug_io_fn(bdi); } diff -puN mm/filemap.c~per-backing_dev-unplugging-block_sync_page-fix mm/filemap.c --- 25/mm/filemap.c~per-backing_dev-unplugging-block_sync_page-fix 2004-03-14 13:07:33.995735640 -0800 +++ 25-akpm/mm/filemap.c 2004-03-14 13:07:34.002734576 -0800 @@ -118,8 +118,10 @@ void remove_from_page_cache(struct page static inline int sync_page(struct page *page) { - struct address_space *mapping = page->mapping; + struct address_space *mapping; + smp_mb(); + mapping = page->mapping; if (mapping && mapping->a_ops && mapping->a_ops->sync_page) return mapping->a_ops->sync_page(page); return 0; _