From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Piggin Subject: [patch] fs: move code out of buffer.c Date: Fri, 4 Jun 2010 02:55:46 +1000 Message-ID: <20100603165546.GS6822@laptop> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii To: Andrew Morton , Al Viro , Christoph Hellwig , linux-fsdevel@vger.kernel.org Return-path: Received: from cantor.suse.de ([195.135.220.2]:50983 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750958Ab0FCQz6 (ORCPT ); Thu, 3 Jun 2010 12:55:58 -0400 Content-Disposition: inline Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Another step towards decoupling mm/vfs from buffer_head code, and a good cleanup in itself. -- Move invalidate_bdev, block_sync_page into fs/block_dev.c. Export kill_bdev as well, so brd doesn't have to open code it. Reduce buffer_head.h requirement accordingly. Removed a rather large comment from invalidate_bdev, as it looked a bit obsolete to bother moving. The small comment replacing it says enough. --- arch/powerpc/sysdev/axonram.c | 1 block/genhd.c | 1 block/ioctl.c | 2 - drivers/block/amiflop.c | 2 - drivers/block/brd.c | 9 ++--- drivers/block/floppy.c | 1 drivers/block/loop.c | 1 drivers/cdrom/cdrom.c | 1 drivers/char/sysrq.c | 1 drivers/md/dm.c | 1 drivers/md/md.c | 2 - drivers/mtd/devices/block2mtd.c | 1 drivers/s390/block/dasd.c | 1 drivers/s390/char/tape_block.c | 1 drivers/scsi/scsicam.c | 1 drivers/staging/ramzswap/ramzswap_drv.c | 1 fs/block_dev.c | 36 ++++++++++++++++++-- fs/buffer.c | 56 -------------------------------- fs/cachefiles/interface.c | 1 fs/cramfs/inode.c | 1 fs/fs-writeback.c | 1 fs/libfs.c | 2 - fs/quota/dquot.c | 1 fs/quota/quota.c | 1 fs/splice.c | 1 fs/sync.c | 1 include/linux/buffer_head.h | 1 include/linux/fs.h | 3 + kernel/power/swap.c | 1 mm/page-writeback.c | 2 - mm/swap_state.c | 1 31 files changed, 45 insertions(+), 91 deletions(-) Index: linux-2.6/drivers/block/brd.c =================================================================== --- linux-2.6.orig/drivers/block/brd.c +++ linux-2.6/drivers/block/brd.c @@ -16,7 +16,7 @@ #include #include #include -#include /* invalidate_bh_lrus() */ +#include #include #include @@ -359,14 +359,13 @@ static int brd_ioctl(struct block_device error = -EBUSY; if (bdev->bd_openers <= 1) { /* - * Invalidate the cache first, so it isn't written - * back to the device. + * Kill the cache first, so it isn't written back to the + * device. * * Another thread might instantiate more buffercache here, * but there is not much we can do to close that race. */ - invalidate_bh_lrus(); - truncate_inode_pages(bdev->bd_inode->i_mapping, 0); + kill_bdev(bdev); brd_free_pages(brd); error = 0; } Index: linux-2.6/drivers/block/loop.c =================================================================== --- linux-2.6.orig/drivers/block/loop.c +++ linux-2.6/drivers/block/loop.c @@ -68,7 +68,6 @@ #include #include #include -#include /* for invalidate_bdev() */ #include #include #include Index: linux-2.6/drivers/md/md.c =================================================================== --- linux-2.6.orig/drivers/md/md.c +++ linux-2.6/drivers/md/md.c @@ -36,7 +36,7 @@ #include #include #include -#include /* for invalidate_bdev */ +#include #include #include #include Index: linux-2.6/fs/block_dev.c =================================================================== --- linux-2.6.orig/fs/block_dev.c +++ linux-2.6/fs/block_dev.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -62,13 +63,31 @@ static sector_t max_block(struct block_d } /* Kill _all_ buffers and pagecache , dirty or not.. */ -static void kill_bdev(struct block_device *bdev) +void kill_bdev(struct block_device *bdev) { - if (bdev->bd_inode->i_mapping->nrpages == 0) + struct address_space *mapping = bdev->bd_inode->i_mapping; + + if (mapping->nrpages == 0) return; + invalidate_bh_lrus(); - truncate_inode_pages(bdev->bd_inode->i_mapping, 0); + truncate_inode_pages(mapping, 0); } +EXPORT_SYMBOL(kill_bdev); + +/* Invalidate clean unused buffers and pagecache. */ +void invalidate_bdev(struct block_device *bdev) +{ + struct address_space *mapping = bdev->bd_inode->i_mapping; + + if (mapping->nrpages == 0) + return; + + invalidate_bh_lrus(); + lru_add_drain_all(); /* make sure all lru add caches are flushed */ + invalidate_mapping_pages(mapping, 0, -1); +} +EXPORT_SYMBOL(invalidate_bdev); int set_blocksize(struct block_device *bdev, int size) { @@ -1582,6 +1601,17 @@ ssize_t blkdev_aio_write(struct kiocb *i } EXPORT_SYMBOL_GPL(blkdev_aio_write); +void block_sync_page(struct page *page) +{ + struct address_space *mapping; + + smp_mb(); + mapping = page_mapping(page); + if (mapping) + blk_run_backing_dev(mapping->backing_dev_info, page); +} +EXPORT_SYMBOL(block_sync_page); + /* * Try to release a page associated with block device when the system * is under memory pressure. Index: linux-2.6/fs/quota/dquot.c =================================================================== --- linux-2.6.orig/fs/quota/dquot.c +++ linux-2.6/fs/quota/dquot.c @@ -73,7 +73,6 @@ #include #include #include -#include #include #include #include /* for inode_lock, oddly enough.. */ Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c +++ linux-2.6/fs/quota/quota.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include Index: linux-2.6/include/linux/fs.h =================================================================== --- linux-2.6.orig/include/linux/fs.h +++ linux-2.6/include/linux/fs.h @@ -1948,6 +1948,7 @@ extern void bd_set_size(struct block_dev extern void bd_forget(struct inode *inode); extern void bdput(struct block_device *); extern struct block_device *open_by_devnum(dev_t, fmode_t); +extern void kill_bdev(struct block_device *); extern void invalidate_bdev(struct block_device *); extern int sync_blockdev(struct block_device *bdev); extern struct super_block *freeze_bdev(struct block_device *); @@ -1957,6 +1958,7 @@ extern int fsync_bdev(struct block_devic #else static inline void bd_forget(struct inode *inode) {} static inline int sync_blockdev(struct block_device *bdev) { return 0; } +static inline void kill_bdev(struct block_device *bdev) {} static inline void invalidate_bdev(struct block_device *bdev) {} static inline struct super_block *freeze_bdev(struct block_device *sb) @@ -2214,6 +2216,7 @@ extern int generic_segment_checks(const extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos); extern int blkdev_fsync(struct file *filp, int datasync); +extern void block_sync_page(struct page *page); /* fs/splice.c */ extern ssize_t generic_file_splice_read(struct file *, loff_t *, Index: linux-2.6/block/genhd.c =================================================================== --- linux-2.6.orig/block/genhd.c +++ linux-2.6/block/genhd.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include Index: linux-2.6/block/ioctl.c =================================================================== --- linux-2.6.orig/block/ioctl.c +++ linux-2.6/block/ioctl.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include Index: linux-2.6/drivers/block/amiflop.c =================================================================== --- linux-2.6.orig/drivers/block/amiflop.c +++ linux-2.6/drivers/block/amiflop.c @@ -62,7 +62,7 @@ #include #include #include -#include +#include #include #include #include Index: linux-2.6/drivers/block/floppy.c =================================================================== --- linux-2.6.orig/drivers/block/floppy.c +++ linux-2.6/drivers/block/floppy.c @@ -188,7 +188,6 @@ static int print_unex = 1; #include #include #include -#include /* for invalidate_buffers() */ #include #include #include Index: linux-2.6/drivers/char/sysrq.c =================================================================== --- linux-2.6.orig/drivers/char/sysrq.c +++ linux-2.6/drivers/char/sysrq.c @@ -33,7 +33,6 @@ #include #include #include -#include /* for fsync_bdev() */ #include #include #include Index: linux-2.6/arch/powerpc/sysdev/axonram.c =================================================================== --- linux-2.6.orig/arch/powerpc/sysdev/axonram.c +++ linux-2.6/arch/powerpc/sysdev/axonram.c @@ -25,7 +25,6 @@ #include #include -#include #include #include #include Index: linux-2.6/drivers/cdrom/cdrom.c =================================================================== --- linux-2.6.orig/drivers/cdrom/cdrom.c +++ linux-2.6/drivers/cdrom/cdrom.c @@ -265,7 +265,6 @@ #include #include -#include #include #include #include Index: linux-2.6/drivers/md/dm.c =================================================================== --- linux-2.6.orig/drivers/md/dm.c +++ linux-2.6/drivers/md/dm.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include Index: linux-2.6/drivers/mtd/devices/block2mtd.c =================================================================== --- linux-2.6.orig/drivers/mtd/devices/block2mtd.c +++ linux-2.6/drivers/mtd/devices/block2mtd.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include Index: linux-2.6/drivers/s390/block/dasd.c =================================================================== --- linux-2.6.orig/drivers/s390/block/dasd.c +++ linux-2.6/drivers/s390/block/dasd.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include Index: linux-2.6/drivers/s390/char/tape_block.c =================================================================== --- linux-2.6.orig/drivers/s390/char/tape_block.c +++ linux-2.6/drivers/s390/char/tape_block.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include Index: linux-2.6/drivers/scsi/scsicam.c =================================================================== --- linux-2.6.orig/drivers/scsi/scsicam.c +++ linux-2.6/drivers/scsi/scsicam.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include Index: linux-2.6/kernel/power/swap.c =================================================================== --- linux-2.6.orig/kernel/power/swap.c +++ linux-2.6/kernel/power/swap.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include Index: linux-2.6/drivers/staging/ramzswap/ramzswap_drv.c =================================================================== --- linux-2.6.orig/drivers/staging/ramzswap/ramzswap_drv.c +++ linux-2.6/drivers/staging/ramzswap/ramzswap_drv.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include Index: linux-2.6/fs/cachefiles/interface.c =================================================================== --- linux-2.6.orig/fs/cachefiles/interface.c +++ linux-2.6/fs/cachefiles/interface.c @@ -11,7 +11,6 @@ #include #include -#include #include "internal.h" #define list_to_page(head) (list_entry((head)->prev, struct page, lru)) Index: linux-2.6/fs/cramfs/inode.c =================================================================== --- linux-2.6.orig/fs/cramfs/inode.c +++ linux-2.6/fs/cramfs/inode.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include Index: linux-2.6/fs/fs-writeback.c =================================================================== --- linux-2.6.orig/fs/fs-writeback.c +++ linux-2.6/fs/fs-writeback.c @@ -25,7 +25,6 @@ #include #include #include -#include #include "internal.h" #define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) Index: linux-2.6/fs/splice.c =================================================================== --- linux-2.6.orig/fs/splice.c +++ linux-2.6/fs/splice.c @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include Index: linux-2.6/fs/sync.c =================================================================== --- linux-2.6.orig/fs/sync.c +++ linux-2.6/fs/sync.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include "internal.h" Index: linux-2.6/mm/page-writeback.c =================================================================== --- linux-2.6.orig/mm/page-writeback.c +++ linux-2.6/mm/page-writeback.c @@ -32,7 +32,7 @@ #include #include #include -#include +#include /* __set_page_dirty_buffers */ #include /* Index: linux-2.6/mm/swap_state.c =================================================================== --- linux-2.6.orig/mm/swap_state.c +++ linux-2.6/mm/swap_state.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include Index: linux-2.6/fs/buffer.c =================================================================== --- linux-2.6.orig/fs/buffer.c +++ linux-2.6/fs/buffer.c @@ -235,51 +235,6 @@ out: return ret; } -/* If invalidate_buffers() will trash dirty buffers, it means some kind - of fs corruption is going on. Trashing dirty data always imply losing - information that was supposed to be just stored on the physical layer - by the user. - - Thus invalidate_buffers in general usage is not allwowed to trash - dirty buffers. For example ioctl(FLSBLKBUF) expects dirty data to - be preserved. These buffers are simply skipped. - - We also skip buffers which are still in use. For example this can - happen if a userspace program is reading the block device. - - NOTE: In the case where the user removed a removable-media-disk even if - there's still dirty data not synced on disk (due a bug in the device driver - or due an error of the user), by not destroying the dirty buffers we could - generate corruption also on the next media inserted, thus a parameter is - necessary to handle this case in the most safe way possible (trying - to not corrupt also the new disk inserted with the data belonging to - the old now corrupted disk). Also for the ramdisk the natural thing - to do in order to release the ramdisk memory is to destroy dirty buffers. - - These are two special cases. Normal usage imply the device driver - to issue a sync on the device (without waiting I/O completion) and - then an invalidate_buffers call that doesn't trash dirty buffers. - - For handling cache coherency with the blkdev pagecache the 'update' case - is been introduced. It is needed to re-read from disk any pinned - buffer. NOTE: re-reading from disk is destructive so we can do it only - when we assume nobody is changing the buffercache under our I/O and when - we think the disk contains more recent information than the buffercache. - The update == 1 pass marks the buffers we need to update, the update == 2 - pass does the actual I/O. */ -void invalidate_bdev(struct block_device *bdev) -{ - struct address_space *mapping = bdev->bd_inode->i_mapping; - - if (mapping->nrpages == 0) - return; - - invalidate_bh_lrus(); - lru_add_drain_all(); /* make sure all lru add caches are flushed */ - invalidate_mapping_pages(mapping, 0, -1); -} -EXPORT_SYMBOL(invalidate_bdev); - /* * Kick the writeback threads then try to free up some ZONE_NORMAL memory. */ @@ -3257,17 +3212,6 @@ out: } EXPORT_SYMBOL(try_to_free_buffers); -void block_sync_page(struct page *page) -{ - struct address_space *mapping; - - smp_mb(); - mapping = page_mapping(page); - if (mapping) - blk_run_backing_dev(mapping->backing_dev_info, page); -} -EXPORT_SYMBOL(block_sync_page); - /* * There are no bdflush tunables left. But distributions are * still running obsolete flush daemons, so we terminate them here. Index: linux-2.6/include/linux/buffer_head.h =================================================================== --- linux-2.6.orig/include/linux/buffer_head.h +++ linux-2.6/include/linux/buffer_head.h @@ -227,7 +227,6 @@ int generic_cont_expand_simple(struct in int block_commit_write(struct page *page, unsigned from, unsigned to); int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, get_block_t get_block); -void block_sync_page(struct page *); sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *); int block_truncate_page(struct address_space *, loff_t, get_block_t *); int file_fsync(struct file *, int); Index: linux-2.6/fs/libfs.c =================================================================== --- linux-2.6.orig/fs/libfs.c +++ linux-2.6/fs/libfs.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include /* sync_mapping_buffers */ #include