Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/rump_allserver Add -d which can be used to register ...



details:   https://anonhg.NetBSD.org/src/rev/dde21b520920
branches:  trunk
changeset: 759660:dde21b520920
user:      pooka <pooka%NetBSD.org@localhost>
date:      Tue Dec 14 16:40:05 2010 +0000

description:
Add -d which can be used to register host-backed block devices in
the rump kernel.

It would be cool if this, and the other options, could be specified
in a config file (plist or other).

diffstat:

 usr.bin/rump_allserver/rump_allserver.1 |  36 ++++++++++++-
 usr.bin/rump_allserver/rump_allserver.c |  96 +++++++++++++++++++++++++++++++-
 2 files changed, 127 insertions(+), 5 deletions(-)

diffs (222 lines):

diff -r 65cdff2ea24b -r dde21b520920 usr.bin/rump_allserver/rump_allserver.1
--- a/usr.bin/rump_allserver/rump_allserver.1   Tue Dec 14 16:39:33 2010 +0000
+++ b/usr.bin/rump_allserver/rump_allserver.1   Tue Dec 14 16:40:05 2010 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: rump_allserver.1,v 1.2 2010/12/14 09:39:53 wiz Exp $
+.\"    $NetBSD: rump_allserver.1,v 1.3 2010/12/14 16:40:05 pooka Exp $
 .\"
 .\" Copyright (c) 2010 Antti Kantee.  All rights reserved.
 .\"
@@ -33,6 +33,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl s
+.Op Fl d Ar drivespec
 .Op Fl l Ar library
 .Op Fl m Ar module
 .Ar url
@@ -59,6 +60,30 @@
 At execution time it is possible to load components from the command
 line as described in the options section.
 .Bl -tag -width indent
+.It Fl d Ar drivespec
+The argument
+.Ar drivespec
+maps a host file a block device in the rump fs namespace.
+The string
+.Ar drivespec
+must be of comma-separated
+.Dq name=value
+format and must contain the following tokens:
+.Bl -tag -width hostpath1234
+.It Ar key
+Block device path in rump namespace.
+This must be specified according to the rules for a key in
+.Xr rump_etfs 3 .
+.It Ar hostpath
+Host file used for storage.
+If the file does not exist, it will be created.
+.It Ar size
+Size of the mapping.
+The host file will be truncated to the size indicated.
+Similar to
+.Xr dd 1 ,
+this argument accepts a suffix as the multiplier for the number.
+.El
 .It Fl l Ar library
 Call
 .Fn dlopen
@@ -102,6 +127,15 @@
 $ rump_server -lrumpvfs -m /modules/tmpfs.kmod unix://sock
 $ env RUMP_SERVER=unix://sock rump.halt
 .Ed
+.Pp
+Start a server with the one gigabyte host file
+.Pa dk.img
+mapped as the block device
+.Pa /dev/dk
+in the rump kernel.
+.Bd -literal -offset indent
+$ rump_allserver -d key=/dev/dk,hostpath=dk.img,size=1g unix://sock
+.Ed
 .Sh SEE ALSO
 .Xr rump.halt 1 ,
 .Xr dlopen 3 ,
