• M
    fuse: fix race between getattr and write · 1fb69e78
    Miklos Szeredi 提交于
    Getattr and lookup operations can be running in parallel to attribute changing
    operations, such as write and setattr.
    
    This means, that if for example getattr was slower than a write, the cached
    size attribute could be set to a stale value.
    
    To prevent this race, introduce a per-filesystem attribute version counter.
    This counter is incremented whenever cached attributes are modified, and the
    incremented value stored in the inode.
    
    Before storing new attributes in the cache, getattr and lookup check, using
    the version number, whether the attributes have been modified during the
    request's lifetime.  If so, the returned attributes are not cached, because
    they might be stale.
    
    Thanks to Jakub Bogusz for the bug report and test program.
    
    [akpm@linux-foundation.org: coding-style fixes]
    Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
    Cc: Jakub Bogusz <jakub.bogusz@gemius.pl>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    1fb69e78
inode.c 19.1 KB