Hi, Just had a couple of prequel patches for fsblock that seem reasonable on their own. Afterwards, we basically have enough there to remove all buffer_head knowledge from mm and fs core code. Filesystems need to be switched to use the helpers before that _actually_ happens though. Comments? -- Move invalidate_bdev 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/dst/dcore.c | 2 - drivers/staging/dst/state.c | 1 fs/block_dev.c | 23 ++++++++++++++++++-- fs/buffer.c | 44 ---------------------------------------- fs/quota/dquot.c | 1 fs/quota/quota.c | 1 include/linux/fs.h | 2 + kernel/power/swap.c | 1 23 files changed, 30 insertions(+), 71 deletions(-) Index: linux-2.6/drivers/block/brd.c =================================================================== --- linux-2.6.orig/drivers/block/brd.c +++ linux-2.6/drivers/block/brd.c @@ -17,7 +17,7 @@ #include <linux/highmem.h> #include <linux/gfp.h> #include <linux/radix-tree.h> -#include <linux/buffer_head.h> /* invalidate_bh_lrus() */ +#include <linux/fs.h> #include <asm/uaccess.h> @@ -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 <linux/suspend.h> #include <linux/freezer.h> #include <linux/writeback.h> -#include <linux/buffer_head.h> /* for invalidate_bdev() */ #include <linux/completion.h> #include <linux/highmem.h> #include <linux/gfp.h> 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 <linux/blkdev.h> #include <linux/sysctl.h> #include <linux/seq_file.h> -#include <linux/buffer_head.h> /* for invalidate_bdev */ +#include <linux/fs.h> #include <linux/poll.h> #include <linux/ctype.h> #include <linux/string.h> Index: linux-2.6/fs/block_dev.c =================================================================== --- linux-2.6.orig/fs/block_dev.c +++ linux-2.6/fs/block_dev.c @@ -62,13 +62,30 @@ 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(); + invalidate_mapping_pages(mapping, 0, -1); +} +EXPORT_SYMBOL(invalidate_bdev); int set_blocksize(struct block_device *bdev, int size) { Index: linux-2.6/fs/buffer.c =================================================================== --- linux-2.6.orig/fs/buffer.c +++ linux-2.6/fs/buffer.c @@ -235,50 +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(); - invalidate_mapping_pages(mapping, 0, -1); -} -EXPORT_SYMBOL(invalidate_bdev); - /* * Kick the writeback threads then try to free up some ZONE_NORMAL memory. */ 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 <linux/security.h> #include <linux/kmod.h> #include <linux/namei.h> -#include <linux/buffer_head.h> #include <linux/capability.h> #include <linux/quotaops.h> #include <linux/writeback.h> /* 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 <linux/kernel.h> #include <linux/security.h> #include <linux/syscalls.h> -#include <linux/buffer_head.h> #include <linux/capability.h> #include <linux/quotaops.h> #include <linux/types.h> Index: linux-2.6/include/linux/fs.h =================================================================== --- linux-2.6.orig/include/linux/fs.h +++ linux-2.6/include/linux/fs.h @@ -1947,6 +1947,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 *); @@ -1956,6 +1957,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) 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 <linux/slab.h> #include <linux/kmod.h> #include <linux/kobj_map.h> -#include <linux/buffer_head.h> #include <linux/mutex.h> #include <linux/idr.h> Index: linux-2.6/block/ioctl.c =================================================================== --- linux-2.6.orig/block/ioctl.c +++ linux-2.6/block/ioctl.c @@ -3,7 +3,7 @@ #include <linux/blkpg.h> #include <linux/hdreg.h> #include <linux/backing-dev.h> -#include <linux/buffer_head.h> +#include <linux/fs.h> #include <linux/smp_lock.h> #include <linux/blktrace_api.h> #include <asm/uaccess.h> Index: linux-2.6/drivers/block/amiflop.c =================================================================== --- linux-2.6.orig/drivers/block/amiflop.c +++ linux-2.6/drivers/block/amiflop.c @@ -61,7 +61,7 @@ #include <linux/init.h> #include <linux/amifdreg.h> #include <linux/amifd.h> -#include <linux/buffer_head.h> +#include <linux/fs.h> #include <linux/blkdev.h> #include <linux/elevator.h> #include <linux/interrupt.h> 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 <linux/init.h> #include <linux/platform_device.h> #include <linux/mod_devicetable.h> -#include <linux/buffer_head.h> /* for invalidate_buffers() */ #include <linux/mutex.h> #include <linux/io.h> #include <linux/uaccess.h> Index: linux-2.6/drivers/char/sysrq.c =================================================================== --- linux-2.6.orig/drivers/char/sysrq.c +++ linux-2.6/drivers/char/sysrq.c @@ -31,7 +31,6 @@ #include <linux/module.h> #include <linux/suspend.h> #include <linux/writeback.h> -#include <linux/buffer_head.h> /* for fsync_bdev() */ #include <linux/swap.h> #include <linux/spinlock.h> #include <linux/vt_kern.h> 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 <linux/bio.h> #include <linux/blkdev.h> -#include <linux/buffer_head.h> #include <linux/device.h> #include <linux/errno.h> #include <linux/fs.h> 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 <linux/module.h> #include <linux/fs.h> -#include <linux/buffer_head.h> #include <linux/major.h> #include <linux/types.h> #include <linux/errno.h> 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 <linux/moduleparam.h> #include <linux/blkpg.h> #include <linux/bio.h> -#include <linux/buffer_head.h> #include <linux/mempool.h> #include <linux/slab.h> #include <linux/idr.h> 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 <linux/list.h> #include <linux/init.h> #include <linux/mtd/mtd.h> -#include <linux/buffer_head.h> #include <linux/mutex.h> #include <linux/mount.h> 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 <linux/ctype.h> #include <linux/major.h> #include <linux/slab.h> -#include <linux/buffer_head.h> #include <linux/hdreg.h> #include <linux/async.h> #include <linux/mutex.h> 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 <linux/module.h> #include <linux/blkdev.h> #include <linux/interrupt.h> -#include <linux/buffer_head.h> #include <linux/kernel.h> #include <asm/debug.h> Index: linux-2.6/drivers/scsi/scsicam.c =================================================================== --- linux-2.6.orig/drivers/scsi/scsicam.c +++ linux-2.6/drivers/scsi/scsicam.c @@ -15,7 +15,6 @@ #include <linux/genhd.h> #include <linux/kernel.h> #include <linux/blkdev.h> -#include <linux/buffer_head.h> #include <asm/unaligned.h> #include <scsi/scsicam.h> 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 <linux/bitops.h> #include <linux/genhd.h> #include <linux/device.h> -#include <linux/buffer_head.h> #include <linux/bio.h> #include <linux/blkdev.h> #include <linux/swap.h> -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html