9ns: properly set dir->type and dir->dev for fs_files
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 14 Jun 2019 19:17:28 +0000 (15:17 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 11 Jul 2019 18:29:21 +0000 (14:29 -0400)
We were not setting the type and dev.  Type is the struct devtab's
number identifying the device.  Dev is the device-specific subsystem;
often 0.

You can see type when you do a stat.  That dir->type field shows up as
'dev' in stat.  Gotta love the conversions.

The effect of this is that you can now stat devices that are TFSs, e.g.
KFS, tmpfs, and get a sensible device.  Previously, you'd just get '0',
which is some other device.

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

index f8a7bf9..ba63e6c 100644 (file)
@@ -110,7 +110,7 @@ static inline size_t fs_file_get_length(struct fs_file *f)
 void fs_file_init(struct fs_file *f, const char *name, struct fs_file_ops *ops);
 void fs_file_set_basename(struct fs_file *f, const char *name);
 void fs_file_change_basename(struct fs_file *f, const char *name);
-void fs_file_init_dir(struct fs_file *f, int dir_type, int dir_dev,
+void fs_file_init_dir(struct fs_file *f, uint16_t dir_type, uint32_t dir_dev,
                       struct username *user, int perm);
 void fs_file_copy_from_dir(struct fs_file *f, struct dir *dir);
 void cleanup_fs_file(struct fs_file *f);
index 105064e..d714da4 100644 (file)
@@ -71,7 +71,7 @@ void fs_file_change_basename(struct fs_file *f, const char *name)
 }
 
 /* Helper for building a dir.  Caller sets qid path and vers.  YMMV. */
-void fs_file_init_dir(struct fs_file *f, int dir_type, int dir_dev,
+void fs_file_init_dir(struct fs_file *f, uint16_t dir_type, uint32_t dir_dev,
                       struct username *user, int perm)
 {
        struct dir *dir = &f->dir;
@@ -84,6 +84,8 @@ void fs_file_init_dir(struct fs_file *f, int dir_type, int dir_dev,
                dir->qid.type |= QTEXCL;
        if (perm & DMSYMLINK)
                dir->qid.type |= QTSYMLINK;
+       dir->type = dir_type;
+       dir->dev = dir_dev;
        /* dir->mode stores all the DM bits, but note that userspace can only
         * affect the permissions (S_PMASK) bits. */
        dir->mode = perm;