WIP-9ns 9ns origin/9ns
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 31 Mar 2017 00:20:59 +0000 (20:20 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 31 Mar 2017 21:50:51 +0000 (17:50 -0400)
-------- probably don't want this.  get a real RAM FS instead of using a
dirtab.  rename and #root wstat is all messed up too.

9ns: Increase KNAMELEN from 28

This allows 9ns files to have names larger than 28 bytes, especially
useful in #root.  Arguably we wouldn't need this if we weren't using a
lousy dirtab.

160 + 32 (the rest of the dirtab) is 64 byte aligned.  I wanted 128
bytes of space for the KNAME, and figured we should use the rest of the
space.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/root.c
kern/include/ns.h
kern/src/syscall.c

index 4ed019a..05cd091 100644 (file)
@@ -439,9 +439,23 @@ static int rootwstat(struct chan *c, uint8_t *m_buf, int m_buf_sz)
                error(ENODATA, ERROR_FIXME);
        }
        /* TODO: handle more things than just the mode */
-       if (!emptystr(dir->name))
+       if (!emptystr(dir->name)) {
                printk("[%s] attempted rename of %s to %s\n", __FUNCTION__,
                       file->name, dir->name);  /* strncpy for this btw */
+               // XXX this isn't enough.  they give us the full path, like
+               // attempted rename of SOME_FILE
+               //                     /root/SOME_DIR/SOME_NEW_FILE
+               //
+               // the first one is just the final part.  we don't even know where we
+               // are in the directory hierarchy (is our parent called SOME_DIR?)
+               // we also don't know the name of our mount point for the destination
+               //
+               //  9ns rename creates the new_chan.  that seems fucked
+               //              might be ok...
+               //  probably leaking shit
+               //  mount detection is wrong
+               strlcpy(file->name, dir->name, KNAMELEN);
+       }
        if (dir->mode != -1)
                file->perm = dir->mode | (file->qid.type == QTDIR ? DMDIR : 0);
        kfree(dir);
index 2e6fa2f..d884f11 100644 (file)
@@ -105,7 +105,7 @@ extern int parseether(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
 
 #define        STATMAX 65535U  /* max length of machine-independent stat structure */
 #define        ERRMAX                  128     /* max length of error string */
-#define        KNAMELEN                28      /* max length of name held in kernel */
+#define        KNAMELEN                160     /* max length of name held in kernel */
 
 /* bits in Qid.type */
 #define QTDIR          0x80    /* type bit for directories */
index b516568..2a6f84f 100644 (file)
@@ -2355,7 +2355,8 @@ intreg_t sys_rename(struct proc *p, char *old_path, size_t old_path_l,
         * into account for the Twstat.
         */
        if (oldchan->mountpoint) {
-               printd("mountpoint: %C\n", oldchan->mountpoint);
+               // XXX this isn't tripping.
+               printk("mountpoint: %C\n", oldchan->mountpoint);
                if (oldchan->mountpoint->name)
                        mountpointlen = oldchan->mountpoint->name->len;
        }
@@ -2367,14 +2368,31 @@ intreg_t sys_rename(struct proc *p, char *old_path, size_t old_path_l,
        }
 
        /* the omode and perm are of no importance. */
+       // XXX this can throw!
        newchan = namec(to_path, Acreatechan, 0, 0);
        if (newchan == NULL) {
                printd("sys_rename %s to %s found no chan\n", from_path, to_path);
                set_errno(EPERM);
                goto done;
        }
-       printd("Newchan: %C\n", newchan);
-       printd("Newchan: mchan %C\n", newchan->mchan);
+       printk("Newchan: %C\n", newchan);
+       printk("Newchan: mchan %C\n", newchan->mchan);
+       // XXX maybe we don't need this - Acreatechan returns the chan for the dir
+       // of the target (to_path).  so it's name is what we can strip
+       //              maybe get rid of mntpt, mtpt len, etc?
+       //              wait, what is cname?  name from namec?  relative?  abs?
+       //                      probably whatever path they used to for namec.
+       //                      /root,  \#root, etc
+       //              also, newchan is the PARENT, but not the mountpoint.  we need the
+       //              mountpoint of newchan, then strip that out
+       //                              then the device needs to know how to mv btw directories
+       //
+       //              tried /root/foo2/xme, but failed to find /root/foo2 (prob on the
+       //              walk for newchan)!
+       //                              err from devwalk, gen -1, j == 0
+       //                      might have been after previous bad renames corrupted something?
+       //                      though root/foo2 was in dumprootdev 
+       printk("Newchan: mtpt %C\n", newchan->mountpoint);
 
        if ((newchan->dev != oldchan->dev) ||
                (newchan->type != oldchan->type)) {
@@ -2393,6 +2411,9 @@ intreg_t sys_rename(struct proc *p, char *old_path, size_t old_path_l,
         * Once stripped, it still has to be an absolute path.
         */
        if (dir.name[0] == '/') {
+               // XXX we're hitting here, but mountpointlen == 0, i think
+               //              also, should this be fore the newchan's walk, not oldchan?  (in
+               //              the off chance you use a different path
                dir.name = to_path + mountpointlen;
                if (dir.name[0] != '/') {
                        set_errno(EINVAL);
@@ -2424,12 +2445,11 @@ intreg_t sys_rename(struct proc *p, char *old_path, size_t old_path_l,
 
        poperror();
        if (retval == mlen) {
-               retval = mlen;
+               retval = 0;
        } else {
-               printk("syswstat did not go well\n");
                set_errno(EXDEV);
+               retval = -1;
        };
-       printk("syswstat returns %d\n", retval);
 
 done:
        free_path(p, from_path);