Converts between 9ns and VFS stat structs
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 19 Jan 2014 18:48:09 +0000 (10:48 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 19 Jan 2014 19:11:12 +0000 (11:11 -0800)
We still have lots of issues with different meanings for flags and
whatnot.  For instance, we convert st_mode for directories, but don't
convert any of the other 9ns flags.

kern/drivers/dev/dev.c
kern/include/vfs.h
kern/src/ns/sysfile.c
kern/src/syscall.c
kern/src/vfs.c

index f1a7661..19a52df 100644 (file)
@@ -259,14 +259,14 @@ devstat(struct chan *c, uint8_t *db, int n,
                                        error(Ebadarg);
                                return n;
                        }
-                       printd("%s %s: devstat %c %llux\n",
-                               up->text, up->env->user,
-                               devtab[c->type]->dc, c->qid.path);
-
+                       printd("DEVSTAT fails:%c %llu\n", devtab[c->type]->dc, c->qid.path);
                        error(Enonexist);
                case 0:
+                       printd("DEVSTAT got 0\n");
                        break;
                case 1:
+                       printd("DEVSTAT gen returns path %p name %s, want path %p\n",
+                              dir.qid.path, dir.name, c->qid.path);
                        if(c->qid.path == dir.qid.path) {
                                if(c->flag&CMSG)
                                        dir.mode |= DMMOUNT;
index 49da8a1..bfc55de 100644 (file)
@@ -486,6 +486,7 @@ int do_chdir(struct fs_struct *fs_env, char *path);
 char *do_getcwd(struct fs_struct *fs_env, char **kfree_this, size_t cwd_l);
 
 /* Debugging */
+void print_kstat(struct kstat *kstat);
 int ls_dash_r(char *path);
 extern struct inode_operations dummy_i_op;
 extern struct dentry_operations dummy_d_op;
index b3980ee..0f86afc 100644 (file)
@@ -310,6 +310,7 @@ sysfstat(int fd, uint8_t *buf, int n)
 {
        ERRSTACK(2);
        struct chan *c;
+       struct dir dir9ns;
 
        if (waserror()) {
                poperror();
@@ -321,12 +322,13 @@ sysfstat(int fd, uint8_t *buf, int n)
                cclose(c);
                nexterror();
        }
-       devtab[c->type]->stat(c, buf, n);
+       devtab[c->type]->stat(c, (void*)&dir9ns, sizeof(struct dir));
 
        poperror();
        cclose(c);
 
        poperror();
+       convM2kstat((void*)&dir9ns, sizeof(struct dir), (struct kstat*)buf);
        return n;
 }
 
@@ -913,6 +915,7 @@ sysstat(char *path, uint8_t *buf, int n)
 {
        ERRSTACK(2);
        struct chan *c;
+       struct dir dir9ns;
 
        if (waserror()) {
                poperror();
@@ -924,11 +927,12 @@ sysstat(char *path, uint8_t *buf, int n)
                cclose(c);
                nexterror();
        }
-       devtab[c->type]->stat(c, buf, n);
+       devtab[c->type]->stat(c, (void*)&dir9ns, sizeof(struct dir));
        poperror();
        cclose(c);
 
        poperror();
+       convM2kstat((void*)&dir9ns, sizeof(struct dir), (struct kstat*)buf);
        return 0;
 }
 
index ea80bd3..ca4ea3a 100644 (file)
@@ -1256,6 +1256,7 @@ static intreg_t sys_fstat(struct proc *p, int fd, struct kstat *u_stat)
                stat_inode(file->f_dentry->d_inode, kbuf);
                kref_put(&file->f_kref);
        } else {
+               unset_errno();  /* Go can't handle extra errnos */
            if (sysfstat(fd, (uint8_t*)kbuf, sizeof(*kbuf)) < 0) {
                        kfree(kbuf);
                        return -1;
index 4151bd3..94a8e42 100644 (file)
@@ -1084,6 +1084,24 @@ void stat_inode(struct inode *inode, struct kstat *kstat)
        kstat->st_ctime = inode->i_ctime;
 }
 
+void print_kstat(struct kstat *kstat)
+{
+       printk("kstat info for %p:\n", kstat);
+       printk("\tst_dev    : %p\n", kstat->st_dev);
+       printk("\tst_ino    : %p\n", kstat->st_ino);
+       printk("\tst_mode   : %p\n", kstat->st_mode);
+       printk("\tst_nlink  : %p\n", kstat->st_nlink);
+       printk("\tst_uid    : %p\n", kstat->st_uid);
+       printk("\tst_gid    : %p\n", kstat->st_gid);
+       printk("\tst_rdev   : %p\n", kstat->st_rdev);
+       printk("\tst_size   : %p\n", kstat->st_size);
+       printk("\tst_blksize: %p\n", kstat->st_blksize);
+       printk("\tst_blocks : %p\n", kstat->st_blocks);
+       printk("\tst_atime  : %p\n", kstat->st_atime);
+       printk("\tst_mtime  : %p\n", kstat->st_mtime);
+       printk("\tst_ctime  : %p\n", kstat->st_ctime);
+}
+
 /* Inode Cache management.  In general, search on the ino, get a refcnt'd value
  * back.  Remove does not give you a reference back - it should only be called
  * in inode_release(). */