From: Richard W.M. J. <rj...@re...> - 2010-12-19 12:27:27
|
I'm getting a really strange problem with my FUSE module: http://git.annexia.org/?p=libguestfs.git;a=blob;f=fuse/guestmount.c;hb=HEAD Sometimes the 'touch' command gets a -EINVAL error from the 'utimensat' syscall. It only happens reliably when (a) the filesystem has just been mounted _and_ (b) the following test script is run, _and_ (c) only on the second iteration of the loop. ---------------------------------------------------------------------- #!/bin/bash - set -e set -v cd /tmp/mnt while true; do for ts in 12345 1234567 987654321; do touch -a -d @$ts timestamp [ "$(stat -c %X timestamp)" -eq $ts ] touch -m -d @$ts timestamp [ "$(stat -c %Y timestamp)" -eq $ts ] touch -d @$ts timestamp [ "$(stat -c %X timestamp)" -eq $ts ] [ "$(stat -c %Y timestamp)" -eq $ts ] done done ---------------------------------------------------------------------- It doesn't happen if the test script is re-run without remounting the filesystem, nor if I make some apparently trivial modifications to the test script. The error seems to happen inside FUSE / kernel, _not_ in any of my code. I looked at the kernel code and couldn't see any obvious reason why (eg.) setattr would return EINVAL. The trace output of guestmount is below. I'm using fuse-2.8.5-2.fc14.x86_64 (compiled for Fedora 14) and kernel 2.6.35.9-64.fc14.x86_64. Any ideas? Rich. Bug report: https://bugzilla.redhat.com/show_bug.cgi?id=660687 ---------------------------------------------------------------------- set_recovery_proc true = 0 add_drive_opts "test1.img" = 0 launch = 0 mount_options "" "/dev/sda1" "/" = 0 umask 0 = 18 guestmount: fg_getattr (/.Trash, 0x7fff5104bba0) lstat "/.Trash" = NULL (error) guestmount: fg_getattr (/.Trash-500, 0x7fff5104bba0) lstat "/.Trash-500" = NULL (error) guestmount: fg_getattr (/, 0x7fff5104bb70) lstat "/" = <struct guestfs_stat *> guestmount: fg_access (/, 1) guestmount: fg_getattr (/, 0x7fff5104bb90) lstat "/" = <struct guestfs_stat *> guestmount: fg_getattr (/timestamp, 0x7fff5104bba0) lstat "/timestamp" = <struct guestfs_stat *> guestmount: fg_open (/timestamp, 0104001) guestmount: fg_utimens (/timestamp, [{ 12345, 0 }, { 987654321, 0 }]) utimens "/timestamp" 12345 0 987654321 0 = 0 guestmount: fg_getattr (/timestamp, 0x7fff5104bac0) lstat "/timestamp" = <struct guestfs_stat *> guestmount: fg_release (/timestamp) guestmount: fg_open (/timestamp, 0104001) guestmount: fg_release (/timestamp) ---------------------------------------------------------------------- -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://et.redhat.com/~rjones/libguestfs/ See what it can do: http://et.redhat.com/~rjones/libguestfs/recipes.html |