From: Sasha Levin Date: Sun, 28 Jun 2020 22:14:14 +0000 (-0400) Subject: Fixes for 4.19 X-Git-Tag: v5.7.7~39^2~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=585476258cda8c5408ace92237fbfde23f1dc3cd;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/cifs-smb3-fix-data-inconsistent-when-punch-hole.patch b/queue-4.19/cifs-smb3-fix-data-inconsistent-when-punch-hole.patch new file mode 100644 index 00000000000..cf49cfffb8d --- /dev/null +++ b/queue-4.19/cifs-smb3-fix-data-inconsistent-when-punch-hole.patch @@ -0,0 +1,57 @@ +From ace587e47b8e66f1dcf31c5a4cd213c53e93c76f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 23 Jun 2020 07:31:53 -0400 +Subject: cifs/smb3: Fix data inconsistent when punch hole + +From: Zhang Xiaoxu + +[ Upstream commit acc91c2d8de4ef46ed751c5f9df99ed9a109b100 ] + +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: 31742c5a33176 ("enable fallocate punch hole ("fallocate -p") for SMB3") +Suggested-by: Pavel Shilovsky +Reviewed-by: Pavel Shilovsky +Signed-off-by: Zhang Xiaoxu +Cc: stable@vger.kernel.org # v3.17 +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/cifs/smb2ops.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index 6fc16329ceb45..0b830ac8a9e72 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -2248,6 +2248,12 @@ static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon, + return rc; + } + ++ /* ++ * We implement the punch hole through ioctl, so we need remove the page ++ * caches first, otherwise the data may be inconsistent with the server. ++ */ ++ truncate_pagecache_range(inode, offset, offset + len - 1); ++ + cifs_dbg(FYI, "offset %lld len %lld", offset, len); + + fsctl_buf.FileOffset = cpu_to_le64(offset); +-- +2.25.1 + diff --git a/queue-4.19/cifs-smb3-fix-data-inconsistent-when-zero-file-range.patch b/queue-4.19/cifs-smb3-fix-data-inconsistent-when-zero-file-range.patch new file mode 100644 index 00000000000..4b072cd9ba0 --- /dev/null +++ b/queue-4.19/cifs-smb3-fix-data-inconsistent-when-zero-file-range.patch @@ -0,0 +1,49 @@ +From d460cdbd9602e3790016392a429b6f9b27dfb03f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 23 Jun 2020 07:31:54 -0400 +Subject: cifs/smb3: Fix data inconsistent when zero file range + +From: Zhang Xiaoxu + +[ Upstream commit 6b69040247e14b43419a520f841f2b3052833df9 ] + +CIFS implements the fallocate(FALLOC_FL_ZERO_RANGE) with send SMB +ioctl(FSCTL_SET_ZERO_DATA) to server. It just set the range of the +remote file to zero, but local page cache not update, then the data +inconsistent with server, which leads the xfstest generic/008 failed. + +So we need to remove the local page caches before send SMB +ioctl(FSCTL_SET_ZERO_DATA) to server. After next read, it will +re-cache it. + +Fixes: 30175628bf7f5 ("[SMB3] Enable fallocate -z support for SMB3 mounts") +Reported-by: Hulk Robot +Signed-off-by: Zhang Xiaoxu +Reviewed-by: Pavel Shilovsky +Cc: stable@vger.kernel.org # v3.17 +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/cifs/smb2ops.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index 0b830ac8a9e72..2a523139a05fb 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -2180,6 +2180,12 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon, + inode = d_inode(cfile->dentry); + cifsi = CIFS_I(inode); + ++ /* ++ * We zero the range through ioctl, so we need remove the page caches ++ * first, otherwise the data may be inconsistent with the server. ++ */ ++ truncate_pagecache_range(inode, offset, offset + len - 1); ++ + /* if file not oplocked can't be sure whether asking to extend size */ + if (!CIFS_CACHE_READ(cifsi)) + if (keep_size == false) { +-- +2.25.1 + diff --git a/queue-4.19/series b/queue-4.19/series index ace56feeac6..0172e316a1c 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -54,3 +54,5 @@ xhci-fix-incorrect-ep_state_mask.patch xhci-fix-enumeration-issue-when-setting-max-packet-size-for-fs-devices.patch xhci-return-if-xhci-doesn-t-support-lpm.patch cdc-acm-add-disable_echo-quirk-for-microchip-smsc-chip.patch +cifs-smb3-fix-data-inconsistent-when-punch-hole.patch +cifs-smb3-fix-data-inconsistent-when-zero-file-range.patch