9ns: Add CCTL_DEBUG
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Jul 2018 15:35:07 +0000 (11:35 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Jul 2018 20:06:25 +0000 (16:06 -0400)
This allows the user to dump the contents of the TFS, via printk.  I've
been maintaining hokey kfuncs out of tree to do this, and it's getting old.

If you dump a directory, it'll dump all of the contents of the directory,
recursively.  So to see the entire TFS, run chan_debug on the mount point.

Note that the mount order matters (mount -b to put your device first).
Otherwise, you'll chan_debug the directory in e.g. #kfs instead of #gtfs.

Also note that the TFS only maintains the frontend of the filesystem: the
stuff we have in RAM.  For #kfs, this is everything.  But for #gtfs (and
future disk filesystems), this is just a cache.  For example:

(akaros) / $ chan_debug /mnt/
Dumping tree_file info (frontend), dev gtfs, chan /mnt:

netroot   : Q: 15204682, R:  3, U eve, d755
---------------------

There's just the mountpoint (named netroot) so far.

(akaros) / $ ls /mnt/
foo.pdf               filepath              go_get_html
bar                   foo                   hello-go
bin                   g3.cpio               initramfs.cpio
dir1                  g3libs.cpio           somefile
(akaros) / $ chan_debug /mnt/
Dumping tree_file info (frontend), dev gtfs, chan /mnt:

netroot   : Q: 15204682, R: 15, U eve, d755
---------------------
    filepath  : Q: 19796349, R:  0, U eve, d750
    ---------------------
    dir1      : Q: 18750984, R:  0, U eve, d755
    ---------------------
    somefile  : Q: 15205606, R:  0, U eve, -777
    bar       : Q: 15205764, R:  0, U eve, -644
    hello-go  : Q: 15205604, R:  0, U eve, -777
    g3.cpio   : Q: 15204767, R:  0, U eve, -640
    g3libs.cpio: Q: 15205231, R:  0, U eve, -640
    initramfs.cpio: Q: 15222556, R:  0, U eve, -640
    bin       : Q: 20841102, R:  0, U eve, d750
    ---------------------
    go_get_html: Q: 15205603, R:  0, U eve, -777
    foo.pdf   : Q: 15206000, R:  0, U eve, -644
    foo       : Q: 24388167, R:  0, U eve, d755
    ---------------------

Once 'ls' brought the TFs/inodes into the TFS's cache, we were able to see
them when we dumped the directory.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ros/fs.h
kern/include/tree_file.h
kern/src/ns/tree_file.c
tests/chan_debug.c [new file with mode: 0644]

index c7cccc7..453d6bf 100644 (file)
@@ -80,6 +80,7 @@ struct kstat {
  * don't (yet) have the Unix struct file. */
 #define CCTL_SET_FL                            (F_CHANCTL_BASE + 0)
 #define CCTL_SYNC                              (F_CHANCTL_BASE + 1)
+#define CCTL_DEBUG                             (F_CHANCTL_BASE + 2)
 
 /* For F_[GET|SET]FD */
 #define FD_CLOEXEC     1
index 51ddf5e..61c6c16 100644 (file)
@@ -278,6 +278,7 @@ void tfs_frontend_for_each(struct tree_filesystem *tfs,
 void tfs_frontend_purge(struct tree_filesystem *tfs,
                         void (*cb)(struct tree_file *tf));
 void __tfs_dump(struct tree_filesystem *tfs);
+void __tfs_dump_tf(struct tree_file *tf);
 
 void tfs_lru_for_each(struct tree_filesystem *tfs, bool cb(struct tree_file *),
                       size_t max_tfs);
index d4fe650..a630163 100644 (file)
@@ -1049,6 +1049,13 @@ unsigned long tree_chan_ctl(struct chan *c, int op, unsigned long a1,
                             unsigned long a4)
 {
        switch (op) {
+       case CCTL_DEBUG:
+               print_lock();
+               printk("Dumping tree_file info (frontend), dev %s, chan %s:\n\n",
+                      chan_dev_name(c), channame(c));
+               __tfs_dump_tf(chan_to_tree_file(c));
+               print_unlock();
+               return 0;
        default:
                error(EINVAL, "%s does not support chanctl %d", chan_dev_name(c), op);
        }
@@ -1237,6 +1244,11 @@ void __tfs_dump(struct tree_filesystem *tfs)
        dump_tf(tfs->root, 0);
 }
 
+void __tfs_dump_tf(struct tree_file *tf)
+{
+       dump_tf(tf, 0);
+}
+
 /* Runs a callback on every non-negative TF on the LRU list, for a given
  * snapshot of the LRU list.  The CB returns true if it wants us to attempt to
  * free the TF.  One invariant is that we can never remove a TF from the tree
diff --git a/tests/chan_debug.c b/tests/chan_debug.c
new file mode 100644 (file)
index 0000000..f0e90fa
--- /dev/null
@@ -0,0 +1,30 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+int main(int argc, char **argv)
+{
+       int fd, ret;
+       char *path = ".";
+
+       if (argc > 2) {
+               fprintf(stderr, "Usage: %s [PATH]\n", argv[0]);
+               exit(-1);
+       }
+       if (argc == 2)
+               path = argv[1];
+       fd = open(path, O_READ);
+       if (fd < 0) {
+               perror("open");
+               exit(-1);
+       }
+       ret = fcntl(fd, CCTL_DEBUG);
+       if (ret)
+               perror("fcntl CCTL_DEBUG");
+       close(fd);
+       return ret;
+}