From: Andrea Arcangeli From: Jens Axboe Add blk_run_page() API. This is so that we can pass the target page all the way down to (for example) the swap unplug function. So swap can work out which blockdevs back this particular page. --- 25-akpm/drivers/block/ll_rw_blk.c | 3 + 25-akpm/fs/buffer.c | 12 +----- 25-akpm/include/linux/backing-dev.h | 4 +- 25-akpm/include/linux/blkdev.h | 17 +++++++-- 25-akpm/mm/readahead.c | 2 - 25-akpm/mm/swapfile.c | 66 ++++++++++++++++++++---------------- 6 files changed, 58 insertions(+), 46 deletions(-) diff -puN drivers/block/ll_rw_blk.c~blk_run_page drivers/block/ll_rw_blk.c --- 25/drivers/block/ll_rw_blk.c~blk_run_page 2004-05-12 19:33:14.703114088 -0700 +++ 25-akpm/drivers/block/ll_rw_blk.c 2004-05-12 19:42:36.224749824 -0700 @@ -1147,7 +1147,8 @@ void generic_unplug_device(request_queue } EXPORT_SYMBOL(generic_unplug_device); -static void blk_backing_dev_unplug(struct backing_dev_info *bdi) +static void blk_backing_dev_unplug(struct backing_dev_info *bdi, + struct page *page) { request_queue_t *q = bdi->unplug_io_data; diff -puN fs/buffer.c~blk_run_page fs/buffer.c --- 25/fs/buffer.c~blk_run_page 2004-05-12 19:33:14.704113936 -0700 +++ 25-akpm/fs/buffer.c 2004-05-12 19:52:36.890434760 -0700 @@ -113,12 +113,7 @@ static int bh_wake_function(wait_queue_t static void sync_buffer(struct buffer_head *bh) { - struct block_device *bd; - - smp_mb(); - bd = bh->b_bdev; - if (bd) - blk_run_address_space(bd->bd_inode->i_mapping); + blk_run_page(bh->b_page); } void fastcall __lock_buffer(struct buffer_head *bh) @@ -2960,10 +2955,7 @@ EXPORT_SYMBOL(try_to_free_buffers); int block_sync_page(struct page *page) { - struct address_space *mapping; - smp_mb(); - mapping = page->mapping; - blk_run_address_space(mapping); + blk_run_page(page); return 0; } diff -puN include/linux/backing-dev.h~blk_run_page include/linux/backing-dev.h --- 25/include/linux/backing-dev.h~blk_run_page 2004-05-12 19:33:14.705113784 -0700 +++ 25-akpm/include/linux/backing-dev.h 2004-05-12 19:42:38.790359792 -0700 @@ -28,12 +28,12 @@ struct backing_dev_info { int memory_backed; /* Cannot clean pages with writepage */ congested_fn *congested_fn; /* Function pointer if device is md/dm */ void *congested_data; /* Pointer to aux data for congested func */ - void (*unplug_io_fn)(struct backing_dev_info *); + void (*unplug_io_fn)(struct backing_dev_info *, struct page *); void *unplug_io_data; }; extern struct backing_dev_info default_backing_dev_info; -void default_unplug_io_fn(struct backing_dev_info *bdi); +void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page); int writeback_acquire(struct backing_dev_info *bdi); int writeback_in_progress(struct backing_dev_info *bdi); diff -puN include/linux/blkdev.h~blk_run_page include/linux/blkdev.h --- 25/include/linux/blkdev.h~blk_run_page 2004-05-12 19:33:14.707113480 -0700 +++ 25-akpm/include/linux/blkdev.h 2004-05-12 19:42:38.792359488 -0700 @@ -532,16 +532,27 @@ static inline request_queue_t *bdev_get_ return bdev->bd_disk->queue; } -static inline void blk_run_backing_dev(struct backing_dev_info *bdi) +static inline void blk_run_backing_dev(struct backing_dev_info *bdi, + struct page *page) { if (bdi && bdi->unplug_io_fn) - bdi->unplug_io_fn(bdi); + bdi->unplug_io_fn(bdi, page); } static inline void blk_run_address_space(struct address_space *mapping) { if (mapping) - blk_run_backing_dev(mapping->backing_dev_info); + 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); } /* diff -puN mm/readahead.c~blk_run_page mm/readahead.c --- 25/mm/readahead.c~blk_run_page 2004-05-12 19:33:14.708113328 -0700 +++ 25-akpm/mm/readahead.c 2004-05-12 19:42:40.007174808 -0700 @@ -15,7 +15,7 @@ #include #include -void default_unplug_io_fn(struct backing_dev_info *bdi) +void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) { } EXPORT_SYMBOL(default_unplug_io_fn); diff -puN mm/swapfile.c~blk_run_page mm/swapfile.c --- 25/mm/swapfile.c~blk_run_page 2004-05-12 19:33:14.709113176 -0700 +++ 25-akpm/mm/swapfile.c 2004-05-12 19:52:39.577026336 -0700 @@ -100,7 +101,7 @@ void swap_unplug_io_fn(struct backing_de if (bdev == NULL) break; bdi = bdev->bd_inode->i_mapping->backing_dev_info; - (*bdi->unplug_io_fn)(bdi); + bdi->unplug_io_fn(bdi, page); } up(&swap_bdevs_sem); }