浏览代码

[PATCH] BLOCK: Make it possible to disable the block layer [try #6]

Make it possible to disable the block layer.  Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.

This patch does the following:

 (*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
     support.

 (*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
     an item that uses the block layer.  This includes:

     (*) Block I/O tracing.

     (*) Disk partition code.

     (*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.

     (*) The SCSI layer.  As far as I can tell, even SCSI chardevs use the
     	 block layer to do scheduling.  Some drivers that use SCSI facilities -
     	 such as USB storage - end up disabled indirectly from this.

     (*) Various block-based device drivers, such as IDE and the old CDROM
     	 drivers.

     (*) MTD blockdev handling and FTL.

     (*) JFFS - which uses set_bdev_super(), something it could avoid doing by
     	 taking a leaf out of JFFS2's book.

 (*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
     linux/elevator.h contingent on CONFIG_BLOCK being set.  sector_div() is,
     however, still used in places, and so is still available.

 (*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
     parts of linux/fs.h.

 (*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.

 (*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.

 (*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
     is not enabled.

 (*) fs/no-block.c is created to hold out-of-line stubs and things that are
     required when CONFIG_BLOCK is not set:

     (*) Default blockdev file operations (to give error ENODEV on opening).

 (*) Makes some /proc changes:

     (*) /proc/devices does not list any blockdevs.

     (*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.

 (*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.

 (*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
     given command other than Q_SYNC or if a special device is specified.

 (*) In init/do_mounts.c, no reference is made to the blockdev routines if
     CONFIG_BLOCK is not defined.  This does not prohibit NFS roots or JFFS2.

 (*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
     error ENOSYS by way of cond_syscall if so).

 (*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
     CONFIG_BLOCK is not set, since they can't then happen.

Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
David Howells 18 年之前
父节点
当前提交
9361401eb7

+ 20 - 0
block/Kconfig

@@ -1,6 +1,24 @@
 #
 #
 # Block layer core configuration
 # Block layer core configuration
 #
 #
+config BLOCK
+       bool "Enable the block layer"
+       default y
+       help
+	 This permits the block layer to be removed from the kernel if it's not
+	 needed (on some embedded devices for example).  If this option is
+	 disabled, then blockdev files will become unusable and some
+	 filesystems (such as ext3) will become unavailable.
+
+	 This option will also disable SCSI character devices and USB storage
+	 since they make use of various block layer definitions and
+	 facilities.
+
+	 Say Y here unless you know you really don't want to mount disks and
+	 suchlike.
+
+if BLOCK
+
 #XXX - it makes sense to enable this only for 32-bit subarch's, not for x86_64
 #XXX - it makes sense to enable this only for 32-bit subarch's, not for x86_64
 #for instance.
 #for instance.
 config LBD
 config LBD
@@ -33,4 +51,6 @@ config LSF
 
 
 	  If unsure, say Y.
 	  If unsure, say Y.
 
 
+endif
+
 source block/Kconfig.iosched
 source block/Kconfig.iosched

+ 3 - 0
block/Kconfig.iosched

@@ -1,3 +1,4 @@
+if BLOCK
 
 
 menu "IO Schedulers"
 menu "IO Schedulers"
 
 
@@ -67,3 +68,5 @@ config DEFAULT_IOSCHED
 	default "noop" if DEFAULT_NOOP
 	default "noop" if DEFAULT_NOOP
 
 
 endmenu
 endmenu
+
+endif

+ 1 - 1
block/Makefile

@@ -2,7 +2,7 @@
 # Makefile for the kernel block layer
 # Makefile for the kernel block layer
 #
 #
 
 
-obj-y	:= elevator.o ll_rw_blk.o ioctl.o genhd.o scsi_ioctl.o
+obj-$(CONFIG_BLOCK) := elevator.o ll_rw_blk.o ioctl.o genhd.o scsi_ioctl.o
 
 
 obj-$(CONFIG_IOSCHED_NOOP)	+= noop-iosched.o
 obj-$(CONFIG_IOSCHED_NOOP)	+= noop-iosched.o
 obj-$(CONFIG_IOSCHED_AS)	+= as-iosched.o
 obj-$(CONFIG_IOSCHED_AS)	+= as-iosched.o

+ 4 - 0
drivers/block/Kconfig

@@ -2,6 +2,8 @@
 # Block device driver configuration
 # Block device driver configuration
 #
 #
 
 
+if BLOCK
+
 menu "Block devices"
 menu "Block devices"
 
 
 config BLK_DEV_FD
 config BLK_DEV_FD
@@ -468,3 +470,5 @@ config ATA_OVER_ETH
 	devices like the Coraid EtherDrive (R) Storage Blade.
 	devices like the Coraid EtherDrive (R) Storage Blade.
 
 
 endmenu
 endmenu
+
+endif

+ 1 - 1
drivers/cdrom/Kconfig

@@ -3,7 +3,7 @@
 #
 #
 
 
 menu "Old CD-ROM drivers (not SCSI, not IDE)"
 menu "Old CD-ROM drivers (not SCSI, not IDE)"
-	depends on ISA
+	depends on ISA && BLOCK
 
 
 config CD_NO_IDESCSI
 config CD_NO_IDESCSI
 	bool "Support non-SCSI/IDE/ATAPI CDROM drives"
 	bool "Support non-SCSI/IDE/ATAPI CDROM drives"

+ 1 - 0
drivers/char/Kconfig

@@ -1006,6 +1006,7 @@ config GPIO_VR41XX
 
 
 config RAW_DRIVER
 config RAW_DRIVER
 	tristate "RAW driver (/dev/raw/rawN) (OBSOLETE)"
 	tristate "RAW driver (/dev/raw/rawN) (OBSOLETE)"
+	depends on BLOCK
 	help
 	help
 	  The raw driver permits block devices to be bound to /dev/raw/rawN. 
 	  The raw driver permits block devices to be bound to /dev/raw/rawN. 
 	  Once bound, I/O against /dev/raw/rawN uses efficient zero-copy I/O. 
 	  Once bound, I/O against /dev/raw/rawN uses efficient zero-copy I/O. 

+ 4 - 0
drivers/char/random.c

@@ -655,6 +655,7 @@ void add_interrupt_randomness(int irq)
 	add_timer_randomness(irq_timer_state[irq], 0x100 + irq);
 	add_timer_randomness(irq_timer_state[irq], 0x100 + irq);
 }
 }
 
 
+#ifdef CONFIG_BLOCK
 void add_disk_randomness(struct gendisk *disk)
 void add_disk_randomness(struct gendisk *disk)
 {
 {
 	if (!disk || !disk->random)
 	if (!disk || !disk->random)
@@ -667,6 +668,7 @@ void add_disk_randomness(struct gendisk *disk)
 }
 }
 
 
 EXPORT_SYMBOL(add_disk_randomness);
 EXPORT_SYMBOL(add_disk_randomness);
+#endif
 
 
 #define EXTRACT_SIZE 10
 #define EXTRACT_SIZE 10
 
 
@@ -918,6 +920,7 @@ void rand_initialize_irq(int irq)
 	}
 	}
 }
 }
 
 
+#ifdef CONFIG_BLOCK
 void rand_initialize_disk(struct gendisk *disk)
 void rand_initialize_disk(struct gendisk *disk)
 {
 {
 	struct timer_rand_state *state;
 	struct timer_rand_state *state;
@@ -932,6 +935,7 @@ void rand_initialize_disk(struct gendisk *disk)
 		disk->random = state;
 		disk->random = state;
 	}
 	}
 }
 }
+#endif
 
 
 static ssize_t
 static ssize_t
 random_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos)
 random_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos)

+ 4 - 0
drivers/ide/Kconfig

@@ -4,6 +4,8 @@
 # Andre Hedrick <andre@linux-ide.org>
 # Andre Hedrick <andre@linux-ide.org>
 #
 #
 
 
+if BLOCK
+
 menu "ATA/ATAPI/MFM/RLL support"
 menu "ATA/ATAPI/MFM/RLL support"
 
 
 config IDE
 config IDE
@@ -1082,3 +1084,5 @@ config BLK_DEV_HD
 endif
 endif
 
 
 endmenu
 endmenu
+
+endif

+ 3 - 0
drivers/md/Kconfig

@@ -2,6 +2,8 @@
 # Block device driver configuration
 # Block device driver configuration
 #
 #
 
 
+if BLOCK
+
 menu "Multi-device support (RAID and LVM)"
 menu "Multi-device support (RAID and LVM)"
 
 
 config MD
 config MD
@@ -251,3 +253,4 @@ config DM_MULTIPATH_EMC
 
 
 endmenu
 endmenu
 
 
+endif

+ 1 - 1
drivers/message/i2o/Kconfig

@@ -88,7 +88,7 @@ config I2O_BUS
 
 
 config I2O_BLOCK
 config I2O_BLOCK
 	tristate "I2O Block OSM"
 	tristate "I2O Block OSM"
-	depends on I2O
+	depends on I2O && BLOCK
 	---help---
 	---help---
 	  Include support for the I2O Block OSM. The Block OSM presents disk
 	  Include support for the I2O Block OSM. The Block OSM presents disk
 	  and other structured block devices to the operating system. If you
 	  and other structured block devices to the operating system. If you

+ 1 - 1
drivers/mmc/Kconfig

@@ -21,7 +21,7 @@ config MMC_DEBUG
 
 
 config MMC_BLOCK
 config MMC_BLOCK
 	tristate "MMC block device driver"
 	tristate "MMC block device driver"
-	depends on MMC
+	depends on MMC && BLOCK
 	default y
 	default y
 	help
 	help
 	  Say Y here to enable the MMC block device driver support.
 	  Say Y here to enable the MMC block device driver support.

+ 2 - 1
drivers/mmc/Makefile

@@ -24,7 +24,8 @@ obj-$(CONFIG_MMC_AU1X)		+= au1xmmc.o
 obj-$(CONFIG_MMC_OMAP)		+= omap.o
 obj-$(CONFIG_MMC_OMAP)		+= omap.o
 obj-$(CONFIG_MMC_AT91RM9200)	+= at91_mci.o
 obj-$(CONFIG_MMC_AT91RM9200)	+= at91_mci.o
 
 
-mmc_core-y := mmc.o mmc_queue.o mmc_sysfs.o
+mmc_core-y := mmc.o mmc_sysfs.o
+mmc_core-$(CONFIG_BLOCK) += mmc_queue.o
 
 
 ifeq ($(CONFIG_MMC_DEBUG),y)
 ifeq ($(CONFIG_MMC_DEBUG),y)
 EXTRA_CFLAGS += -DDEBUG
 EXTRA_CFLAGS += -DDEBUG

+ 6 - 6
drivers/mtd/Kconfig

@@ -166,7 +166,7 @@ config MTD_CHAR
 
 
 config MTD_BLOCK
 config MTD_BLOCK
 	tristate "Caching block device access to MTD devices"
 	tristate "Caching block device access to MTD devices"
-	depends on MTD
+	depends on MTD && BLOCK
 	---help---
 	---help---
 	  Although most flash chips have an erase size too large to be useful
 	  Although most flash chips have an erase size too large to be useful
 	  as block devices, it is possible to use MTD devices which are based
 	  as block devices, it is possible to use MTD devices which are based
@@ -188,7 +188,7 @@ config MTD_BLOCK
 
 
 config MTD_BLOCK_RO
 config MTD_BLOCK_RO
 	tristate "Readonly block device access to MTD devices"
 	tristate "Readonly block device access to MTD devices"
-	depends on MTD_BLOCK!=y && MTD
+	depends on MTD_BLOCK!=y && MTD && BLOCK
 	help
 	help
 	  This allows you to mount read-only file systems (such as cramfs)
 	  This allows you to mount read-only file systems (such as cramfs)
 	  from an MTD device, without the overhead (and danger) of the caching
 	  from an MTD device, without the overhead (and danger) of the caching
@@ -199,7 +199,7 @@ config MTD_BLOCK_RO
 
 
 config FTL
 config FTL
 	tristate "FTL (Flash Translation Layer) support"
 	tristate "FTL (Flash Translation Layer) support"
-	depends on MTD
+	depends on MTD && BLOCK
 	---help---
 	---help---
 	  This provides support for the original Flash Translation Layer which
 	  This provides support for the original Flash Translation Layer which
 	  is part of the PCMCIA specification. It uses a kind of pseudo-
 	  is part of the PCMCIA specification. It uses a kind of pseudo-
@@ -215,7 +215,7 @@ config FTL
 
 
 config NFTL
 config NFTL
 	tristate "NFTL (NAND Flash Translation Layer) support"
 	tristate "NFTL (NAND Flash Translation Layer) support"
-	depends on MTD
+	depends on MTD && BLOCK
 	---help---
 	---help---
 	  This provides support for the NAND Flash Translation Layer which is
 	  This provides support for the NAND Flash Translation Layer which is
 	  used on M-Systems' DiskOnChip devices. It uses a kind of pseudo-
 	  used on M-Systems' DiskOnChip devices. It uses a kind of pseudo-
@@ -238,7 +238,7 @@ config NFTL_RW
 
 
 config INFTL
 config INFTL
 	tristate "INFTL (Inverse NAND Flash Translation Layer) support"
 	tristate "INFTL (Inverse NAND Flash Translation Layer) support"
-	depends on MTD
+	depends on MTD && BLOCK
 	---help---
 	---help---
 	  This provides support for the Inverse NAND Flash Translation
 	  This provides support for the Inverse NAND Flash Translation
 	  Layer which is used on M-Systems' newer DiskOnChip devices. It
 	  Layer which is used on M-Systems' newer DiskOnChip devices. It
@@ -255,7 +255,7 @@ config INFTL
 
 
 config RFD_FTL
 config RFD_FTL
         tristate "Resident Flash Disk (Flash Translation Layer) support"
         tristate "Resident Flash Disk (Flash Translation Layer) support"
-	depends on MTD
+	depends on MTD && BLOCK
 	---help---
 	---help---
 	  This provides support for the flash translation layer known
 	  This provides support for the flash translation layer known
 	  as the Resident Flash Disk (RFD), as used by the Embedded BIOS
 	  as the Resident Flash Disk (RFD), as used by the Embedded BIOS

+ 1 - 1
drivers/mtd/devices/Kconfig

@@ -136,7 +136,7 @@ config MTDRAM_ABS_POS
 
 
 config MTD_BLOCK2MTD
 config MTD_BLOCK2MTD
 	tristate "MTD using block device"
 	tristate "MTD using block device"
-	depends on MTD
+	depends on MTD && BLOCK
 	help
 	help
 	  This driver allows a block device to appear as an MTD. It would
 	  This driver allows a block device to appear as an MTD. It would
 	  generally be used in the following cases:
 	  generally be used in the following cases:

+ 1 - 1
drivers/s390/block/Kconfig

@@ -1,4 +1,4 @@
-if S390
+if S390 && BLOCK
 
 
 comment "S/390 block device drivers"
 comment "S/390 block device drivers"
 	depends on S390
 	depends on S390

+ 2 - 0
drivers/scsi/Kconfig

@@ -3,11 +3,13 @@ menu "SCSI device support"
 config RAID_ATTRS
 config RAID_ATTRS
 	tristate "RAID Transport Class"
 	tristate "RAID Transport Class"
 	default n
 	default n
+	depends on BLOCK
 	---help---
 	---help---
 	  Provides RAID
 	  Provides RAID
 
 
 config SCSI
 config SCSI
 	tristate "SCSI device support"
 	tristate "SCSI device support"
+	depends on BLOCK
 	---help---
 	---help---
 	  If you want to use a SCSI hard disk, SCSI tape drive, SCSI CD-ROM or
 	  If you want to use a SCSI hard disk, SCSI tape drive, SCSI CD-ROM or
 	  any other SCSI device under Linux, say Y and make sure that you know
 	  any other SCSI device under Linux, say Y and make sure that you know

+ 24 - 7
fs/Kconfig

@@ -4,6 +4,8 @@
 
 
 menu "File systems"
 menu "File systems"
 
 
+if BLOCK
+
 config EXT2_FS
 config EXT2_FS
 	tristate "Second extended fs support"
 	tristate "Second extended fs support"
 	help
 	help
@@ -399,6 +401,8 @@ config ROMFS_FS
 	  If you don't know whether you need it, then you don't need it:
 	  If you don't know whether you need it, then you don't need it:
 	  answer N.
 	  answer N.
 
 
+endif
+
 config INOTIFY
 config INOTIFY
 	bool "Inotify file change notification support"
 	bool "Inotify file change notification support"
 	default y
 	default y
@@ -530,6 +534,7 @@ config FUSE_FS
 	  If you want to develop a userspace FS, or if you want to use
 	  If you want to develop a userspace FS, or if you want to use
 	  a filesystem based on FUSE, answer Y or M.
 	  a filesystem based on FUSE, answer Y or M.
 
 
+if BLOCK
 menu "CD-ROM/DVD Filesystems"
 menu "CD-ROM/DVD Filesystems"
 
 
 config ISO9660_FS
 config ISO9660_FS
@@ -597,7 +602,9 @@ config UDF_NLS
 	depends on (UDF_FS=m && NLS) || (UDF_FS=y && NLS=y)
 	depends on (UDF_FS=m && NLS) || (UDF_FS=y && NLS=y)
 
 
 endmenu
 endmenu
+endif
 
 
+if BLOCK
 menu "DOS/FAT/NT Filesystems"
 menu "DOS/FAT/NT Filesystems"
 
 
 config FAT_FS
 config FAT_FS
@@ -782,6 +789,7 @@ config NTFS_RW
 	  It is perfectly safe to say N here.
 	  It is perfectly safe to say N here.
 
 
 endmenu
 endmenu
+endif
 
 
 menu "Pseudo filesystems"
 menu "Pseudo filesystems"
 
 
@@ -939,7 +947,7 @@ menu "Miscellaneous filesystems"
 
 
 config ADFS_FS
 config ADFS_FS
 	tristate "ADFS file system support (EXPERIMENTAL)"
 	tristate "ADFS file system support (EXPERIMENTAL)"
-	depends on EXPERIMENTAL
+	depends on BLOCK && EXPERIMENTAL
 	help
 	help
 	  The Acorn Disc Filing System is the standard file system of the
 	  The Acorn Disc Filing System is the standard file system of the
 	  RiscOS operating system which runs on Acorn's ARM-based Risc PC
 	  RiscOS operating system which runs on Acorn's ARM-based Risc PC
@@ -967,7 +975,7 @@ config ADFS_FS_RW
 
 
 config AFFS_FS
 config AFFS_FS
 	tristate "Amiga FFS file system support (EXPERIMENTAL)"
 	tristate "Amiga FFS file system support (EXPERIMENTAL)"
-	depends on EXPERIMENTAL
+	depends on BLOCK && EXPERIMENTAL
 	help
 	help
 	  The Fast File System (FFS) is the common file system used on hard
 	  The Fast File System (FFS) is the common file system used on hard
 	  disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20).  Say Y
 	  disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20).  Say Y
@@ -989,7 +997,7 @@ config AFFS_FS
 
 
 config HFS_FS
 config HFS_FS
 	tristate "Apple Macintosh file system support (EXPERIMENTAL)"
 	tristate "Apple Macintosh file system support (EXPERIMENTAL)"
-	depends on EXPERIMENTAL
+	depends on BLOCK && EXPERIMENTAL
 	select NLS
 	select NLS
 	help
 	help
 	  If you say Y here, you will be able to mount Macintosh-formatted
 	  If you say Y here, you will be able to mount Macintosh-formatted
@@ -1002,6 +1010,7 @@ config HFS_FS
 
 
 config HFSPLUS_FS
 config HFSPLUS_FS
 	tristate "Apple Extended HFS file system support"
 	tristate "Apple Extended HFS file system support"
+	depends on BLOCK
 	select NLS
 	select NLS
 	select NLS_UTF8
 	select NLS_UTF8
 	help
 	help
@@ -1015,7 +1024,7 @@ config HFSPLUS_FS
 
 
 config BEFS_FS
 config BEFS_FS
 	tristate "BeOS file system (BeFS) support (read only) (EXPERIMENTAL)"
 	tristate "BeOS file system (BeFS) support (read only) (EXPERIMENTAL)"
-	depends on EXPERIMENTAL
+	depends on BLOCK && EXPERIMENTAL
 	select NLS
 	select NLS
 	help
 	help
 	  The BeOS File System (BeFS) is the native file system of Be, Inc's
 	  The BeOS File System (BeFS) is the native file system of Be, Inc's
@@ -1042,7 +1051,7 @@ config BEFS_DEBUG
 
 
 config BFS_FS
 config BFS_FS
 	tristate "BFS file system support (EXPERIMENTAL)"
 	tristate "BFS file system support (EXPERIMENTAL)"
-	depends on EXPERIMENTAL
+	depends on BLOCK && EXPERIMENTAL
 	help
 	help
 	  Boot File System (BFS) is a file system used under SCO UnixWare to
 	  Boot File System (BFS) is a file system used under SCO UnixWare to
 	  allow the bootloader access to the kernel image and other important
 	  allow the bootloader access to the kernel image and other important
@@ -1064,7 +1073,7 @@ config BFS_FS
 
 
 config EFS_FS
 config EFS_FS
 	tristate "EFS file system support (read only) (EXPERIMENTAL)"
 	tristate "EFS file system support (read only) (EXPERIMENTAL)"
-	depends on EXPERIMENTAL
+	depends on BLOCK && EXPERIMENTAL
 	help
 	help
 	  EFS is an older file system used for non-ISO9660 CD-ROMs and hard
 	  EFS is an older file system used for non-ISO9660 CD-ROMs and hard
 	  disk partitions by SGI's IRIX operating system (IRIX 6.0 and newer
 	  disk partitions by SGI's IRIX operating system (IRIX 6.0 and newer
@@ -1079,7 +1088,7 @@ config EFS_FS
 
 
 config JFFS_FS
 config JFFS_FS
 	tristate "Journalling Flash File System (JFFS) support"
 	tristate "Journalling Flash File System (JFFS) support"
-	depends on MTD
+	depends on MTD && BLOCK
 	help
 	help
 	  JFFS is the Journaling Flash File System developed by Axis
 	  JFFS is the Journaling Flash File System developed by Axis
 	  Communications in Sweden, aimed at providing a crash/powerdown-safe
 	  Communications in Sweden, aimed at providing a crash/powerdown-safe
@@ -1264,6 +1273,7 @@ endchoice
 
 
 config CRAMFS
 config CRAMFS
 	tristate "Compressed ROM file system support (cramfs)"
 	tristate "Compressed ROM file system support (cramfs)"
+	depends on BLOCK
 	select ZLIB_INFLATE
 	select ZLIB_INFLATE
 	help
 	help
 	  Saying Y here includes support for CramFs (Compressed ROM File
 	  Saying Y here includes support for CramFs (Compressed ROM File
@@ -1283,6 +1293,7 @@ config CRAMFS
 
 
 config VXFS_FS
 config VXFS_FS
 	tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
 	tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
+	depends on BLOCK
 	help
 	help
 	  FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
 	  FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
 	  file system format.  VERITAS VxFS(TM) is the standard file system
 	  file system format.  VERITAS VxFS(TM) is the standard file system
@@ -1300,6 +1311,7 @@ config VXFS_FS
 
 
 config HPFS_FS
 config HPFS_FS
 	tristate "OS/2 HPFS file system support"
 	tristate "OS/2 HPFS file system support"
+	depends on BLOCK
 	help
 	help
 	  OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS
 	  OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS
 	  is the file system used for organizing files on OS/2 hard disk
 	  is the file system used for organizing files on OS/2 hard disk
@@ -1316,6 +1328,7 @@ config HPFS_FS
 
 
 config QNX4FS_FS
 config QNX4FS_FS
 	tristate "QNX4 file system support (read only)"
 	tristate "QNX4 file system support (read only)"
+	depends on BLOCK
 	help
 	help
 	  This is the file system used by the real-time operating systems
 	  This is the file system used by the real-time operating systems
 	  QNX 4 and QNX 6 (the latter is also called QNX RTP).
 	  QNX 4 and QNX 6 (the latter is also called QNX RTP).
@@ -1343,6 +1356,7 @@ config QNX4FS_RW
 
 
 config SYSV_FS
 config SYSV_FS
 	tristate "System V/Xenix/V7/Coherent file system support"
 	tristate "System V/Xenix/V7/Coherent file system support"
+	depends on BLOCK
 	help
 	help
 	  SCO, Xenix and Coherent are commercial Unix systems for Intel
 	  SCO, Xenix and Coherent are commercial Unix systems for Intel
 	  machines, and Version 7 was used on the DEC PDP-11. Saying Y
 	  machines, and Version 7 was used on the DEC PDP-11. Saying Y
@@ -1381,6 +1395,7 @@ config SYSV_FS
 
 
 config UFS_FS
 config UFS_FS
 	tristate "UFS file system support (read only)"
 	tristate "UFS file system support (read only)"
+	depends on BLOCK
 	help
 	help
 	  BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
 	  BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
 	  OpenBSD and NeXTstep) use a file system called UFS. Some System V
 	  OpenBSD and NeXTstep) use a file system called UFS. Some System V
@@ -1959,11 +1974,13 @@ config GENERIC_ACL
 
 
 endmenu
 endmenu
 
 
+if BLOCK
 menu "Partition Types"
 menu "Partition Types"
 
 
 source "fs/partitions/Kconfig"
 source "fs/partitions/Kconfig"
 
 
 endmenu
 endmenu
+endif
 
 
 source "fs/nls/Kconfig"
 source "fs/nls/Kconfig"
 
 

+ 10 - 4
fs/Makefile

@@ -5,12 +5,18 @@
 # Rewritten to use lists instead of if-statements.
 # Rewritten to use lists instead of if-statements.
 # 
 # 
 
 
-obj-y :=	open.o read_write.o file_table.o buffer.o  bio.o super.o \
-		block_dev.o char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \
+obj-y :=	open.o read_write.o file_table.o super.o \
+		char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \
 		ioctl.o readdir.o select.o fifo.o locks.o dcache.o inode.o \
 		ioctl.o readdir.o select.o fifo.o locks.o dcache.o inode.o \
 		attr.o bad_inode.o file.o filesystems.o namespace.o aio.o \
 		attr.o bad_inode.o file.o filesystems.o namespace.o aio.o \
-		seq_file.o xattr.o libfs.o fs-writeback.o mpage.o direct-io.o \
-		ioprio.o pnode.o drop_caches.o splice.o sync.o
+		seq_file.o xattr.o libfs.o fs-writeback.o \
+		pnode.o drop_caches.o splice.o sync.o
+
+ifeq ($(CONFIG_BLOCK),y)
+obj-y +=	buffer.o bio.o block_dev.o direct-io.o mpage.o ioprio.o
+else
+obj-y +=	no-block.o
+endif
 
 
 obj-$(CONFIG_INOTIFY)		+= inotify.o
 obj-$(CONFIG_INOTIFY)		+= inotify.o
 obj-$(CONFIG_INOTIFY_USER)	+= inotify_user.o
 obj-$(CONFIG_INOTIFY_USER)	+= inotify_user.o

+ 18 - 0
fs/compat_ioctl.c

@@ -645,6 +645,7 @@ out:
 }
 }
 #endif
 #endif
 
 
