| From b3076ea07ec752c1bd23dad1bed21d444ecf2244 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 22 Jul 2021 14:53:32 +1000 |
| Subject: cifs: only write 64kb at a time when fallocating a small region of a |
| file |
| |
| From: Ronnie Sahlberg <lsahlber@redhat.com> |
| |
| [ Upstream commit 2485bd7557a7edb4520b4072af464f0a08c8efe0 ] |
| |
| We only allow sending single credit writes through the SMB2_write() synchronous |
| api so split this into smaller chunks. |
| |
| Fixes: 966a3cb7c7db ("cifs: improve fallocate emulation") |
| |
| Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com> |
| Reported-by: Namjae Jeon <namjae.jeon@samsung.com> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/cifs/smb2ops.c | 26 +++++++++++++++++++------- |
| 1 file changed, 19 insertions(+), 7 deletions(-) |
| |
| diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c |
| index 903de7449aa3..cc253bbff696 100644 |
| --- a/fs/cifs/smb2ops.c |
| +++ b/fs/cifs/smb2ops.c |
| @@ -3613,7 +3613,7 @@ static int smb3_simple_fallocate_write_range(unsigned int xid, |
| char *buf) |
| { |
| struct cifs_io_parms io_parms = {0}; |
| - int nbytes; |
| + int rc, nbytes; |
| struct kvec iov[2]; |
| |
| io_parms.netfid = cfile->fid.netfid; |
| @@ -3621,13 +3621,25 @@ static int smb3_simple_fallocate_write_range(unsigned int xid, |
| io_parms.tcon = tcon; |
| io_parms.persistent_fid = cfile->fid.persistent_fid; |
| io_parms.volatile_fid = cfile->fid.volatile_fid; |
| - io_parms.offset = off; |
| - io_parms.length = len; |
| |
| - /* iov[0] is reserved for smb header */ |
| - iov[1].iov_base = buf; |
| - iov[1].iov_len = io_parms.length; |
| - return SMB2_write(xid, &io_parms, &nbytes, iov, 1); |
| + while (len) { |
| + io_parms.offset = off; |
| + io_parms.length = len; |
| + if (io_parms.length > SMB2_MAX_BUFFER_SIZE) |
| + io_parms.length = SMB2_MAX_BUFFER_SIZE; |
| + /* iov[0] is reserved for smb header */ |
| + iov[1].iov_base = buf; |
| + iov[1].iov_len = io_parms.length; |
| + rc = SMB2_write(xid, &io_parms, &nbytes, iov, 1); |
| + if (rc) |
| + break; |
| + if (nbytes > len) |
| + return -EINVAL; |
| + buf += nbytes; |
| + off += nbytes; |
| + len -= nbytes; |
| + } |
| + return rc; |
| } |
| |
| static int smb3_simple_fallocate_range(unsigned int xid, |
| -- |
| 2.30.2 |
| |