• Anand Avati's avatar
    fuse: ignore entry-timeout on LOOKUP_REVAL · 154210cc
    Anand Avati authored
    The following test case demonstrates the bug:
    
      sh# mount -t glusterfs localhost:meta-test /mnt/one
    
      sh# mount -t glusterfs localhost:meta-test /mnt/two
    
      sh# echo stuff > /mnt/one/file; rm -f /mnt/two/file; echo stuff > /mnt/one/file
      bash: /mnt/one/file: Stale file handle
    
      sh# echo stuff > /mnt/one/file; rm -f /mnt/two/file; sleep 1; echo stuff > /mnt/one/file
    
    On the second open() on /mnt/one, FUSE would have used the old
    nodeid (file handle) trying to re-open it. Gluster is returning
    -ESTALE. The ESTALE propagates back to namei.c:filename_lookup()
    where lookup is re-attempted with LOOKUP_REVAL. The right
    behavior now, would be for FUSE to ignore the entry-timeout and
    and do the up-call revalidation. Instead FUSE is ignoring
    LOOKUP_REVAL, succeeding the revalidation (because entry-timeout
    has not passed), and open() is again retried on the old file
    handle and finally the ESTALE is going back to the application.
    
    Fix: if revalidation is happening with LOOKUP_REVAL, then ignore
    entry-timeout and always do the up-call.
    Signed-off-by: default avatarAnand Avati <avati@redhat.com>
    Reviewed-by: default avatarNiels de Vos <ndevos@redhat.com>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
    Cc: stable@vger.kernel.org
    154210cc
dir.c 50.6 KB