+#ifdef CONFIG_BLOCK
 struct hd_geometry32 {
 struct hd_geometry32 {
 	unsigned char heads;
 	unsigned char heads;
 	unsigned char sectors;
 	unsigned char sectors;
@@ -869,6 +870,7 @@ static int sg_grt_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
 	}
 	}
 	return err;
 	return err;
 }
 }
+#endif /* CONFIG_BLOCK */
 
 
 struct sock_fprog32 {
 struct sock_fprog32 {
 	unsigned short	len;
 	unsigned short	len;
@@ -992,6 +994,7 @@ static int ppp_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
 }
 }
 
 
 
 
+#ifdef CONFIG_BLOCK
 struct mtget32 {
 struct mtget32 {
 	compat_long_t	mt_type;
 	compat_long_t	mt_type;
 	compat_long_t	mt_resid;
 	compat_long_t	mt_resid;
@@ -1164,6 +1167,7 @@ static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long ar
 
 
 	return err;
 	return err;
 }
 }
+#endif /* CONFIG_BLOCK */
 
 
 #ifdef CONFIG_VT
 #ifdef CONFIG_VT
 
 
@@ -1491,6 +1495,7 @@ ret_einval(unsigned int fd, unsigned int cmd, unsigned long arg)
 	return -EINVAL;
 	return -EINVAL;
 }
 }
 
 