diff -r 65cdff2ea24b -r dde21b520920 usr.bin/rump_allserver/rump_allserver.c
--- a/usr.bin/rump_allserver/rump_allserver.c   Tue Dec 14 16:39:33 2010 +0000
+++ b/usr.bin/rump_allserver/rump_allserver.c   Tue Dec 14 16:40:05 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rump_allserver.c,v 1.8 2010/12/13 14:26:22 pooka Exp $ */
+/*     $NetBSD: rump_allserver.c,v 1.9 2010/12/14 16:40:05 pooka Exp $ */
 
 /*-
  * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: rump_allserver.c,v 1.8 2010/12/13 14:26:22 pooka Exp $");
+__RCSID("$NetBSD: rump_allserver.c,v 1.9 2010/12/14 16:40:05 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -40,6 +40,7 @@
 #include <dlfcn.h>
 #include <err.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <semaphore.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -50,7 +51,8 @@
 usage(void)
 {
 
-       fprintf(stderr, "usage: %s [args] bindurl\n", getprogname());
+       fprintf(stderr, "usage: %s [-d drivespec] [-l libs] [-m modules] [-s] "
+           "bindurl\n", getprogname());
        exit(1);
 }
 
@@ -72,20 +74,88 @@
        sem_post(&sigsem);
 }
 
+static const char *const disktokens[] = {
+#define DKEY 0
+       "key",
+#define DFILE 1
+       "hostpath",
+#define DSIZE 2
+       "size",
+       NULL
+};
+
+struct etfsreg {
+       const char *key;
+       const char *hostpath;
+       off_t flen;
+       enum rump_etfs_type type;
+};
+
 int
 main(int argc, char *argv[])
 {
        const char *serverurl;
        char **modarray = NULL;
        unsigned nmods = 0, curmod = 0, i;
+       struct etfsreg *etfs = NULL;
+       unsigned netfs = 0, curetfs = 0;
        int error;
        int ch, sflag;
 
        setprogname(argv[0]);
 
        sflag = 0;
-       while ((ch = getopt(argc, argv, "l:m:s")) != -1) {
+       while ((ch = getopt(argc, argv, "d:l:m:s")) != -1) {
                switch (ch) {
+               case 'd': {
+                       char *options, *value;
+                       char *key, *hostpath;
+                       long long flen;
+
+                       flen = 0;
+                       key = hostpath = NULL;
+                       options = optarg;
+                       while (*options) {
+                               switch (getsubopt(&options,
+                                   __UNCONST(disktokens), &value)) {
+                               case DKEY:
+                                       key = value;
+                                       break;
+                               case DFILE:
+                                       hostpath = value;
+                                       break;
+                               case DSIZE:
+                                       /* XXX: off_t max? */
+                                       flen = strsuftoll("-d size", value,
+                                           0, LLONG_MAX);
+                                       break;
+                               default:
+                                       fprintf(stderr, "invalid dtoken\n");
+                                       usage();
+                                       break;
+                               }
+                       }
+
+                       if (key == NULL || hostpath == NULL || flen == 0) {
+                               fprintf(stderr, "incomplete drivespec\n");
+                               usage();
+                       }
+
+                       if (netfs - curetfs == 0) {
+                               etfs = realloc(etfs, (netfs+16)*sizeof(*etfs));
+                               if (etfs == NULL)
+                                       err(1, "realloc etfs");
+                               netfs += 16;
+                       }
+
+                       etfs[curetfs].key = key;
+                       etfs[curetfs].hostpath = hostpath;
+                       etfs[curetfs].flen = flen;
+                       etfs[curetfs].type = RUMP_ETFS_BLK;
+                       curetfs++;
+
+                       break;
+               }
                case 'l':
                        if (dlopen(optarg, RTLD_LAZY|RTLD_GLOBAL) == NULL) {
                                char pb[MAXPATHLEN];
@@ -135,6 +205,7 @@
        if (error)
                die(sflag, error, "rump init failed");
 
+       /* load modules */
        for (i = 0; i < curmod; i++) {
                struct modctl_load ml;
 
@@ -147,6 +218,23 @@
                if (rump_sys_modctl(MODCTL_LOAD, &ml) == -1)
                        die(sflag, errno, "module load failed");
                rump_pub_etfs_remove(ETFSKEY);
+#undef ETFSKEY
+       }
+
+       /* register host drives */
+       for (i = 0; i < curetfs; i++) {
+               int fd;
+
+               fd = open(etfs[i].hostpath, O_RDWR | O_CREAT, 0755);
+               if (fd == -1)
+                       die(sflag, error, "etfs hostpath create");
+               if (ftruncate(fd, etfs[i].flen) == -1)
+                       die(sflag, error, "truncate");
+               close(fd);
+
+               if ((error = rump_pub_etfs_register(etfs[i].key,
+                   etfs[i].hostpath, etfs[i].type)) != 0)
+                       die(sflag, error, "etfs register");
        }
 
        error = rump_init_server(serverurl);



Home | Main Index | Thread Index | Old Index