smb: client: fix data loss due to broken rename(2)
authorPaulo Alcantara <pc@manguebit.org>
Mon, 8 Sep 2025 00:24:06 +0000 (21:24 -0300)
committerSteve French <stfrench@microsoft.com>
Tue, 9 Sep 2025 23:39:58 +0000 (18:39 -0500)
commitc5ea3065586d790ea5193a679b85585173d59866
tree08cfd7803adf6d8f8346f05a5a67d98fdf428c8f
parent90f7c100d2dd99d5cd5be950d553edd2647e6cc8
smb: client: fix data loss due to broken rename(2)

Rename of open files in SMB2+ has been broken for a very long time,
resulting in data loss as the CIFS client would fail the rename(2)
call with -ENOENT and then removing the target file.

Fix this by implementing ->rename_pending_delete() for SMB2+, which
will rename busy files to random filenames (e.g. silly rename) during
unlink(2) or rename(2), and then marking them to delete-on-close.

Besides, introduce a FIND_WR_NO_PENDING_DELETE flag to prevent open(2)
from reusing open handles that had been marked as delete pending.
Handle it in cifs_get_readable_path() as well.

Reported-by: Jean-Baptiste Denis <jbdenis@pasteur.fr>
Closes: https://marc.info/?i=16aeb380-30d4-4551-9134-4e7d1dc833c0@pasteur.fr
Reviewed-by: David Howells <dhowells@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
Cc: Frank Sorenson <sorenson@redhat.com>
Cc: Olga Kornievskaia <okorniev@redhat.com>
Cc: Benjamin Coddington <bcodding@redhat.com>
Cc: Scott Mayhew <smayhew@redhat.com>
Cc: linux-cifs@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cifsglob.h
fs/smb/client/file.c
fs/smb/client/inode.c
fs/smb/client/smb2glob.h
fs/smb/client/smb2inode.c
fs/smb/client/smb2ops.c
fs/smb/client/smb2proto.h
fs/smb/client/trace.h