+#ifdef CONFIG_BLOCK
 static int broken_blkgetsize(unsigned int fd, unsigned int cmd, unsigned long arg)
 static int broken_blkgetsize(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 {
 	/* The mkswap binary hard codes it to Intel value :-((( */
 	/* The mkswap binary hard codes it to Intel value :-((( */
@@ -1525,12 +1530,14 @@ static int blkpg_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long ar
 
 
 	return sys_ioctl(fd, cmd, (unsigned long)a);
 	return sys_ioctl(fd, cmd, (unsigned long)a);
 }
 }
+#endif
 
 
 static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
 static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 {
 	return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
 	return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
 }
 }
 
 
+#ifdef CONFIG_BLOCK
 /* Fix sizeof(sizeof()) breakage */
 /* Fix sizeof(sizeof()) breakage */
 #define BLKBSZGET_32   _IOR(0x12,112,int)
 #define BLKBSZGET_32   _IOR(0x12,112,int)
 #define BLKBSZSET_32   _IOW(0x12,113,int)
 #define BLKBSZSET_32   _IOW(0x12,113,int)
@@ -1551,6 +1558,7 @@ static int do_blkgetsize64(unsigned int fd, unsigned int cmd,
 {
 {
        return sys_ioctl(fd, BLKGETSIZE64, (unsigned long)compat_ptr(arg));
        return sys_ioctl(fd, BLKGETSIZE64, (unsigned long)compat_ptr(arg));
 }
 }
+#endif
 
 
 /* Bluetooth ioctls */
 /* Bluetooth ioctls */
 #define HCIUARTSETPROTO	_IOW('U', 200, int)
 #define HCIUARTSETPROTO	_IOW('U', 200, int)
@@ -1571,6 +1579,7 @@ static int do_blkgetsize64(unsigned int fd, unsigned int cmd,
 #define HIDPGETCONNLIST	_IOR('H', 210, int)
 #define HIDPGETCONNLIST	_IOR('H', 210, int)
 #define HIDPGETCONNINFO	_IOR('H', 211, int)
 #define HIDPGETCONNINFO	_IOR('H', 211, int)
 
 
+#ifdef CONFIG_BLOCK
 struct floppy_struct32 {
 struct floppy_struct32 {
 	compat_uint_t	size;
 	compat_uint_t	size;
 	compat_uint_t	sect;
 	compat_uint_t	sect;
@@ -1895,6 +1904,7 @@ out:
 	kfree(karg);
 	kfree(karg);
 	return err;
 	return err;
 }
 }
+#endif
 
 
 struct mtd_oob_buf32 {
 struct mtd_oob_buf32 {
 	u_int32_t start;
 	u_int32_t start;
@@ -1936,6 +1946,7 @@ static int mtd_rw_oob(unsigned int fd, unsigned int cmd, unsigned long arg)
 	return err;
 	return err;
 }	
 }	
 
 
+#ifdef CONFIG_BLOCK
 struct raw32_config_request
 struct raw32_config_request
 {
 {
         compat_int_t    raw_minor;
         compat_int_t    raw_minor;
@@ -2000,6 +2011,7 @@ static int raw_ioctl(unsigned fd, unsigned cmd, unsigned long arg)
         }
         }
         return ret;
         return ret;
 }
 }
+#endif /* CONFIG_BLOCK */
 
 
 struct serial_struct32 {
 struct serial_struct32 {
         compat_int_t    type;
         compat_int_t    type;
@@ -2606,6 +2618,7 @@ HANDLE_IOCTL(SIOCBRDELIF, dev_ifsioc)
 HANDLE_IOCTL(SIOCRTMSG, ret_einval)
 HANDLE_IOCTL(SIOCRTMSG, ret_einval)
 HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp)
 HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp)
 #endif
 #endif
+#ifdef CONFIG_BLOCK
 HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo)
 HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo)
 HANDLE_IOCTL(BLKRAGET, w_long)
 HANDLE_IOCTL(BLKRAGET, w_long)
 HANDLE_IOCTL(BLKGETSIZE, w_long)
 HANDLE_IOCTL(BLKGETSIZE, w_long)
@@ -2631,14 +2644,17 @@ HANDLE_IOCTL(FDGETFDCSTAT32, fd_ioctl_trans)
 HANDLE_IOCTL(FDWERRORGET32, fd_ioctl_trans)
 HANDLE_IOCTL(FDWERRORGET32, fd_ioctl_trans)
 HANDLE_IOCTL(SG_IO,sg_ioctl_trans)
 HANDLE_IOCTL(SG_IO,sg_ioctl_trans)
 HANDLE_IOCTL(SG_GET_REQUEST_TABLE, sg_grt_trans)
 HANDLE_IOCTL(SG_GET_REQUEST_TABLE, sg_grt_trans)
+#endif
 HANDLE_IOCTL(PPPIOCGIDLE32, ppp_ioctl_trans)
 HANDLE_IOCTL(PPPIOCGIDLE32, ppp_ioctl_trans)
 HANDLE_IOCTL(PPPIOCSCOMPRESS32, ppp_ioctl_trans)
 HANDLE_IOCTL(PPPIOCSCOMPRESS32, ppp_ioctl_trans)
 HANDLE_IOCTL(PPPIOCSPASS32, ppp_sock_fprog_ioctl_trans)
 HANDLE_IOCTL(PPPIOCSPASS32, ppp_sock_fprog_ioctl_trans)
 HANDLE_IOCTL(PPPIOCSACTIVE32, ppp_sock_fprog_ioctl_trans)
 HANDLE_IOCTL(PPPIOCSACTIVE32, ppp_sock_fprog_ioctl_trans)
+#ifdef CONFIG_BLOCK
 HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
 HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
 HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
 HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
 HANDLE_IOCTL(CDROMREADAUDIO, cdrom_ioctl_trans)
 HANDLE_IOCTL(CDROMREADAUDIO, cdrom_ioctl_trans)
 HANDLE_IOCTL(CDROM_SEND_PACKET, cdrom_ioctl_trans)
 HANDLE_IOCTL(CDROM_SEND_PACKET, cdrom_ioctl_trans)
+#endif
 #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
 #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
 HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
 HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
 #ifdef CONFIG_VT
 #ifdef CONFIG_VT
@@ -2677,12 +2693,14 @@ HANDLE_IOCTL(SONET_SETFRAMING, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRAMING, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRAMING, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRSENSE, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRSENSE, do_atm_ioctl)
 /* block stuff */
 /* block stuff */
+#ifdef CONFIG_BLOCK
 HANDLE_IOCTL(BLKBSZGET_32, do_blkbszget)
 HANDLE_IOCTL(BLKBSZGET_32, do_blkbszget)
 HANDLE_IOCTL(BLKBSZSET_32, do_blkbszset)
 HANDLE_IOCTL(BLKBSZSET_32, do_blkbszset)
 HANDLE_IOCTL(BLKGETSIZE64_32, do_blkgetsize64)
 HANDLE_IOCTL(BLKGETSIZE64_32, do_blkgetsize64)
 /* Raw devices */
 /* Raw devices */
 HANDLE_IOCTL(RAW_SETBIND, raw_ioctl)
 HANDLE_IOCTL(RAW_SETBIND, raw_ioctl)
 HANDLE_IOCTL(RAW_GETBIND, raw_ioctl)
 HANDLE_IOCTL(RAW_GETBIND, raw_ioctl)
+#endif
 /* Serial */
 /* Serial */
 HANDLE_IOCTL(TIOCGSERIAL, serial_struct_ioctl)
 HANDLE_IOCTL(TIOCGSERIAL, serial_struct_ioctl)
 HANDLE_IOCTL(TIOCSSERIAL, serial_struct_ioctl)
 HANDLE_IOCTL(TIOCSSERIAL, serial_struct_ioctl)

+ 6 - 0
fs/internal.h

@@ -14,10 +14,16 @@
 /*
 /*
  * block_dev.c
  * block_dev.c
  */
  */
+#ifdef CONFIG_BLOCK
 extern struct super_block *blockdev_superblock;
 extern struct super_block *blockdev_superblock;
 extern void __init bdev_cache_init(void);
 extern void __init bdev_cache_init(void);
 
 
 #define sb_is_blkdev_sb(sb) ((sb) == blockdev_superblock)
 #define sb_is_blkdev_sb(sb) ((sb) == blockdev_superblock)
+#else
+static inline void bdev_cache_init(void) {}
+
+#define sb_is_blkdev_sb(sb) 0
+#endif
 
 
 /*
 /*
  * char_dev.c
  * char_dev.c

+ 22 - 0
fs/no-block.c

@@ -0,0 +1,22 @@
+/* no-block.c: implementation of routines required for non-BLOCK configuration
+ *
+ * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/fs.h>
+
+static int no_blkdev_open(struct inode * inode, struct file * filp)
+{
+	return -ENODEV;
+}
+
+const struct file_operations def_blk_fops = {
+	.open		= no_blkdev_open,
+};

+ 1 - 1
fs/partitions/Makefile

@@ -2,7 +2,7 @@
 # Makefile for the linux kernel.
 # Makefile for the linux kernel.
 #
 #
 
 
-obj-y := check.o
+obj-$(CONFIG_BLOCK) := check.o
 
 
 obj-$(CONFIG_ACORN_PARTITION) += acorn.o
 obj-$(CONFIG_ACORN_PARTITION) += acorn.o
 obj-$(CONFIG_AMIGA_PARTITION) += amiga.o
 obj-$(CONFIG_AMIGA_PARTITION) += amiga.o

+ 10 - 1
fs/proc/proc_misc.c

@@ -277,12 +277,15 @@ static int devinfo_show(struct seq_file *f, void *v)
 		if (i == 0)
 		if (i == 0)
 			seq_printf(f, "Character devices:\n");
 			seq_printf(f, "Character devices:\n");
 		chrdev_show(f, i);
 		chrdev_show(f, i);
-	} else {
+	}
+#ifdef CONFIG_BLOCK
+	else {
 		i -= CHRDEV_MAJOR_HASH_SIZE;
 		i -= CHRDEV_MAJOR_HASH_SIZE;
 		if (i == 0)
 		if (i == 0)
 			seq_printf(f, "\nBlock devices:\n");
 			seq_printf(f, "\nBlock devices:\n");
 		blkdev_show(f, i);
 		blkdev_show(f, i);
 	}
 	}
+#endif
 	return 0;
 	return 0;
 }
 }
 
 
@@ -355,6 +358,7 @@ static int stram_read_proc(char *page, char **start, off_t off,
 }
 }
 #endif
 #endif
 
 
+#ifdef CONFIG_BLOCK
 extern struct seq_operations partitions_op;
 extern struct seq_operations partitions_op;
 static int partitions_open(struct inode *inode, struct file *file)
 static int partitions_open(struct inode *inode, struct file *file)
 {
 {
@@ -378,6 +382,7 @@ static struct file_operations proc_diskstats_operations = {
 	.llseek		= seq_lseek,
 	.llseek		= seq_lseek,
 	.release	= seq_release,
 	.release	= seq_release,
 };
 };
+#endif
 
 
 #ifdef CONFIG_MODULES
 #ifdef CONFIG_MODULES
 extern struct seq_operations modules_op;
 extern struct seq_operations modules_op;
@@ -695,7 +700,9 @@ void __init proc_misc_init(void)
 		entry->proc_fops = &proc_kmsg_operations;
 		entry->proc_fops = &proc_kmsg_operations;
 	create_seq_entry("devices", 0, &proc_devinfo_operations);
 	create_seq_entry("devices", 0, &proc_devinfo_operations);
 	create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
 	create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
+#ifdef CONFIG_BLOCK
 	create_seq_entry("partitions", 0, &proc_partitions_operations);
 	create_seq_entry("partitions", 0, &proc_partitions_operations);
+#endif
 	create_seq_entry("stat", 0, &proc_stat_operations);
 	create_seq_entry("stat", 0, &proc_stat_operations);
 	create_seq_entry("interrupts", 0, &proc_interrupts_operations);
 	create_seq_entry("interrupts", 0, &proc_interrupts_operations);
 #ifdef CONFIG_SLAB
 #ifdef CONFIG_SLAB
@@ -707,7 +714,9 @@ void __init proc_misc_init(void)
 	create_seq_entry("buddyinfo",S_IRUGO, &fragmentation_file_operations);
 	create_seq_entry("buddyinfo",S_IRUGO, &fragmentation_file_operations);
 	create_seq_entry("vmstat",S_IRUGO, &proc_vmstat_file_operations);
 	create_seq_entry("vmstat",S_IRUGO, &proc_vmstat_file_operations);
 	create_seq_entry("zoneinfo",S_IRUGO, &proc_zoneinfo_file_operations);
 	create_seq_entry("zoneinfo",S_IRUGO, &proc_zoneinfo_file_operations);
+#ifdef CONFIG_BLOCK
 	create_seq_entry("diskstats", 0, &proc_diskstats_operations);
 	create_seq_entry("diskstats", 0, &proc_diskstats_operations);
+#endif
 #ifdef CONFIG_MODULES
 #ifdef CONFIG_MODULES
 	create_seq_entry("modules", 0, &proc_modules_operations);
 	create_seq_entry("modules", 0, &proc_modules_operations);
 #endif
 #endif

+ 31 - 13
fs/quota.c

@@ -337,6 +337,34 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, void
 	return 0;
 	return 0;
 }
 }
 
 
+/*
+ * look up a superblock on which quota ops will be performed
+ * - use the name of a block device to find the superblock thereon
+ */
+static inline struct super_block *quotactl_block(const char __user *special)
+{
+#ifdef CONFIG_BLOCK
+	struct block_device *bdev;
+	struct super_block *sb;
+	char *tmp = getname(special);
+
+	if (IS_ERR(tmp))
+		return ERR_PTR(PTR_ERR(tmp));
+	bdev = lookup_bdev(tmp);
+	putname(tmp);
+	if (IS_ERR(bdev))
+		return ERR_PTR(PTR_ERR(bdev));
+	sb = get_super(bdev);
+	bdput(bdev);
+	if (!sb)
+		return ERR_PTR(-ENODEV);
+
+	return sb;
+#else
+	return ERR_PTR(-ENODEV);
+#endif
+}
+
 /*
 /*
  * This is the system call interface. This communicates with
  * This is the system call interface. This communicates with
  * the user-level programs. Currently this only supports diskquota
  * the user-level programs. Currently this only supports diskquota
@@ -347,25 +375,15 @@ asmlinkage long sys_quotactl(unsigned int cmd, const char __user *special, qid_t
 {
 {
 	uint cmds, type;
 	uint cmds, type;
 	struct super_block *sb = NULL;
 	struct super_block *sb = NULL;
-	struct block_device *bdev;
-	char *tmp;
 	int ret;
 	int ret;
 
 
 	cmds = cmd >> SUBCMDSHIFT;
 	cmds = cmd >> SUBCMDSHIFT;
 	type = cmd & SUBCMDMASK;
 	type = cmd & SUBCMDMASK;
 
 
 	if (cmds != Q_SYNC || special) {
 	if (cmds != Q_SYNC || special) {
-		tmp = getname(special);
-		if (IS_ERR(tmp))
-			return PTR_ERR(tmp);
-		bdev = lookup_bdev(tmp);
-		putname(tmp);
-		if (IS_ERR(bdev))
-			return PTR_ERR(bdev);
-		sb = get_super(bdev);
-		bdput(bdev);
-		if (!sb)
-			return -ENODEV;
+		sb = quotactl_block(special);
+		if (IS_ERR(sb))
+			return PTR_ERR(sb);
 	}
 	}
 
 
 	ret = check_quotactl_valid(sb, type, cmds, id);
 	ret = check_quotactl_valid(sb, type, cmds, id);

+ 4 - 0
fs/super.c

@@ -571,8 +571,10 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
 {
 {
 	int retval;
 	int retval;
 	
 	
+#ifdef CONFIG_BLOCK
 	if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev))
 	if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev))
 		return -EACCES;
 		return -EACCES;
+#endif
 	if (flags & MS_RDONLY)
 	if (flags & MS_RDONLY)
 		acct_auto_close(sb);
 		acct_auto_close(sb);
 	shrink_dcache_sb(sb);
 	shrink_dcache_sb(sb);
@@ -692,6 +694,7 @@ void kill_litter_super(struct super_block *sb)
 
 
 EXPORT_SYMBOL(kill_litter_super);
 EXPORT_SYMBOL(kill_litter_super);
 
 
+#ifdef CONFIG_BLOCK
 static int set_bdev_super(struct super_block *s, void *data)
 static int set_bdev_super(struct super_block *s, void *data)
 {
 {
 	s->s_bdev = data;
 	s->s_bdev = data;
@@ -787,6 +790,7 @@ void kill_block_super(struct super_block *sb)
 }
 }
 
 
 EXPORT_SYMBOL(kill_block_super);
 EXPORT_SYMBOL(kill_block_super);
+#endif
 
 
 int get_sb_nodev(struct file_system_type *fs_type,
 int get_sb_nodev(struct file_system_type *fs_type,
 	int flags, void *data,
 	int flags, void *data,

+ 1 - 0
fs/xfs/Kconfig

@@ -1,5 +1,6 @@
 config XFS_FS
 config XFS_FS
 	tristate "XFS filesystem support"
 	tristate "XFS filesystem support"
+	depends on BLOCK
 	help
 	help
 	  XFS is a high performance journaling filesystem which originated
 	  XFS is a high performance journaling filesystem which originated
 	  on the SGI IRIX platform.  It is completely multi-threaded, can
 	  on the SGI IRIX platform.  It is completely multi-threaded, can

+ 36 - 14
include/linux/blkdev.h

@@ -16,6 +16,22 @@
 
 
 #include <asm/scatterlist.h>
 #include <asm/scatterlist.h>
 
 
+#ifdef CONFIG_LBD
+# include <asm/div64.h>
+# define sector_div(a, b) do_div(a, b)
+#else
+# define sector_div(n, b)( \
+{ \
+	int _res; \
+	_res = (n) % (b); \
+	(n) /= (b); \
+	_res; \
+} \
+)
+#endif
+
+#ifdef CONFIG_BLOCK
+
 struct scsi_ioctl_command;
 struct scsi_ioctl_command;
 
 
 struct request_queue;
 struct request_queue;
@@ -818,24 +834,30 @@ struct work_struct;
 int kblockd_schedule_work(struct work_struct *work);
 int kblockd_schedule_work(struct work_struct *work);
 void kblockd_flush(void);
 void kblockd_flush(void);
 
 
-#ifdef CONFIG_LBD
-# include <asm/div64.h>
-# define sector_div(a, b) do_div(a, b)
-#else
-# define sector_div(n, b)( \
-{ \
-	int _res; \
-	_res = (n) % (b); \
-	(n) /= (b); \
-	_res; \
-} \
-)
-#endif 
-
 #define MODULE_ALIAS_BLOCKDEV(major,minor) \
 #define MODULE_ALIAS_BLOCKDEV(major,minor) \
 	MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor))
 	MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor))
 #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \
 #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \
 	MODULE_ALIAS("block-major-" __stringify(major) "-*")
 	MODULE_ALIAS("block-major-" __stringify(major) "-*")
 
 
 
 
+#else /* CONFIG_BLOCK */
+/*
+ * stubs for when the block layer is configured out
+ */
+#define buffer_heads_over_limit 0
+
+static inline long blk_congestion_wait(int rw, long timeout)
+{
+	return timeout;
+}
+
+static inline long nr_blockdev_pages(void)
+{
+	return 0;
+}
+
+static inline void exit_io_context(void) {}
+
+#endif /* CONFIG_BLOCK */
+
 #endif
 #endif

+ 16 - 0
include/linux/buffer_head.h

@@ -14,6 +14,8 @@
 #include <linux/wait.h>
 #include <linux/wait.h>
 #include <asm/atomic.h>
 #include <asm/atomic.h>
 
 
+#ifdef CONFIG_BLOCK
+
 enum bh_state_bits {
 enum bh_state_bits {
 	BH_Uptodate,	/* Contains valid data */
 	BH_Uptodate,	/* Contains valid data */
 	BH_Dirty,	/* Is dirty */
 	BH_Dirty,	/* Is dirty */
@@ -301,4 +303,18 @@ static inline void lock_buffer(struct buffer_head *bh)
 }
 }
 
 
 extern int __set_page_dirty_buffers(struct page *page);
 extern int __set_page_dirty_buffers(struct page *page);
+
+#else /* CONFIG_BLOCK */
+
+static inline void buffer_init(void) {}
+static inline int try_to_free_buffers(struct page *page) { return 1; }
+static inline int sync_blockdev(struct block_device *bdev) { return 0; }
+static inline int inode_has_buffers(struct inode *inode) { return 0; }
+static inline void invalidate_inode_buffers(struct inode *inode) {}
+static inline int remove_inode_buffers(struct inode *inode) { return 1; }
+static inline int sync_mapping_buffers(struct address_space *mapping) { return 0; }
+static inline void invalidate_bdev(struct block_device *bdev, int destroy_dirty_buffers) {}
+
+
+#endif /* CONFIG_BLOCK */
 #endif /* _LINUX_BUFFER_HEAD_H */
 #endif /* _LINUX_BUFFER_HEAD_H */

+ 2 - 0
include/linux/compat_ioctl.h

@@ -90,6 +90,7 @@ COMPATIBLE_IOCTL(FDTWADDLE)
 COMPATIBLE_IOCTL(FDFMTTRK)
 COMPATIBLE_IOCTL(FDFMTTRK)
 COMPATIBLE_IOCTL(FDRAWCMD)
 COMPATIBLE_IOCTL(FDRAWCMD)
 /* 0x12 */
 /* 0x12 */
+#ifdef CONFIG_BLOCK
 COMPATIBLE_IOCTL(BLKRASET)
 COMPATIBLE_IOCTL(BLKRASET)
 COMPATIBLE_IOCTL(BLKROSET)
 COMPATIBLE_IOCTL(BLKROSET)
 COMPATIBLE_IOCTL(BLKROGET)
 COMPATIBLE_IOCTL(BLKROGET)
@@ -103,6 +104,7 @@ COMPATIBLE_IOCTL(BLKTRACESETUP)
 COMPATIBLE_IOCTL(BLKTRACETEARDOWN)
 COMPATIBLE_IOCTL(BLKTRACETEARDOWN)
 ULONG_IOCTL(BLKRASET)
 ULONG_IOCTL(BLKRASET)
 ULONG_IOCTL(BLKFRASET)
 ULONG_IOCTL(BLKFRASET)
+#endif
 /* RAID */
 /* RAID */
 COMPATIBLE_IOCTL(RAID_VERSION)
 COMPATIBLE_IOCTL(RAID_VERSION)
 COMPATIBLE_IOCTL(GET_ARRAY_INFO)
 COMPATIBLE_IOCTL(GET_ARRAY_INFO)

+ 3 - 0
include/linux/elevator.h

@@ -3,6 +3,8 @@
 
 
 #include <linux/percpu.h>
 #include <linux/percpu.h>
 
 
+#ifdef CONFIG_BLOCK
+
 typedef int (elevator_merge_fn) (request_queue_t *, struct request **,
 typedef int (elevator_merge_fn) (request_queue_t *, struct request **,
 				 struct bio *);
 				 struct bio *);
 
 
@@ -203,4 +205,5 @@ enum {
 	__val;							\
 	__val;							\
 })
 })
 
 
+#endif /* CONFIG_BLOCK */
 #endif
 #endif

+ 22 - 3
include/linux/fs.h

@@ -1482,6 +1482,7 @@ extern void __init vfs_caches_init(unsigned long);
 extern void putname(const char *name);
 extern void putname(const char *name);
 #endif
 #endif
 
 
+#ifdef CONFIG_BLOCK
 extern int register_blkdev(unsigned int, const char *);
 extern int register_blkdev(unsigned int, const char *);
 extern int unregister_blkdev(unsigned int, const char *);
 extern int unregister_blkdev(unsigned int, const char *);
 extern struct block_device *bdget(dev_t);
 extern struct block_device *bdget(dev_t);
@@ -1490,11 +1491,15 @@ extern void bd_forget(struct inode *inode);
 extern void bdput(struct block_device *);
 extern void bdput(struct block_device *);
 extern struct block_device *open_by_devnum(dev_t, unsigned);
 extern struct block_device *open_by_devnum(dev_t, unsigned);
 extern struct block_device *open_partition_by_devnum(dev_t, unsigned);
 extern struct block_device *open_partition_by_devnum(dev_t, unsigned);
-extern const struct file_operations def_blk_fops;
 extern const struct address_space_operations def_blk_aops;
 extern const struct address_space_operations def_blk_aops;
+#else
+static inline void bd_forget(struct inode *inode) {}
+#endif
+extern const struct file_operations def_blk_fops;
 extern const struct file_operations def_chr_fops;
 extern const struct file_operations def_chr_fops;
 extern const struct file_operations bad_sock_fops;
 extern const struct file_operations bad_sock_fops;
 extern const struct file_operations def_fifo_fops;
 extern const struct file_operations def_fifo_fops;
+#ifdef CONFIG_BLOCK
 extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
 extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
 extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long);
 extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long);
 extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long);
 extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long);
@@ -1510,6 +1515,7 @@ extern void bd_release_from_disk(struct block_device *, struct gendisk *);
 #define bd_claim_by_disk(bdev, holder, disk)	bd_claim(bdev, holder)
 #define bd_claim_by_disk(bdev, holder, disk)	bd_claim(bdev, holder)
 #define bd_release_from_disk(bdev, disk)	bd_release(bdev)
 #define bd_release_from_disk(bdev, disk)	bd_release(bdev)
 #endif
 #endif
+#endif
 
 
 /* fs/char_dev.c */
 /* fs/char_dev.c */
 #define CHRDEV_MAJOR_HASH_SIZE	255
 #define CHRDEV_MAJOR_HASH_SIZE	255
