---

 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;

_
