• Eryu Guan's avatar
    fuse: invalidate inode attr in writeback cache mode · cf576c58
    Eryu Guan authored
    Under writeback mode, inode->i_blocks is not updated, making utils du
    read st.blocks as 0.
    
    For example, when using virtiofs (cache=always & nondax mode) with
    writeback_cache enabled, writing a new file and check its disk usage
    with du, du reports 0 usage.
    
      # uname -r
      5.6.0-rc6+
      # mount -t virtiofs virtiofs /mnt/virtiofs
      # rm -f /mnt/virtiofs/testfile
    
      # create new file and do extend write
      # xfs_io -fc "pwrite 0 4k" /mnt/virtiofs/testfile
      wrote 4096/4096 bytes at offset 0
      4 KiB, 1 ops; 0.0001 sec (28.103 MiB/sec and 7194.2446 ops/sec)
      # du -k /mnt/virtiofs/testfile
      0               <==== disk usage is 0
      # stat -c %s,%b /mnt/virtiofs/testfile
      4096,0          <==== i_size is correct, but st_blocks is 0
    
    Fix it by invalidating attr in fuse_flush(), so we get up-to-date attr
    from server on next getattr.
    Signed-off-by: default avatarEryu Guan <eguan@linux.alibaba.com>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    cf576c58
file.c 82.9 KB