On Mon, Jul 18, 2011 at 12:06 PM, Sasha Levin <levinsasha928@xxxxxxxxx> wrote: > This patch adds support to mounting devices using a kernel parameter. > > Such feature is usefull for virtual guests. It allows easily automating > mounts without having to change the base image (which can be read-only). > > In /tools/kvm we are interested in such feature to allow us to automatically > mount user home directory using virtio-9p from the host to the guest > filesystem under '/hostfs'. > > Cc: Avi Kivity <avi@xxxxxxxxxx> > Cc: Ingo Molnar <mingo@xxxxxxx> > Cc: Pekka Enberg <penberg@xxxxxxxxxx> > Signed-off-by: Sasha Levin <levinsasha928@xxxxxxxxx> Lets CC fsdevel. > --- > Documentation/kernel-parameters.txt | 6 +++ > init/do_mounts.c | 61 +++++++++++++++++++++++++++++++++++ > 2 files changed, 67 insertions(+), 0 deletions(-) > > diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt > index aa47be7..e1955fb 100644 > --- a/Documentation/kernel-parameters.txt > +++ b/Documentation/kernel-parameters.txt > @@ -1476,6 +1476,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted. > log everything. Information is printed at KERN_DEBUG > so loglevel=8 may also need to be specified. > > + mount= > + [KNL] Mount a device to a mount point after loading > + rootfs and setting up devices. Can be used to mount > + up to 16 devices. > + Format: <source>,<destination>,<fs>[,<params>] > + > mousedev.tap_time= > [MOUSE] Maximum time between finger touching and > leaving touchpad surface for touch to be considered > diff --git a/init/do_mounts.c b/init/do_mounts.c > index c0851a8..0948f1d 100644 > --- a/init/do_mounts.c > +++ b/init/do_mounts.c > @@ -29,9 +29,24 @@ int root_mountflags = MS_RDONLY | MS_SILENT; > static char * __initdata root_device_name; > static char __initdata saved_root_name[64]; > static int __initdata root_wait; > +static char * __initdata user_mount[16]; > +static int __initdata user_mount_count; > > dev_t ROOT_DEV; > > +static int __init setup_user_mount(char *str) > +{ > + if (user_mount_count > 15) { > + printk(KERN_ERR "More than 16 'mount=' options specified.") > + return 1; > + } > + > + user_mount[user_mount_count++] = str; > + > + return 1; > +} > +__setup("mount=", setup_user_mount); > + > static int __init load_ramdisk(char *str) > { > rd_doload = simple_strtol(str,NULL,0) & 3; > @@ -431,6 +446,51 @@ void __init mount_root(void) > #endif > } > > +int __init do_user_mounts(void) > +{ > + int i, res; > + char *src, *dst, *fs, *params, *cur; > + > + for (i = 0; i < user_mount_count; i++) { > + src = user_mount[i]; > + cur = strstr(user_mount[i], ","); > + if (!cur) > + goto fail_str; > + > + *cur = '\0'; > + dst = ++cur; > + > + cur = strstr(cur, ","); > + if (!cur) > + goto fail_str; > + > + *cur = '\0'; > + fs = ++cur; > + > + cur = strstr(cur, ","); > + if (cur) { > + *cur = '\0'; > + params = ++cur; > + } else { > + params = NULL; > + } > + > + res = sys_mount(src, dst, fs, 0, params); > + if (res == 0) > + printk(KERN_INFO "Mounted (%s filesystem) %s to %s\n", > + fs, src, dst); > + else > + printk(KERN_ERR "Failed mounting (%s filesystem) %s to" > + " %s. Err: %d\n", fs, src, dst, res); > + } > + > + return 0; > + > +fail_str: > + printk(KERN_ERR "Bad mount str: %s\n", user_mount[i]); > + return -1; > +} > + > /* > * Prepare the namespace - decide what/where to mount, load ramdisks, etc. > */ > @@ -490,4 +550,5 @@ out: > devtmpfs_mount("dev"); > sys_mount(".", "/", NULL, MS_MOVE, NULL); > sys_chroot((const char __user __force *)"."); > + do_user_mounts(); > } > -- > 1.7.6 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html