9ns: Support rename
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 14 Mar 2018 17:27:37 +0000 (13:27 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Apr 2018 18:33:44 +0000 (14:33 -0400)
commit7ed755932c66c437122de5bbb0885ac07d4ad0b5
treeabaa96a5c01b94b5ea66e0f618a9f28516d9f1e6
parent798e1adcf31102299260faaa78b07a282d8f42fc
9ns: Support rename

Devices without a rename operation just get an EXDEV.  Usually userspace
can handle that (e.g. busybox's mv).

I added rename to the struct dev ops since it should be a 9p operation,
allowing renames across directories.  9p wstat does allow an
intra-directory rename, but that's not really what you want.  By giving
the device the old chan, the parent chan, and the name, it can
atomically perform the rename.  Atomicity is a critical part of rename.

Previously, we tried mucking around with rename and wstat, and it was
missing some of the namec-magic associated with Acreate (findmounts and
other stuff).  The device wasn't given the parent chan - it had to find
that on its own, and I was worried that there were some TOCTTOU races if
we just gave it the path.

Additionally, the device may need to do various "version" checks, which
can be done in a dev.rename op, but are harder to do generically.  See
tmpfs for an example.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/kfs.c
kern/drivers/dev/tmpfs.c
kern/include/ns.h
kern/src/ns/chan.c
kern/src/ns/sysfile.c
kern/src/syscall.c