diff -ru linux-2.6.12.5-orig/fs/ext3/inode.c linux-2.6.12.5/fs/ext3/inode.c --- linux-2.6.12.5-orig/fs/ext3/inode.c 2005-08-15 02:20:18.000000000 +0200 +++ linux-2.6.12.5/fs/ext3/inode.c 2005-08-29 17:20:38.000000000 +0200 @@ -1407,15 +1407,51 @@ goto out; } +/* Stolen from Soeren Sandmann who wrote it for sysprof */ +static ReadCallback read_cb; + static int ext3_readpage(struct file *file, struct page *page) { + if (read_cb) + (* read_cb) (file, page); + return mpage_readpage(page, ext3_get_block); } +int +register_read_callback (ReadCallback cb) +{ + if (read_cb) + return -EBUSY; + read_cb = cb; + return 0; +} + +void +unregister_read_callback (ReadCallback cb) +{ + WARN_ON(cb != read_cb); + read_cb = NULL; + /* make sure all CPU's see the NULL hook */ + synchronize_kernel(); +} + +EXPORT_SYMBOL_GPL(register_read_callback); +EXPORT_SYMBOL_GPL(unregister_read_callback); + static int ext3_readpages(struct file *file, struct address_space *mapping, struct list_head *pages, unsigned nr_pages) { + struct list_head *list; + + if(read_cb) { + list_for_each_prev(list, pages) { + struct page *page = container_of(list, struct page, lru); + (* read_cb) (file, page); + } + } + return mpage_readpages(mapping, pages, nr_pages, ext3_get_block); }