Fix DOTDOT for #root
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 31 Aug 2016 10:43:59 +0000 (06:43 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 31 Aug 2016 10:48:11 +0000 (06:48 -0400)
commitcab1d19d33719faee0231f7e0bd495f97a341c17
tree7d7295087a12048b23e03a3d80f8705ccaf56dfe
parenta84d47b41e748957b859038fb228f2f817706e93
Fix DOTDOT for #root

devroot is a mess.  I think it can't grow dynamically very well.  There
are already well-known issues (in the TODO section).

For now, this allows us to do something like "ls /env/..".  Previously
that would crash.  I took it a step farther and added subdirectories to
env, just to make sure DOTDOT worked for non-root DOTDOTs.  That was a
huge pain.

Now you can do things like this without crashing the kernel:

/ $ ls /nvfs/../
chan     env      mnt      net.alt  proc     prog     srv
dev      fd       net      nvfs     prof     root
/ $ ls /env/
env_dir1  env_dir2
/ $ ls /env/../
chan     env      mnt      net.alt  proc     prog     srv
dev      fd       net      nvfs     prof     root
/ $ ls /env/env_dir2/../
env_dir1  env_dir2

We used to have some code that would, for when we weren't at the
top-of-device entry (e.g. ""), appear to walk all siblings of
roottab[p], until we found the one whose qid.path matched whatever we
found via rootdata[].dotdot.  That seemed busted.

Ultimately, we need a dynamically changeable ramfs.  #root might not be
it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/root.c