summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-05-14 05:43:07 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-05-14 05:43:07 -0700
commite059d5daf158b1bde61883ee5a091cd4875864a9 (patch)
treeb81340cab05c5405a489115bd442856fdaad7e28 /include/linux
parent485ba3c3b6da6ca02daee0f961fe70beaebd32b3 (diff)
[PATCH] Add blk_run_page()
From: Andrea Arcangeli <andrea@suse.de> 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.
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/backing-dev.h4
-rw-r--r--include/linux/blkdev.h17
2 files changed, 16 insertions, 5 deletions
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h
index 00371734995c..3c369c6553e3 100644
--- a/include/linux/backing-dev.h
+++ b/include/linux/backing-dev.h
@@ -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 --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index e38d901a6526..03018e2f974a 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -532,16 +532,27 @@ static inline request_queue_t *bdev_get_queue(struct block_device *bdev)
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);
}
/*