From: David Disseldorp <ddiss@suse.de>
To: Jeremy Allison <jra@samba.org>, David Howells <dhowells@redhat.com>
Cc: smfrench@gmail.com, Shyam Prasad N <nspmangalore@gmail.com>,
jlayton@kernel.org, linux-cifs@vger.kernel.org
Subject: Re: Incorrect fallocate behaviour in cifs or samba?
Date: Thu, 13 Jan 2022 19:16:07 +0100 [thread overview]
Message-ID: <20220113191607.04e20180@suse.de> (raw)
In-Reply-To: <YeBkxLnh8+sUv968@jeremy-acer>
Hi Jeremy and David,
On Thu, 13 Jan 2022 09:43:32 -0800, Jeremy Allison wrote:
> On Thu, Jan 13, 2022 at 03:20:32PM +0000, David Howells wrote:
> >David Howells <dhowells@redhat.com> wrote:
> >
> >> If I do the following:
> >>
> >> mount //carina/test /xfstest.test -o user=shares,pass=foobar,noperm,vers=3.0,mfsymlinks,actimeo=0
> >> /usr/sbin/xfs_io -f -t \
> >> -c "pwrite -S 0x41 0 4096"
> >> -c "pwrite -S 0x42 4096 4096"
> >> -c "fzero 0 4096" \
> >> -c "pread 0 8192" \
> >> /xfstest.test/008.7067
> >> ...
> >> 31 0.321638749 192.168.6.2 -> 192.168.6.1 SMB2 206 Ioctl Request FSCTL_SET_ZERO_DATA File: 008.7067
> >
> >So what I see is that Samba does:
> >
> > fallocate(24, FALLOC_FL_KEEP_SIZE|FALLOC_FL_PUNCH_HOLE, 0, 4096) = 0
> >
> >for this... but that's not what cifs was asked to do. Should Samba be using
> >FALLOC_FL_ZERO_RANGE instead?
>
> This is from fsctl_zero_data() in Samba. We have:
>
> /*
> * MS-FSCC <58> Section 2.3.67
> * This FSCTL sets the range of bytes to zero (0) without extending the
> * file size.
> *
> * The VFS_FALLOCATE_FL_KEEP_SIZE flag is used to satisfy this
> * constraint.
> */
>
> mode = VFS_FALLOCATE_FL_PUNCH_HOLE | VFS_FALLOCATE_FL_KEEP_SIZE;
> ret = SMB_VFS_FALLOCATE(fsp, mode, zdata_info.file_off, len);
> if (ret == -1) {
> status = map_nt_error_from_unix_common(errno);
> DEBUG(2, ("zero-data fallocate(0x%x) failed: %s\n", mode,
> strerror(errno)));
> return status;
> }
>
> if (!fsp->fsp_flags.is_sparse && lp_strict_allocate(SNUM(fsp->conn))) {
> /*
> * File marked non-sparse and "strict allocate" is enabled -
> * allocate the range that we just punched out.
> * In future FALLOC_FL_ZERO_RANGE could be used exclusively for
> * this, but it's currently only supported on XFS and ext4.
> *
> * The newly allocated range still won't be found by SEEK_DATA
> * for QAR, but stat.st_blocks will reflect it.
> */
> ret = SMB_VFS_FALLOCATE(fsp, VFS_FALLOCATE_FL_KEEP_SIZE,
> zdata_info.file_off, len);
>
> Note the "currently only supported on XFS and ext4" problem
> with FALLOC_FL_ZERO_RANGE.
FWIW, Samba's fsctl_zero_data semantics are based on observed Windows
server behaviour and the MS specs, which state(d at the time):
/*
* 2.3.57 FSCTL_SET_ZERO_DATA Request
*
* How an implementation zeros data within a file is implementation-dependent.
* A file system MAY choose to deallocate regions of disk space that have been
* zeroed.<50>
* <50>
* ... NTFS might deallocate disk space in the file if the file is stored on an
* NTFS volume, and the file is sparse or compressed. It will free any allocated
* space in chunks of 64 kilobytes that begin at an offset that is a multiple of
* 64 kilobytes. Other bytes in the file (prior to the first freed 64-kilobyte
* chunk and after the last freed 64-kilobyte chunk) will be zeroed but not
* deallocated.
*/
IIRC while implementing this I observed Windows deallocation behaviour
using FSCTL_QUERY_ALLOCATED_RANGES (referred to as QAR in the previous
code snippit).
Cheers, David
next prev parent reply other threads:[~2022-01-13 18:16 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-13 13:18 cifs fallocate doesn't flush writes? David Howells
2022-01-13 15:20 ` Incorrect fallocate behaviour in cifs or samba? David Howells
2022-01-13 17:43 ` Jeremy Allison
2022-01-13 18:16 ` David Disseldorp [this message]
2022-01-13 18:22 ` Jeremy Allison
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220113191607.04e20180@suse.de \
--to=ddiss@suse.de \
--cc=dhowells@redhat.com \
--cc=jlayton@kernel.org \
--cc=jra@samba.org \
--cc=linux-cifs@vger.kernel.org \
--cc=nspmangalore@gmail.com \
--cc=smfrench@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox