linux/fs/smb/client
David Howells 416871f4fb cifs: Fix FALLOC_FL_PUNCH_HOLE support
The cifs filesystem doesn't quite emulate FALLOC_FL_PUNCH_HOLE correctly
(note that due to lack of protocol support, it can't actually implement it
directly).  Whilst it will (partially) invalidate dirty folios in the
pagecache, it doesn't write them back first, and so the EOF marker on the
server may be lower than inode->i_size.

This presents a problem, however, as if the punched hole invalidates the
tail of the locally cached dirty data, writeback won't know it needs to
move the EOF over to account for the hole punch (which isn't supposed to
move the EOF).  We could just write zeroes over the punched out region of
the pagecache and write that back - but this is supposed to be a
deallocatory operation.

Fix this by manually moving the EOF over on the server after the operation
if the hole punched would corrupt it.

Note that the FSCTL_SET_ZERO_DATA RPC and the setting of the EOF should
probably be compounded to stop a third party interfering (or, at least,
massively reduce the chance).

This was reproducible occasionally by using fsx with the following script:

	truncate 0x0 0x375e2 0x0
	punch_hole 0x2f6d3 0x6ab5 0x375e2
	truncate 0x0 0x3a71f 0x375e2
	mapread 0xee05 0xcf12 0x3a71f
	write 0x2078e 0x5604 0x3a71f
	write 0x3ebdf 0x1421 0x3a71f *
	punch_hole 0x379d0 0x8630 0x40000 *
	mapread 0x2aaa2 0x85b 0x40000
	fallocate 0x1b401 0x9ada 0x40000
	read 0x15f2 0x7d32 0x40000
	read 0x32f37 0x7a3b 0x40000 *

The second "write" should extend the EOF to 0x40000, and the "punch_hole"
should operate inside of that - but that depends on whether the VM gets in
and writes back the data first.  If it doesn't, the file ends up 0x3a71f in
size, not 0x40000.