@@ -1523,14 +1529,19 @@ extern int chrdev_open(struct inode *, struct file *);
 extern void chrdev_show(struct seq_file *,off_t);
 extern void chrdev_show(struct seq_file *,off_t);
 
 
 /* fs/block_dev.c */
 /* fs/block_dev.c */
-#define BLKDEV_MAJOR_HASH_SIZE	255
 #define BDEVNAME_SIZE	32	/* Largest string for a blockdev identifier */
 #define BDEVNAME_SIZE	32	/* Largest string for a blockdev identifier */
+
+#ifdef CONFIG_BLOCK
+#define BLKDEV_MAJOR_HASH_SIZE	255
 extern const char *__bdevname(dev_t, char *buffer);
 extern const char *__bdevname(dev_t, char *buffer);
 extern const char *bdevname(struct block_device *bdev, char *buffer);
 extern const char *bdevname(struct block_device *bdev, char *buffer);
 extern struct block_device *lookup_bdev(const char *);
 extern struct block_device *lookup_bdev(const char *);
 extern struct block_device *open_bdev_excl(const char *, int, void *);
 extern struct block_device *open_bdev_excl(const char *, int, void *);
 extern void close_bdev_excl(struct block_device *);
 extern void close_bdev_excl(struct block_device *);
 extern void blkdev_show(struct seq_file *,off_t);
 extern void blkdev_show(struct seq_file *,off_t);
+#else
+#define BLKDEV_MAJOR_HASH_SIZE	0
+#endif
 
 
 extern void init_special_inode(struct inode *, umode_t, dev_t);
 extern void init_special_inode(struct inode *, umode_t, dev_t);
 
 
@@ -1544,6 +1555,7 @@ extern const struct file_operations rdwr_fifo_fops;
 
 
 extern int fs_may_remount_ro(struct super_block *);
 extern int fs_may_remount_ro(struct super_block *);
 
 
+#ifdef CONFIG_BLOCK
 /*
 /*
  * return READ, READA, or WRITE
  * return READ, READA, or WRITE
  */
  */
@@ -1555,9 +1567,10 @@ extern int fs_may_remount_ro(struct super_block *);
 #define bio_data_dir(bio)	((bio)->bi_rw & 1)
 #define bio_data_dir(bio)	((bio)->bi_rw & 1)
 
 
 extern int check_disk_change(struct block_device *);
 extern int check_disk_change(struct block_device *);
-extern int invalidate_inodes(struct super_block *);
 extern int __invalidate_device(struct block_device *);
 extern int __invalidate_device(struct block_device *);
 extern int invalidate_partition(struct gendisk *, int);
 extern int invalidate_partition(struct gendisk *, int);
+#endif
+extern int invalidate_inodes(struct super_block *);
 unsigned long invalidate_mapping_pages(struct address_space *mapping,
 unsigned long invalidate_mapping_pages(struct address_space *mapping,
 					pgoff_t start, pgoff_t end);
 					pgoff_t start, pgoff_t end);
 unsigned long invalidate_inode_pages(struct address_space *mapping);
 unsigned long invalidate_inode_pages(struct address_space *mapping);
@@ -1590,7 +1603,9 @@ extern void emergency_sync(void);
 extern void emergency_remount(void);
 extern void emergency_remount(void);
 extern int do_remount_sb(struct super_block *sb, int flags,
 extern int do_remount_sb(struct super_block *sb, int flags,
 			 void *data, int force);
 			 void *data, int force);
+#ifdef CONFIG_BLOCK
 extern sector_t bmap(struct inode *, sector_t);
 extern sector_t bmap(struct inode *, sector_t);
+#endif
 extern int notify_change(struct dentry *, struct iattr *);
 extern int notify_change(struct dentry *, struct iattr *);
 extern int permission(struct inode *, int, struct nameidata *);
 extern int permission(struct inode *, int, struct nameidata *);
 extern int generic_permission(struct inode *, int,
 extern int generic_permission(struct inode *, int,
@@ -1673,9 +1688,11 @@ static inline void insert_inode_hash(struct inode *inode) {
 extern struct file * get_empty_filp(void);
 extern struct file * get_empty_filp(void);
 extern void file_move(struct file *f, struct list_head *list);
 extern void file_move(struct file *f, struct list_head *list);
 extern void file_kill(struct file *f);
 extern void file_kill(struct file *f);
+#ifdef CONFIG_BLOCK
 struct bio;
 struct bio;
 extern void submit_bio(int, struct bio *);
 extern void submit_bio(int, struct bio *);
 extern int bdev_read_only(struct block_device *);
 extern int bdev_read_only(struct block_device *);
+#endif
 extern int set_blocksize(struct block_device *, int);
 extern int set_blocksize(struct block_device *, int);
 extern int sb_set_blocksize(struct super_block *, int);
 extern int sb_set_blocksize(struct super_block *, int);
 extern int sb_min_blocksize(struct super_block *, int);
 extern int sb_min_blocksize(struct super_block *, int);
@@ -1756,6 +1773,7 @@ static inline void do_generic_file_read(struct file * filp, loff_t *ppos,
 				actor);
 				actor);
 }
 }
 
 
+#ifdef CONFIG_BLOCK
 ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
 ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
 	struct block_device *bdev, const struct iovec *iov, loff_t offset,
 	struct block_device *bdev, const struct iovec *iov, loff_t offset,
 	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io,
 	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io,
@@ -1793,6 +1811,7 @@ static inline ssize_t blockdev_direct_IO_own_locking(int rw, struct kiocb *iocb,
 	return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
 	return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
 				nr_segs, get_block, end_io, DIO_OWN_LOCKING);
 				nr_segs, get_block, end_io, DIO_OWN_LOCKING);
 }
 }
+#endif
 
 
 extern const struct file_operations generic_ro_fops;
 extern const struct file_operations generic_ro_fops;
 
 

+ 4 - 0
include/linux/genhd.h

@@ -11,6 +11,8 @@
 
 
 #include <linux/types.h>
 #include <linux/types.h>
 
 
+#ifdef CONFIG_BLOCK
+
 enum {
 enum {
 /* These three have identical behaviour; use the second one if DOS FDISK gets
 /* These three have identical behaviour; use the second one if DOS FDISK gets
    confused about extended/logical partitions starting past cylinder 1023. */
    confused about extended/logical partitions starting past cylinder 1023. */
@@ -420,3 +422,5 @@ static inline struct block_device *bdget_disk(struct gendisk *disk, int index)
 #endif
 #endif
 
 
 #endif
 #endif
+
+#endif

+ 3 - 0
include/linux/mpage.h

@@ -9,6 +9,7 @@
  * (And no, it doesn't do the #ifdef __MPAGE_H thing, and it doesn't do
  * (And no, it doesn't do the #ifdef __MPAGE_H thing, and it doesn't do
  * nested includes.  Get it right in the .c file).
  * nested includes.  Get it right in the .c file).
  */
  */
+#ifdef CONFIG_BLOCK
 
 
 struct writeback_control;
 struct writeback_control;
 typedef int (writepage_t)(struct page *page, struct writeback_control *wbc);
 typedef int (writepage_t)(struct page *page, struct writeback_control *wbc);
@@ -20,3 +21,5 @@ int mpage_writepages(struct address_space *mapping,
 		struct writeback_control *wbc, get_block_t get_block);
 		struct writeback_control *wbc, get_block_t get_block);
 int mpage_writepage(struct page *page, get_block_t *get_block,
 int mpage_writepage(struct page *page, get_block_t *get_block,
 		struct writeback_control *wbc);
 		struct writeback_control *wbc);
+
+#endif

+ 3 - 0
include/linux/raid/md.h

@@ -53,6 +53,8 @@
 #include <linux/raid/md_u.h>
 #include <linux/raid/md_u.h>
 #include <linux/raid/md_k.h>
 #include <linux/raid/md_k.h>
 
 
+#ifdef CONFIG_MD
+
 /*
 /*
  * Different major versions are not compatible.
  * Different major versions are not compatible.
  * Different minor versions are only downward compatible.
  * Different minor versions are only downward compatible.
@@ -95,5 +97,6 @@ extern void md_new_event(mddev_t *mddev);
 
 
 extern void md_update_sb(mddev_t * mddev);
 extern void md_update_sb(mddev_t * mddev);
 
 
+#endif /* CONFIG_MD */
 #endif 
 #endif 
 
 

+ 3 - 0
include/linux/raid/md_k.h

@@ -18,6 +18,8 @@
 /* and dm-bio-list.h is not under include/linux because.... ??? */
 /* and dm-bio-list.h is not under include/linux because.... ??? */
 #include "../../../drivers/md/dm-bio-list.h"
 #include "../../../drivers/md/dm-bio-list.h"
 
 
+#ifdef CONFIG_BLOCK
+
 #define	LEVEL_MULTIPATH		(-4)
 #define	LEVEL_MULTIPATH		(-4)
 #define	LEVEL_LINEAR		(-1)
 #define	LEVEL_LINEAR		(-1)
 #define	LEVEL_FAULTY		(-5)
 #define	LEVEL_FAULTY		(-5)
@@ -362,5 +364,6 @@ static inline void safe_put_page(struct page *p)
 	if (p) put_page(p);
 	if (p) put_page(p);
 }
 }
 
 
