2005-04-17 02:20:36 +04:00
# include <linux/module.h>
# include <linux/sched.h>
# include <linux/ctype.h>
# include <linux/fd.h>
# include <linux/tty.h>
# include <linux/suspend.h>
# include <linux/root_dev.h>
# include <linux/security.h>
# include <linux/delay.h>
2007-05-09 13:33:24 +04:00
# include <linux/genhd.h>
2005-07-13 00:58:07 +04:00
# include <linux/mount.h>
2006-07-18 21:59:59 +04:00
# include <linux/device.h>
2007-05-08 11:24:47 +04:00
# include <linux/init.h>
2008-02-06 12:36:47 +03:00
# include <linux/fs.h>
2008-07-25 12:45:29 +04:00
# include <linux/initrd.h>
2009-01-07 19:45:46 +03:00
# include <linux/async.h>
2005-04-17 02:20:36 +04:00
# include <linux/nfs_fs.h>
# include <linux/nfs_fs_sb.h>
# include <linux/nfs_mount.h>
# include "do_mounts.h"
int __initdata rd_doload ; /* 1 = load RAM disk, 0 = don't load */
[PATCH] vfs: MS_VERBOSE should be MS_SILENT
The meaning of MS_VERBOSE is backwards; if the bit is set, it really means,
"don't be verbose". This is confusing and counter-intuitive.
In addition, there is also no way to set the MS_VERBOSE flag in the
mount(8) program in util-linux, but interesting, it does define options
which would do the right thing if MS_SILENT were defined, which
unfortunately we do not:
#ifdef MS_SILENT
{ "quiet", 0, 0, MS_SILENT }, /* be quiet */
{ "loud", 0, 1, MS_SILENT }, /* print out messages. */
#endif
So the obvious fix is to deprecate the use of MS_VERBOSE and replace it
with MS_SILENT.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-03-24 14:15:10 +03:00
int root_mountflags = MS_RDONLY | MS_SILENT ;
2008-07-26 06:46:25 +04:00
static char * __initdata root_device_name ;
2005-04-17 02:20:36 +04:00
static char __initdata saved_root_name [ 64 ] ;
2007-07-16 10:40:35 +04:00
static int __initdata root_wait ;
2005-04-17 02:20:36 +04:00
dev_t ROOT_DEV ;
static int __init load_ramdisk ( char * str )
{
rd_doload = simple_strtol ( str , NULL , 0 ) & 3 ;
return 1 ;
}
__setup ( " load_ramdisk= " , load_ramdisk ) ;
static int __init readonly ( char * str )
{
if ( * str )
return 0 ;
root_mountflags | = MS_RDONLY ;
return 1 ;
}
static int __init readwrite ( char * str )
{
if ( * str )
return 0 ;
root_mountflags & = ~ MS_RDONLY ;
return 1 ;
}
__setup ( " ro " , readonly ) ;
__setup ( " rw " , readwrite ) ;
/*
* Convert a name into device number . We accept the following variants :
*
* 1 ) device number in hexadecimal represents itself
* 2 ) / dev / nfs represents Root_NFS ( 0xff )
* 3 ) / dev / < disk_name > represents the device number of disk
* 4 ) / dev / < disk_name > < decimal > represents the device number
* of partition - device number of disk plus the partition number
* 5 ) / dev / < disk_name > p < decimal > - same as the above , that form is
* used when disk name of partitioned disk ends on a digit .
*
2007-05-22 00:08:01 +04:00
* If name doesn ' t have fall into the categories above , we return ( 0 , 0 ) .
* block_class is used to check if something is a disk name . If the disk
* name contains slashes , the device name has them replaced with
* bangs .
2005-04-17 02:20:36 +04:00
*/
dev_t name_to_dev_t ( char * name )
{
char s [ 32 ] ;
char * p ;
dev_t res = 0 ;
2008-05-07 00:31:33 +04:00
int part ;
2005-04-17 02:20:36 +04:00
if ( strncmp ( name , " /dev/ " , 5 ) ! = 0 ) {
unsigned maj , min ;
if ( sscanf ( name , " %u:%u " , & maj , & min ) = = 2 ) {
res = MKDEV ( maj , min ) ;
if ( maj ! = MAJOR ( res ) | | min ! = MINOR ( res ) )
goto fail ;
} else {
res = new_decode_dev ( simple_strtoul ( name , & p , 16 ) ) ;
if ( * p )
goto fail ;
}
goto done ;
}
2007-05-22 00:08:01 +04:00
2005-04-17 02:20:36 +04:00
name + = 5 ;
res = Root_NFS ;
if ( strcmp ( name , " nfs " ) = = 0 )
goto done ;
res = Root_RAM0 ;
if ( strcmp ( name , " ram " ) = = 0 )
goto done ;
if ( strlen ( name ) > 31 )
goto fail ;
strcpy ( s , name ) ;
for ( p = s ; * p ; p + + )
if ( * p = = ' / ' )
* p = ' ! ' ;
2008-05-07 00:31:33 +04:00
res = blk_lookup_devt ( s , 0 ) ;
if ( res )
goto done ;
/*
* try non - existant , but valid partition , which may only exist
* after revalidating the disk , like partitioned md devices
*/
while ( p > s & & isdigit ( p [ - 1 ] ) )
p - - ;
if ( p = = s | | ! * p | | * p = = ' 0 ' )
goto fail ;
/* try disk name without <part number> */
part = simple_strtoul ( p , NULL , 10 ) ;
* p = ' \0 ' ;
res = blk_lookup_devt ( s , part ) ;
if ( res )
goto done ;
/* try disk name without p<part number> */
if ( p < s + 2 | | ! isdigit ( p [ - 2 ] ) | | p [ - 1 ] ! = ' p ' )
goto fail ;
p [ - 1 ] = ' \0 ' ;
res = blk_lookup_devt ( s , part ) ;
2005-04-17 02:20:36 +04:00
if ( res )
goto done ;
2007-05-22 00:08:01 +04:00
fail :
return 0 ;
2005-04-17 02:20:36 +04:00
done :
return res ;
}
static int __init root_dev_setup ( char * line )
{
strlcpy ( saved_root_name , line , sizeof ( saved_root_name ) ) ;
return 1 ;
}
__setup ( " root= " , root_dev_setup ) ;
2007-07-16 10:40:35 +04:00
static int __init rootwait_setup ( char * str )
{
if ( * str )
return 0 ;
root_wait = 1 ;
return 1 ;
}
__setup ( " rootwait " , rootwait_setup ) ;
2005-04-17 02:20:36 +04:00
static char * __initdata root_mount_data ;
static int __init root_data_setup ( char * str )
{
root_mount_data = str ;
return 1 ;
}
static char * __initdata root_fs_names ;
static int __init fs_names_setup ( char * str )
{
root_fs_names = str ;
return 1 ;
}
static unsigned int __initdata root_delay ;
static int __init root_delay_setup ( char * str )
{
root_delay = simple_strtoul ( str , NULL , 0 ) ;
return 1 ;
}
__setup ( " rootflags= " , root_data_setup ) ;
__setup ( " rootfstype= " , fs_names_setup ) ;
__setup ( " rootdelay= " , root_delay_setup ) ;
static void __init get_fs_names ( char * page )
{
char * s = page ;
if ( root_fs_names ) {
strcpy ( page , root_fs_names ) ;
while ( * s + + ) {
if ( s [ - 1 ] = = ' , ' )
s [ - 1 ] = ' \0 ' ;
}
} else {
int len = get_filesystem_list ( page ) ;
char * p , * next ;
page [ len ] = ' \0 ' ;
for ( p = page - 1 ; p ; p = next ) {
next = strchr ( + + p , ' \n ' ) ;
if ( * p + + ! = ' \t ' )
continue ;
while ( ( * s + + = * p + + ) ! = ' \n ' )
;
s [ - 1 ] = ' \0 ' ;
}
}
* s = ' \0 ' ;
}
static int __init do_mount_root ( char * name , char * fs , int flags , void * data )
{
int err = sys_mount ( name , " /root " , fs , flags , data ) ;
if ( err )
return err ;
sys_chdir ( " /root " ) ;
2008-02-15 06:34:38 +03:00
ROOT_DEV = current - > fs - > pwd . mnt - > mnt_sb - > s_dev ;
2009-01-07 01:40:43 +03:00
printk ( " VFS: Mounted root (%s filesystem)%s on device %u:%u. \n " ,
2008-02-15 06:34:38 +03:00
current - > fs - > pwd . mnt - > mnt_sb - > s_type - > name ,
current - > fs - > pwd . mnt - > mnt_sb - > s_flags & MS_RDONLY ?
2009-01-07 01:40:43 +03:00
" readonly " : " " , MAJOR ( ROOT_DEV ) , MINOR ( ROOT_DEV ) ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
void __init mount_block_root ( char * name , int flags )
{
char * fs_names = __getname ( ) ;
char * p ;
[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>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
2005-04-17 02:20:36 +04:00
char b [ BDEVNAME_SIZE ] ;
[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>
2006-09-30 22:45:40 +04:00
# else
const char * b = name ;
# endif
2005-04-17 02:20:36 +04:00
get_fs_names ( fs_names ) ;
retry :
for ( p = fs_names ; * p ; p + = strlen ( p ) + 1 ) {
int err = do_mount_root ( name , p , flags , root_mount_data ) ;
switch ( err ) {
case 0 :
goto out ;
case - EACCES :
flags | = MS_RDONLY ;
goto retry ;
case - EINVAL :
continue ;
}
/*
* Allow the user to distinguish between failed sys_open
* and bad superblock on root device .
2007-05-09 13:33:24 +04:00
* and give them a list of the available devices
2005-04-17 02:20:36 +04:00
*/
[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>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
2005-04-17 02:20:36 +04:00
__bdevname ( ROOT_DEV , b ) ;
[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>
2006-09-30 22:45:40 +04:00
# endif
2005-04-17 02:20:36 +04:00
printk ( " VFS: Cannot open root device \" %s \" or %s \n " ,
root_device_name , b ) ;
2007-05-09 13:33:24 +04:00
printk ( " Please append a correct \" root= \" boot option; here are the available partitions: \n " ) ;
2005-04-17 02:20:36 +04:00
2007-05-09 13:33:24 +04:00
printk_all_partitions ( ) ;
2008-09-01 15:44:35 +04:00
# ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
printk ( " DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "
" explicit textual name for \" root= \" boot option. \n " ) ;
# endif
2005-04-17 02:20:36 +04:00
panic ( " VFS: Unable to mount root fs on %s " , b ) ;
}
2006-05-15 20:44:29 +04:00
2007-05-09 13:33:24 +04:00
printk ( " List of all partitions: \n " ) ;
printk_all_partitions ( ) ;
2006-05-15 20:44:29 +04:00
printk ( " No filesystem could mount root, tried: " ) ;
for ( p = fs_names ; * p ; p + = strlen ( p ) + 1 )
printk ( " %s " , p ) ;
printk ( " \n " ) ;
[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>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
__bdevname ( ROOT_DEV , b ) ;
# endif
panic ( " VFS: Unable to mount root fs on %s " , b ) ;
2005-04-17 02:20:36 +04:00
out :
putname ( fs_names ) ;
}
# ifdef CONFIG_ROOT_NFS
static int __init mount_nfs_root ( void )
{
void * data = nfs_root_data ( ) ;
2005-06-21 08:15:16 +04:00
create_dev ( " /dev/root " , ROOT_DEV ) ;
2005-04-17 02:20:36 +04:00
if ( data & &
do_mount_root ( " /dev/root " , " nfs " , root_mountflags , data ) = = 0 )
return 1 ;
return 0 ;
}
# endif
# if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD)
void __init change_floppy ( char * fmt , . . . )
{
struct termios termios ;
char buf [ 80 ] ;
char c ;
int fd ;
va_list args ;
va_start ( args , fmt ) ;
vsprintf ( buf , fmt , args ) ;
va_end ( args ) ;
fd = sys_open ( " /dev/root " , O_RDWR | O_NDELAY , 0 ) ;
if ( fd > = 0 ) {
sys_ioctl ( fd , FDEJECT , 0 ) ;
sys_close ( fd ) ;
}
printk ( KERN_NOTICE " VFS: Insert %s and press ENTER \n " , buf ) ;
fd = sys_open ( " /dev/console " , O_RDWR , 0 ) ;
if ( fd > = 0 ) {
sys_ioctl ( fd , TCGETS , ( long ) & termios ) ;
termios . c_lflag & = ~ ICANON ;
sys_ioctl ( fd , TCSETSF , ( long ) & termios ) ;
sys_read ( fd , & c , 1 ) ;
termios . c_lflag | = ICANON ;
sys_ioctl ( fd , TCSETSF , ( long ) & termios ) ;
sys_close ( fd ) ;
}
}
# endif
void __init mount_root ( void )
{
# ifdef CONFIG_ROOT_NFS
if ( MAJOR ( ROOT_DEV ) = = UNNAMED_MAJOR ) {
if ( mount_nfs_root ( ) )
return ;
printk ( KERN_ERR " VFS: Unable to mount root fs via NFS, trying floppy. \n " ) ;
ROOT_DEV = Root_FD0 ;
}
# endif
# ifdef CONFIG_BLK_DEV_FD
if ( MAJOR ( ROOT_DEV ) = = FLOPPY_MAJOR ) {
/* rd_doload is 2 for a dual initrd/ramload setup */
if ( rd_doload = = 2 ) {
if ( rd_load_disk ( 1 ) ) {
ROOT_DEV = Root_RAM1 ;
root_device_name = NULL ;
}
} else
change_floppy ( " root floppy " ) ;
}
# endif
[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>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
2005-06-21 08:15:16 +04:00
create_dev ( " /dev/root " , ROOT_DEV ) ;
2005-04-17 02:20:36 +04:00
mount_block_root ( " /dev/root " , root_mountflags ) ;
[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>
2006-09-30 22:45:40 +04:00
# endif
2005-04-17 02:20:36 +04:00
}
/*
* Prepare the namespace - decide what / where to mount , load ramdisks , etc .
*/
void __init prepare_namespace ( void )
{
int is_floppy ;
if ( root_delay ) {
printk ( KERN_INFO " Waiting %dsec before mounting root device... \n " ,
root_delay ) ;
ssleep ( root_delay ) ;
}
2006-07-18 21:59:59 +04:00
/* wait for the known devices to complete their probing */
while ( driver_probe_done ( ) ! = 0 )
msleep ( 100 ) ;
2009-01-07 19:45:46 +03:00
async_synchronize_full ( ) ;
2006-07-18 21:59:59 +04:00
2005-04-17 02:20:36 +04:00
md_run_setup ( ) ;
if ( saved_root_name [ 0 ] ) {
root_device_name = saved_root_name ;
2008-01-31 18:25:00 +03:00
if ( ! strncmp ( root_device_name , " mtd " , 3 ) | |
! strncmp ( root_device_name , " ubi " , 3 ) ) {
2006-05-30 16:25:46 +04:00
mount_block_root ( root_device_name , root_mountflags ) ;
goto out ;
}
2005-04-17 02:20:36 +04:00
ROOT_DEV = name_to_dev_t ( root_device_name ) ;
if ( strncmp ( root_device_name , " /dev/ " , 5 ) = = 0 )
root_device_name + = 5 ;
}
if ( initrd_load ( ) )
goto out ;
2007-07-16 10:40:35 +04:00
/* wait for any asynchronous scanning to complete */
if ( ( ROOT_DEV = = 0 ) & & root_wait ) {
printk ( KERN_INFO " Waiting for root device %s... \n " ,
saved_root_name ) ;
while ( driver_probe_done ( ) ! = 0 | |
( ROOT_DEV = name_to_dev_t ( saved_root_name ) ) = = 0 )
msleep ( 100 ) ;
}
is_floppy = MAJOR ( ROOT_DEV ) = = FLOPPY_MAJOR ;
2005-04-17 02:20:36 +04:00
if ( is_floppy & & rd_doload & & rd_load_disk ( 0 ) )
ROOT_DEV = Root_RAM0 ;
mount_root ( ) ;
out :
sys_mount ( " . " , " / " , NULL , MS_MOVE , NULL ) ;
sys_chroot ( " . " ) ;
}