Re: [PATCH v6 2/5] smb/client: reduce fallocate zero buffer allocation
Steve French <[email protected]>
| Newsgroups | org.kernel.vger.linux-cifs |
|---|---|
| Message-ID | <CAH2r5msyi5nvObkx+JUP78DKdthQLR4p+sg61SEW0RXATorcLg@mail.gmail.com> |
Won't this hurt performance since for most servers the default max write size is 4MB (e.g. Samba or Windows) or 1MB? I did a quick experiment with "dd" and I see the 4MB writes over the wire not 64K On Wed, Jul 1, 2026 at 10:22 AM Huiwen He <[email protected]> wrote: > > From: Huiwen He <[email protected]> > > The fallocate emulation allocates a 1 MiB zero-filled buffer even > though each SMB2_write request is limited to SMB2_MAX_BUFFER_SIZE, > which is 64 KiB. A high-order 1 MiB allocation is more likely to > fail on a fragmented system. > > Allocate only the smaller of the requested range and SMB2_MAX_BUFFER_SIZE, > and reuse that zero-filled buffer for every write request. Also reject > a successful write that makes no progress to avoid looping indefinitely. > > This reduces the contiguous allocation required by fallocate emulation > without changing the written data or range semantics. > > Signed-off-by: Huiwen He <[email protected]> > Reviewed-by: ChenXiaoSong <[email protected]> > --- > fs/smb/client/smb2ops.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c > index cc8e0595e504..23505ae9bd81 100644 > --- a/fs/smb/client/smb2ops.c > +++ b/fs/smb/client/smb2ops.c > @@ -3559,7 +3559,7 @@ static int smb3_simple_fallocate_write_range(unsigned int xid, > char *buf) > { > struct cifs_io_parms io_parms = {0}; > - int nbytes; > + unsigned int nbytes; > int rc = 0; > struct kvec iov[2]; > > @@ -3580,9 +3580,10 @@ static int smb3_simple_fallocate_write_range(unsigned int xid, > rc = SMB2_write(xid, &io_parms, &nbytes, iov, 1); > if (rc) > break; > + if (!nbytes) > + return -EIO; > if (nbytes > len) > return -EINVAL; > - buf += nbytes; > off += nbytes; > len -= nbytes; > } > @@ -3611,7 +3612,7 @@ static int smb3_simple_fallocate_range(unsigned int xid, > if (rc) > goto out; > > - buf = kzalloc(1024 * 1024, GFP_KERNEL); > + buf = kzalloc(min_t(loff_t, len, SMB2_MAX_BUFFER_SIZE), GFP_KERNEL); > if (buf == NULL) { > rc = -ENOMEM; > goto out; > -- > 2.43.0 > -- Thanks, Steve