• Zhang Xiaoxu's avatar
    cifs/smb3: Fix data inconsistent when punch hole · acc91c2d
    Zhang Xiaoxu authored
    When punch hole success, we also can read old data from file:
      # strace -e trace=pread64,fallocate xfs_io -f -c "pread 20 40" \
               -c "fpunch 20 40" -c"pread 20 40" file
      pread64(3, " version 5.8.0-rc1+"..., 40, 20) = 40
      fallocate(3, FALLOC_FL_KEEP_SIZE|FALLOC_FL_PUNCH_HOLE, 20, 40) = 0
      pread64(3, " version 5.8.0-rc1+"..., 40, 20) = 40
    
    CIFS implements the fallocate(FALLOCATE_FL_PUNCH_HOLE) with send SMB
    ioctl(FSCTL_SET_ZERO_DATA) to server. It just set the range of the
    remote file to zero, but local page caches not updated, then the
    local page caches inconsistent with server.
    
    Also can be found by xfstests generic/316.
    
    So, we need to remove the page caches before send the SMB
    ioctl(FSCTL_SET_ZERO_DATA) to server.
    
    Fixes: 31742c5a ("enable fallocate punch hole ("fallocate -p") for SMB3")
    Suggested-by: default avatarPavel Shilovsky <pshilov@microsoft.com>
    Reviewed-by: default avatarPavel Shilovsky <pshilov@microsoft.com>
    Signed-off-by: default avatarZhang Xiaoxu <zhangxiaoxu5@huawei.com>
    Cc: stable@vger.kernel.org # v3.17
    Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
    acc91c2d
smb2ops.c 146 KB