mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
cifs: only write 64kb at a time when fallocating a small region of a file
We only allow sending single credit writes through the SMB2_write() synchronous
api so split this into smaller chunks.
Fixes: 966a3cb7c7
("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>
This commit is contained in:
parent
2734d6c1b1
commit
2485bd7557
@ -3617,7 +3617,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;
|
||||
@ -3625,13 +3625,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,
|
||||
|
Loading…
Reference in New Issue
Block a user