WIP-9ns
-------- 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>
diff --git a/kern/drivers/dev/root.c b/kern/drivers/dev/root.c
index 4ed019a..05cd091 100644
--- a/kern/drivers/dev/root.c
+++ b/kern/drivers/dev/root.c
@@ -439,9 +439,23 @@
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);
diff --git a/kern/include/ns.h b/kern/include/ns.h
index 2e6fa2f..d884f11 100644
--- a/kern/include/ns.h
+++ b/kern/include/ns.h
@@ -105,7 +105,7 @@
#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 */
diff --git a/kern/src/syscall.c b/kern/src/syscall.c
index b516568..2a6f84f 100644
--- a/kern/src/syscall.c
+++ b/kern/src/syscall.c
@@ -2355,7 +2355,8 @@
* 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 @@
}
/* 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 @@
* 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 @@
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);