]> git.hungrycats.org Git - linux/commitdiff
[PATCH] blk_run_page() race fix
authorAndrew Morton <akpm@osdl.org>
Wed, 19 May 2004 09:32:47 +0000 (02:32 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 19 May 2004 09:32:47 +0000 (02:32 -0700)
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.

fs/buffer.c
include/linux/blkdev.h

index 8c6abdcb22cf6b4f196bca1da50bf6c93b5f1a2c..9f76190d4654503532c770f4aaec13dbb3083fab 100644 (file)
@@ -2960,7 +2960,12 @@ EXPORT_SYMBOL(try_to_free_buffers);
 
 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;
 }
 
index 03018e2f974a3f324b475e126c80376a3aa9cfc6..020a72f207426488f45991110b32a402c0904881 100644 (file)
@@ -545,16 +545,6 @@ static inline void blk_run_address_space(struct address_space *mapping)
                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.