+#endif /* CONFIG_BLOCK */
 #endif
 #endif
 
 

+ 2 - 1
include/scsi/scsi_tcq.h

@@ -6,7 +6,6 @@
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_host.h>
 
 
-
 #define MSG_SIMPLE_TAG	0x20
 #define MSG_SIMPLE_TAG	0x20
 #define MSG_HEAD_TAG	0x21
 #define MSG_HEAD_TAG	0x21
 #define MSG_ORDERED_TAG	0x22
 #define MSG_ORDERED_TAG	0x22
@@ -14,6 +13,7 @@
 #define SCSI_NO_TAG	(-1)    /* identify no tag in use */
 #define SCSI_NO_TAG	(-1)    /* identify no tag in use */
 
 
 
 
+#ifdef CONFIG_BLOCK
 
 
 /**
 /**
  * scsi_get_tag_type - get the type of tag the device supports
  * scsi_get_tag_type - get the type of tag the device supports
@@ -144,4 +144,5 @@ static inline int scsi_init_shared_tag_map(struct Scsi_Host *shost, int depth)
 	return shost->bqt ? 0 : -ENOMEM;
 	return shost->bqt ? 0 : -ENOMEM;
 }
 }
 
 
+#endif /* CONFIG_BLOCK */
 #endif /* _SCSI_SCSI_TCQ_H */
 #endif /* _SCSI_SCSI_TCQ_H */

+ 1 - 1
init/Kconfig

@@ -92,7 +92,7 @@ config LOCALVERSION_AUTO
 
 
 config SWAP
 config SWAP
 	bool "Support for paging of anonymous memory (swap)"
 	bool "Support for paging of anonymous memory (swap)"
-	depends on MMU
+	depends on MMU && BLOCK
 	default y
 	default y
 	help
 	help
 	  This option allows you to choose whether you want to have support
 	  This option allows you to choose whether you want to have support

+ 12 - 1
init/do_mounts.c

@@ -285,7 +285,11 @@ void __init mount_block_root(char *name, int flags)
 {
 {
 	char *fs_names = __getname();
 	char *fs_names = __getname();
 	char *p;
 	char *p;
+#ifdef CONFIG_BLOCK
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
+#else
+	const char *b = name;
+#endif
 
 
 	get_fs_names(fs_names);
 	get_fs_names(fs_names);
 retry:
 retry:
@@ -304,7 +308,9 @@ retry:
 		 * Allow the user to distinguish between failed sys_open
 		 * Allow the user to distinguish between failed sys_open
 		 * and bad superblock on root device.
 		 * and bad superblock on root device.
 		 */
 		 */
+#ifdef CONFIG_BLOCK
 		__bdevname(ROOT_DEV, b);
 		__bdevname(ROOT_DEV, b);
+#endif
 		printk("VFS: Cannot open root device \"%s\" or %s\n",
 		printk("VFS: Cannot open root device \"%s\" or %s\n",
 				root_device_name, b);
 				root_device_name, b);
 		printk("Please append a correct \"root=\" boot option\n");
 		printk("Please append a correct \"root=\" boot option\n");
@@ -316,7 +322,10 @@ retry:
 	for (p = fs_names; *p; p += strlen(p)+1)
 	for (p = fs_names; *p; p += strlen(p)+1)
 		printk(" %s", p);
 		printk(" %s", p);
 	printk("\n");
 	printk("\n");
-	panic("VFS: Unable to mount root fs on %s", __bdevname(ROOT_DEV, b));
+#ifdef CONFIG_BLOCK
+	__bdevname(ROOT_DEV, b);
+#endif
+	panic("VFS: Unable to mount root fs on %s", b);
 out:
 out:
 	putname(fs_names);
 	putname(fs_names);
 }
 }
@@ -387,8 +396,10 @@ void __init mount_root(void)
 			change_floppy("root floppy");
 			change_floppy("root floppy");
 	}
 	}
 #endif
 #endif
+#ifdef CONFIG_BLOCK
 	create_dev("/dev/root", ROOT_DEV);
 	create_dev("/dev/root", ROOT_DEV);
 	mount_block_root("/dev/root", root_mountflags);
 	mount_block_root("/dev/root", root_mountflags);
+#endif
 }
 }
 
 
 /*
 /*

+ 5 - 0
kernel/sys_ni.c

@@ -134,3 +134,8 @@ cond_syscall(sys_madvise);
 cond_syscall(sys_mremap);
 cond_syscall(sys_mremap);
 cond_syscall(sys_remap_file_pages);
 cond_syscall(sys_remap_file_pages);
 cond_syscall(compat_sys_move_pages);
 cond_syscall(compat_sys_move_pages);
+
+/* block-layer dependent */
+cond_syscall(sys_bdflush);
+cond_syscall(sys_ioprio_set);
+cond_syscall(sys_ioprio_get);

+ 1 - 1
mm/Makefile

@@ -12,7 +12,7 @@ obj-y			:= bootmem.o filemap.o mempool.o oom_kill.o fadvise.o \
 			   readahead.o swap.o truncate.o vmscan.o \
 			   readahead.o swap.o truncate.o vmscan.o \
 			   prio_tree.o util.o mmzone.o vmstat.o $(mmu-y)
 			   prio_tree.o util.o mmzone.o vmstat.o $(mmu-y)
 
 
-ifeq ($(CONFIG_MMU),y)
+ifeq ($(CONFIG_MMU)$(CONFIG_BLOCK),yy)
 obj-y			+= bounce.o
 obj-y			+= bounce.o
 endif
 endif
 obj-$(CONFIG_SWAP)	+= page_io.o swap_state.o swapfile.o thrash.o
 obj-$(CONFIG_SWAP)	+= page_io.o swap_state.o swapfile.o thrash.o

+ 4 - 0
mm/filemap.c

@@ -2020,6 +2020,7 @@ inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, i
 		if (unlikely(*pos + *count > inode->i_sb->s_maxbytes))
 		if (unlikely(*pos + *count > inode->i_sb->s_maxbytes))
 			*count = inode->i_sb->s_maxbytes - *pos;
 			*count = inode->i_sb->s_maxbytes - *pos;
 	} else {
 	} else {
+#ifdef CONFIG_BLOCK
 		loff_t isize;
 		loff_t isize;
 		if (bdev_read_only(I_BDEV(inode)))
 		if (bdev_read_only(I_BDEV(inode)))
 			return -EPERM;
 			return -EPERM;
@@ -2031,6 +2032,9 @@ inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, i
 
 
 		if (*pos + *count > isize)
 		if (*pos + *count > isize)
 			*count = isize - *pos;
 			*count = isize - *pos;
+#else
+		return -EPERM;
+#endif
 	}
 	}
 	return 0;
 	return 0;
 }
 }

+ 2 - 0
mm/migrate.c

@@ -409,6 +409,7 @@ int migrate_page(struct address_space *mapping,
 }
 }
 EXPORT_SYMBOL(migrate_page);
 EXPORT_SYMBOL(migrate_page);
 
 
+#ifdef CONFIG_BLOCK
 /*
 /*
  * Migration function for pages with buffers. This function can only be used
  * Migration function for pages with buffers. This function can only be used
  * if the underlying filesystem guarantees that no other references to "page"
  * if the underlying filesystem guarantees that no other references to "page"
@@ -466,6 +467,7 @@ int buffer_migrate_page(struct address_space *mapping,
 	return 0;
 	return 0;
 }
 }
 EXPORT_SYMBOL(buffer_migrate_page);
 EXPORT_SYMBOL(buffer_migrate_page);
+#endif
 
 
 /*
 /*
  * Writeback a page to clean the dirty state
  * Writeback a page to clean the dirty state

+ 5 - 3
mm/page-writeback.c

@@ -807,9 +807,11 @@ int fastcall set_page_dirty(struct page *page)
 
 
 	if (likely(mapping)) {
 	if (likely(mapping)) {
 		int (*spd)(struct page *) = mapping->a_ops->set_page_dirty;
 		int (*spd)(struct page *) = mapping->a_ops->set_page_dirty;
-		if (spd)
-			return (*spd)(page);
-		return __set_page_dirty_buffers(page);
+#ifdef CONFIG_BLOCK
+		if (!spd)
+			spd = __set_page_dirty_buffers;
+#endif
+		return (*spd)(page);
 	}
 	}
 	if (!PageDirty(page)) {
 	if (!PageDirty(page)) {
 		if (!TestSetPageDirty(page))
 		if (!TestSetPageDirty(page))

+ 2 - 0
mm/truncate.c

@@ -35,8 +35,10 @@ void do_invalidatepage(struct page *page, unsigned long offset)
 {
 {
 	void (*invalidatepage)(struct page *, unsigned long);
 	void (*invalidatepage)(struct page *, unsigned long);
 	invalidatepage = page->mapping->a_ops->invalidatepage;
 	invalidatepage = page->mapping->a_ops->invalidatepage;
+#ifdef CONFIG_BLOCK
 	if (!invalidatepage)
 	if (!invalidatepage)
 		invalidatepage = block_invalidatepage;
 		invalidatepage = block_invalidatepage;
+#endif
 	if (invalidatepage)
 	if (invalidatepage)
 		(*invalidatepage)(page, offset);
 		(*invalidatepage)(page, offset);
 }
 }