Fixes KFS multi-paths
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 8 Aug 2013 19:49:21 +0000 (12:49 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 8 Aug 2013 19:59:41 +0000 (12:59 -0700)
You can have multiple KFS paths in your .config (space separated).  KFS will be
built from the union of the contents of all of those directories.

A couple notes:
- if you have multiple directories named the same, they both appear, and with
  the same name.  For instance, you can have two /bins.  When you ls /bin,
  you'll get the contents of both bins.  It's a little weird, but not in a way
  that stops you from merging different KFS paths.  (for now).
- KFS might not like symlinks to directories outside of the KFS path.  Not
  sure.  If you put a symlink in kern/kfs from go -> ../../../go, KFS code
  doesn't like it.  If you really want this behavior, let me know.  O/w, just
  use multiple KFS paths.

Makefile
kern/src/kfs.c

index 0499737..575d1ee 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -362,7 +362,7 @@ CMP_KERNEL_OBJ := $(KERNEL_OBJ).gz
 # KFS_PATH.  Future rules related to KFS will have issues (mkdir with no
 # argument, or a find of the entire pwd).  It's also possible someone provided
 # an empty path.  To deal with both, we'll just have a sensible default.
-kfs-paths :=  $(patsubst "%",%,$(CONFIG_KFS_PATHS))
+kfs-paths :=  $(subst $\",,$(CONFIG_KFS_PATHS))
 ifeq ($(kfs-paths),)
 kfs-paths := kern/kfs
 endif
@@ -419,15 +419,16 @@ endif
 kern_initramfs_files := $(shell mkdir -p $(kfs-paths); \
                           find $(kfs-paths))
 
+# Need to make an empty cpio, then append each kfs-path's contents
 $(kern_cpio) initramfs: $(kern_initramfs_files)
        @echo "  Building initramfs:"
        @if [ "$(CONFIG_KFS_CPIO_BIN)" != "" ]; then \
         sh $(CONFIG_KFS_CPIO_BIN); \
     fi
+       @cat /dev/null | cpio --quiet -oH newc -O $(kern_cpio)
        $(Q)for i in $(kfs-paths); do cd $$i; \
         echo "    Adding $$i to initramfs..."; \
-        find -L . | cpio --quiet -oH newc > \
-                       $(CURDIR)/$(kern_cpio); \
+        find -L . | cpio --quiet -oAH newc -O $(CURDIR)/$(kern_cpio); \
         cd $$OLDPWD; \
     done;
 
index 47941f0..8324323 100644 (file)
@@ -335,6 +335,8 @@ struct dentry *kfs_lookup(struct inode *dir, struct dentry *dentry,
        struct dentry *d_i;
 
        assert(dir_dent && dir_dent == TAILQ_LAST(&dir->i_dentry, dentry_tailq));
+       /* had this fail when kern/kfs has a symlink go -> ../../../go, though
+        * a symlink like lib2 -> lib work okay. */
        assert(S_ISDIR(dir->i_mode));
        assert(kref_refcnt(&dentry->d_kref) == 1);
        TAILQ_FOREACH(d_i, &dir_dent->d_subdirs, d_subdirs_link) {