• E
    fuse: invalidate inode attr in writeback cache mode · e52fca03
    Eryu Guan 提交于
    to #29613774
    
    commit cf576c58b3a283333fc6e9a7c1c8e5342fa59b97 upstream
    
    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: NEryu Guan <eguan@linux.alibaba.com>
    Signed-off-by: NMiklos Szeredi <mszeredi@redhat.com>
    Reviewed-by: NLiu Bo <bo.liu@linux.alibaba.com>
    e52fca03
file.c 75.7 KB