]> git.baikalelectronics.ru Git - kernel.git/commit
cifs: destage any unwritten data to the server before calling copychunk_write
authorRonnie Sahlberg <lsahlber@redhat.com>
Thu, 21 Apr 2022 01:15:36 +0000 (11:15 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 May 2022 07:14:40 +0000 (09:14 +0200)
commit8e0f601fdc55b14482566fc032e8378620f50a7d
treefa967d17a5e85c168e9f95b848d515426182c43f
parent2b9d3f506b0a7ed40cb90561a23d08bfd2ff1873
cifs: destage any unwritten data to the server before calling copychunk_write

[ Upstream commit cec017ed876b96baf4534f8ed4408dce4a5dd2b7 ]

because the copychunk_write might cover a region of the file that has not yet
been sent to the server and thus fail.

A simple way to reproduce this is:
truncate -s 0 /mnt/testfile; strace -f -o x -ttT xfs_io -i -f -c 'pwrite 0k 128k' -c 'fcollapse 16k 24k' /mnt/testfile

the issue is that the 'pwrite 0k 128k' becomes rearranged on the wire with
the 'fcollapse 16k 24k' due to write-back caching.

fcollapse is implemented in cifs.ko as a SMB2 IOCTL(COPYCHUNK_WRITE) call
and it will fail serverside since the file is still 0b in size serverside
until the writes have been destaged.
To avoid this we must ensure that we destage any unwritten data to the
server before calling COPYCHUNK_WRITE.

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1997373
Reported-by: Xiaoli Feng <xifeng@redhat.com>
Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/cifs/smb2ops.c