From: Jeff D. <jd...@ad...> - 2008-07-08 13:44:04
|
On Sat, Jul 05, 2008 at 08:46:31PM +0200, Ingo van Lil wrote: > 1. If a file is held read-only by one process it cannot by creat()'ed by > another one: > > [root@localhost ~]# mount -t hostfs none /mnt > [root@localhost ~]# cd /mnt/tmp > [root@localhost tmp]# touch foo > [root@localhost tmp]# tail -f foo & > [1] 895 > [root@localhost tmp]# > foo > -bash: foo: Invalid argument > [root@localhost tmp]# kill 895 > [1]+ Terminated tail -f foo > [root@localhost tmp]# > foo > > 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. > 2. As long as a file is held open changes made outside the UML kernel > (i.e. on the host side) may not be visible: > > [root@localhost tmp]# tail -f foo & > [1] 897 > # Host system: echo "Hello World" > /tmp/foo > [root@localhost tmp]# cat foo > [root@localhost tmp]# kill 897 > [1]+ Terminated tail -f foo > [root@localhost tmp]# cat foo > Hello World > > I guess this is some kind of caching effect, because strace shows that > there is only a single read to the actual physical file. Maybe hostfs > should check whether the outside file has changed and invalidate the > cache if necessary. 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. Jeff -- Work email - jdike at linux dot intel dot com |