Fixes: 31742c5a33 ("enable fallocate punch hole ("fallocate -p") for SMB3")
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Steve French <sfrench@samba.org>
cc: Paulo Alcantara <pc@manguebit.com>
cc: Shyam Prasad N <nspmangalore@gmail.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: linux-cifs@vger.kernel.org
cc: netfs@lists.linux.dev
Signed-off-by: Steve French <stfrench@microsoft.com>
2024-08-25 09:06:25 -05:00
..
asn1.c
cached_dir.c smb3: fix Open files on server counter going negative 2024-04-11 16:02:02 -05:00
cached_dir.h smb: client: make laundromat a delayed worker 2023-10-12 09:41:04 -05:00
cifs_debug.c smb3: fix setting SecurityFlags when encryption is required 2024-08-08 11:14:53 -05:00
cifs_debug.h
cifs_fs_sb.h
cifs_ioctl.h smb3: allow dumping session and tcon id to improve stats analysis and debugging 2023-11-10 02:00:30 -06:00
cifs_spnego_negtokeninit.asn1
cifs_spnego.c cifs: spnego: add ';' in HOST_KEY_LEN 2023-11-13 16:21:34 -06:00
cifs_spnego.h
cifs_swn.c
cifs_swn.h
cifs_unicode.c fs/smb/client: Use common code in client 2023-08-30 08:55:52 -05:00
cifs_unicode.h fs/smb/client: Use common code in client 2023-08-30 08:55:52 -05:00
cifsacl.c
cifsacl.h
cifsencrypt.c smb: Work around Clang __bdos() type confusion 2024-01-23 18:56:16 -06:00
cifsfs.c smb/client: fix typo: GlobalMid_Sem -> GlobalMid_Lock 2024-08-22 15:44:19 -05:00
cifsfs.h cifs: update internal version number 2024-08-02 10:56:14 -05:00
cifsglob.h smb/client: remove unused rq_iter_size from struct smb_rqst 2024-08-25 09:06:25 -05:00
cifspdu.h cifs: fix creating sockets when using sfu mount options 2024-05-31 10:55:15 -05:00
cifsproto.h cifs: Remove cifs_aio_ctx 2024-08-02 10:55:45 -05:00
cifsroot.c
cifssmb.c smb/client: remove unused rq_iter_size from struct smb_rqst 2024-08-25 09:06:25 -05:00
connect.c smb3: fix problem unloading module due to leaked refcount on shutdown 2024-08-22 12:36:57 -05:00
dfs_cache.c smb: client: refresh referral without acquiring refpath_lock 2024-04-02 10:11:43 -05:00
dfs_cache.h smb: client: ensure to try all targets when finding nested links 2023-08-20 16:05:50 -05:00
dfs.c smb: client: guarantee refcounted children from parent session 2024-04-02 10:09:57 -05:00
dfs.h smb: client: guarantee refcounted children from parent session 2024-04-02 10:09:57 -05:00
dir.c cifs: Fix caching to try to do open O_WRONLY as rdwr on server 2024-04-02 09:29:55 -05:00
dns_resolve.c
dns_resolve.h
export.c exportfs: make ->encode_fh() a mandatory method for NFS export 2023-10-28 16:15:15 +02:00
file.c smb3: fix broken cached reads when posix locks 2024-08-18 17:01:06 -05:00
fs_context.c smb: client: Convert to new uid/gid option parsing helpers 2024-07-02 06:21:20 +02:00
fs_context.h cifs: reinstate original behavior again for forceuid/forcegid 2024-04-22 10:50:31 -05:00
fscache.c cifs: Remove some code that's no longer used, part 1 2024-05-01 18:08:21 +01:00
fscache.h cifs: Remove some code that's no longer used, part 1 2024-05-01 18:08:21 +01:00
inode.c smb: client: handle lack of FSCTL_GET_REPARSE_POINT support 2024-08-02 10:55:22 -05:00
ioctl.c smb3: fix problem unloading module due to leaked refcount on shutdown 2024-08-22 12:36:57 -05:00
Kconfig cifs: Implement netfslib hooks 2024-05-01 18:08:21 +01:00
link.c smb3: fix problem unloading module due to leaked refcount on shutdown 2024-08-22 12:36:57 -05:00
Makefile smb: client: move most of reparse point handling code to common file 2024-03-10 19:33:57 -05:00
misc.c cifs: cifs_inval_name_dfs_link_error: correct the check for fullpath 2024-08-08 20:06:22 -05:00
namespace.c smb: client: set correct id, uid and cruid for multiuser automounts 2024-02-12 12:46:49 -06:00
netlink.c
netlink.h
netmisc.c
nterr.c
nterr.h
ntlmssp.h cifs: Add client version details to NTLM authenticate message 2023-10-22 19:03:42 -05:00
readdir.c smb: client: parse uid, gid, mode and dev from WSL reparse points 2024-03-10 19:33:58 -05:00
reparse.c smb: client: ignore unhandled reparse tags 2024-08-22 12:37:16 -05:00
reparse.h smb: client: handle lack of FSCTL_GET_REPARSE_POINT support 2024-08-02 10:55:22 -05:00
rfc1002pdu.h
sess.c cifs: reduce warning log level for server not advertising interfaces 2024-03-14 13:54:27 -05:00
smb1ops.c cifs: Add a tracepoint to track credits involved in R/W requests 2024-07-19 11:08:57 -05:00
smb2file.c smb/client: adapt to breakup of struct file_lock 2024-02-05 13:11:44 +01:00
smb2glob.h smb: client: introduce SMB2_OP_QUERY_WSL_EA 2024-03-10 19:33:58 -05:00
smb2inode.c smb: client: fix FSCTL_GET_REPARSE_POINT against NetApp 2024-08-02 10:56:02 -05:00
smb2maperror.c cifs: new nt status codes from MS-SMB2 2024-01-18 21:01:04 -06:00
smb2misc.c cifs: Add tracing for the cifs_tcon struct refcounting 2024-04-19 16:02:09 -05:00
smb2ops.c cifs: Fix FALLOC_FL_PUNCH_HOLE support 2024-08-25 09:06:25 -05:00
smb2pdu.c smb/client: fix rdma usage in smb2_async_writev() 2024-08-25 09:06:25 -05:00
smb2pdu.h smb: smb2pdu.h: Avoid -Wflex-array-member-not-at-end warnings 2024-05-13 16:46:56 -05:00
smb2proto.h cifs: Cut over to using netfslib 2024-05-01 18:08:21 +01:00
smb2status.h cifs: new nt status codes from MS-SMB2 2024-01-18 21:01:04 -06:00
smb2transport.c smb: client: fix deadlock in smb2_find_smb_tcon() 2024-06-07 01:05:07 -05:00
smbdirect.c Fix spelling errors in Server Message Block 2024-08-08 11:15:33 -05:00
smbdirect.h
smbencrypt.c smb: client: delete "true", "false" defines 2024-01-23 12:41:02 -06:00
smberr.h
trace.c
trace.h smb3: add dynamic tracepoints for shutdown ioctl 2024-08-02 10:55:49 -05:00
transport.c Fix spelling errors in Server Message Block 2024-08-08 11:15:33 -05:00
unc.c
winucase.c
xattr.c smb3: fix caching of ctime on setxattr 2023-11-09 10:25:58 -06:00