Fixes unmount
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 21 Apr 2015 15:48:57 +0000 (11:48 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 21 Apr 2015 15:48:57 +0000 (11:48 -0400)
On the kernel side, there are two changes.  Functionally, we can handle
a null src_path.  Code-wise, I renamed the variables to clarify what is
going on.  Plan 9's 'old' and 'new' weren't very helpful.  Additionally,
what the man pages call old and new were actually reversed when you get
to sysfile.c!

On the user side, cs wasn't calling the syscall properly, so it would
always fail.  cs unmounts #s/cs from /net before it starts up, to make
sure that previous cs runs don't leave any lingering mounts.  You
actually can restart cs &, then mount -a \#s/cs /net and be back in
business.

kern/src/ns/sysfile.c
kern/src/syscall.c
tests/cs.c

index 17e7d8c..4696807 100644 (file)
@@ -651,7 +651,7 @@ int sysmount(int fd, int afd, char *old, int flags, char *spec)
        return r;
 }
 
-int sysunmount(char *old, char *new)
+int sysunmount(char *src_path, char *onto_path)
 {
        ERRSTACK(1);
        volatile struct {
@@ -670,15 +670,15 @@ int sysunmount(char *old, char *new)
                return -1;
        }
 
-       cmount.c = namec(new, Amount, 0, 0);
-       if (old != NULL && old[0] != '\0') {
+       cmount.c = namec(onto_path, Amount, 0, 0);
+       if (src_path != NULL && src_path[0] != '\0') {
                /*
                 * This has to be namec(..., Aopen, ...) because
                 * if arg[0] is something like /srv/cs or /fd/0,
                 * opening it is the only way to get at the real
                 * Chan underneath.
                 */
-               cmounted.c = namec(old, Aopen, OREAD, 0);
+               cmounted.c = namec(src_path, Aopen, OREAD, 0);
        }
 
        cunmount(cmount.c, cmounted.c);
index 9769707..1a59a7d 100644 (file)
@@ -1931,22 +1931,34 @@ intreg_t sys_nmount(struct proc *p,
        return ret;
 }
 
-/* int mount(int fd, int afd, char* old, int flag, char* aname); */
-intreg_t sys_nunmount(struct proc *p, char *name, int name_l, char *old_path, int old_l)
+/* Unmount undoes the operation of a bind or mount.  Check out
+ * http://plan9.bell-labs.com/magic/man2html/1/bind .  Though our mount takes an
+ * FD, not servename (aka src_path), so it's not quite the same.
+ *
+ * To translate between Plan 9 and Akaros, old -> onto_path.  new -> src_path.
+ *
+ * For unmount, src_path / new is optional.  If set, we only unmount the
+ * bindmount that came from src_path. */
+intreg_t sys_nunmount(struct proc *p, char *src_path, int src_l,
+                      char *onto_path, int onto_l)
 {
        int ret;
-       char *t_oldpath = copy_in_path(p, old_path, old_l);
-       if (t_oldpath == NULL)
-               return -1;
-       char *t_name = copy_in_path(p, name, name_l);
-       if (t_name == NULL) {
-               free_path(p, t_oldpath);
+       char *t_ontopath, *t_srcpath;
+       t_ontopath = copy_in_path(p, onto_path, onto_l);
+       if (t_ontopath == NULL)
                return -1;
+       if (src_path) {
+               t_srcpath = copy_in_path(p, src_path, src_l);
+               if (t_srcpath == NULL) {
+                       free_path(p, t_ontopath);
+                       return -1;
+               }
+       } else {
+               t_srcpath = 0;
        }
-       ret = sysunmount(t_name, t_oldpath);
-       printd("go do it\n");
-       free_path(p, t_oldpath);
-       free_path(p, t_name);
+       ret = sysunmount(t_srcpath, t_ontopath);
+       free_path(p, t_ontopath);
+       free_path(p, t_srcpath);        /* you can free a null path */
        return ret;
 }
 
index 3a36d02..7e7f3ce 100644 (file)
@@ -288,7 +288,8 @@ main(int argc, char *argv[])
 
        snprintf(servefile, sizeof(servefile), "#s/cs%s", ext);
        snprintf(netndb, sizeof(netndb), "%s/ndb", mntpt);
-       syscall(SYS_nunmount, (unsigned long)servefile, (unsigned long)mntpt);
+       syscall(SYS_nunmount, (unsigned long)servefile, strlen(servefile),
+               (unsigned long)mntpt, strlen(mntpt));
        remove(servefile);
 
        ndbinit();