aboutsummaryrefslogtreecommitdiffstats
path: root/init
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2006-09-30 14:45:40 -0400
committerJens Axboe <axboe@nelson.home.kernel.dk>2006-09-30 14:52:31 -0400
commit9361401eb7619c033e2394e4f9f6d410d6719ac7 (patch)
tree04b94a71f2366988c17740d1c16cfbdec41d5d2e /init
parentd366e40a1cabd453be6e2609caa7e12f9ca17b1f (diff)
[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>
Diffstat (limited to 'init')
-rw-r--r--init/Kconfig2
-rw-r--r--init/do_mounts.c13
2 files changed, 13 insertions, 2 deletions
diff --git a/init/Kconfig b/init/Kconfig
index 4381006dd666..d2eb7a84a264 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -92,7 +92,7 @@ config LOCALVERSION_AUTO
92 92
93config SWAP 93config SWAP
94 bool "Support for paging of anonymous memory (swap)" 94 bool "Support for paging of anonymous memory (swap)"
95 depends on MMU 95 depends on MMU && BLOCK
96 default y 96 default y
97 help 97 help
98 This option allows you to choose whether you want to have support 98 This option allows you to choose whether you want to have support
diff --git a/init/do_mounts.c b/init/do_mounts.c
index b290aadb1d3f..dc1ec0803ef9 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -285,7 +285,11 @@ void __init mount_block_root(char *name, int flags)
285{ 285{
286 char *fs_names = __getname(); 286 char *fs_names = __getname();
287 char *p; 287 char *p;
288#ifdef CONFIG_BLOCK
288 char b[BDEVNAME_SIZE]; 289 char b[BDEVNAME_SIZE];
290#else
291 const char *b = name;
292#endif
289 293
290 get_fs_names(fs_names); 294 get_fs_names(fs_names);
291retry: 295retry:
@@ -304,7 +308,9 @@ retry:
304 * Allow the user to distinguish between failed sys_open 308 * Allow the user to distinguish between failed sys_open
305 * and bad superblock on root device. 309 * and bad superblock on root device.
306 */ 310 */
311#ifdef CONFIG_BLOCK
307 __bdevname(ROOT_DEV, b); 312 __bdevname(ROOT_DEV, b);
313#endif
308 printk("VFS: Cannot open root device \"%s\" or %s\n", 314 printk("VFS: Cannot open root device \"%s\" or %s\n",
309 root_device_name, b); 315 root_device_name, b);
310 printk("Please append a correct \"root=\" boot option\n"); 316 printk("Please append a correct \"root=\" boot option\n");
@@ -316,7 +322,10 @@ retry:
316 for (p = fs_names; *p; p += strlen(p)+1) 322 for (p = fs_names; *p; p += strlen(p)+1)
317 printk(" %s", p); 323 printk(" %s", p);
318 printk("\n"); 324 printk("\n");
319 panic("VFS: Unable to mount root fs on %s", __bdevname(ROOT_DEV, b)); 325#ifdef CONFIG_BLOCK
326 __bdevname(ROOT_DEV, b);
327#endif
328 panic("VFS: Unable to mount root fs on %s", b);
320out: 329out:
321 putname(fs_names); 330 putname(fs_names);
322} 331}
@@ -387,8 +396,10 @@ void __init mount_root(void)
387 change_floppy("root floppy"); 396 change_floppy("root floppy");
388 } 397 }
389#endif 398#endif
399#ifdef CONFIG_BLOCK
390 create_dev("/dev/root", ROOT_DEV); 400 create_dev("/dev/root", ROOT_DEV);
391 mount_block_root("/dev/root", root_mountflags); 401 mount_block_root("/dev/root", root_mountflags);
402#endif
392} 403}
393 404
394/* 405/*