From: Ingo v. L. <in...@gm...> - 2008-07-08 14:15:24
|
Jeff Dike wrote: >> 1. If a file is held read-only by one process it cannot by creat()'ed by >> another one: >> [...] >> >> I tracked that problem down to the set_attr() function in hostfs_user.c: >> It tries to ftruncate() the read-only file descriptor. The file should >> be re-opened writable before changing its length. > > Looks like a good diagnosis. There is code in host_file_open which is > supposed to handle this case, but it's not being hit when the shell > opens the file, which I don't understand. I tracked that down step-by-step on Saturday: If the O_TRUNC flag is set in the open() syscall the file will first be truncated and then opened. The call stack for truncating the file: - sys_open (fs/open.c) - do_sys_open (fs/open.c) - do_filp_open (fs/open.c) - open_namei (fs/namei.c) - may_open (fs/namei.c) - do_truncate (fs/open.c) And the call stack for actually opening the file: - sys_open (fs/open.c) - do_sys_open (fs/open.c) - do_filp_open (fs/open.c) - nameidata_to_filp (fs/open.c) - __dentry_open (fs/open.c) Maybe that helps. > Correct. I've pondered using [id]notify to track changes on the host > and either invalidate the UML cache or update it. Both involve > interactions with the page cache that I'm not entirely comfortable > with right now. That problem is actually more severe for my UML use case: I'm developing firmware for an embedded device, and I'm using UML because it's quicker and more convenient than developing on the target hardware. Now, if I re-compile some library which is still in use by another process the changes will not be visible until I reboot (or kill these background processes). How do similar filesystems (e.g. NFS) solve that problem? Cheers, Ingo |