linux-stable/fs/afs
David Howells a8e8b14819 afs: Fix incorrect triggering of sillyrename on 3rd-party invalidation
[ Upstream commit 63d49d843e ]

The AFS filesystem is currently triggering the silly-rename cleanup from
afs_d_revalidate() when it sees that a dentry has been changed by a third
party[1].  It should not be doing this as the cleanup includes deleting the
silly-rename target file on iput.

Fix this by removing the places in the d_revalidate handling that validate
anything other than the directory and the dirent.  It probably should not
be looking to validate the target inode of the dentry also.

This includes removing the point in afs_d_revalidate() where the inode that
a dentry used to point to was marked as being deleted (AFS_VNODE_DELETED).
We don't know it got deleted.  It could have been renamed or it could have
hard links remaining.

This was reproduced by cloning a git repo onto an afs volume on one
machine, switching to another machine and doing "git status", then
switching back to the first and doing "git status".  The second status
would show weird output due to ".git/index" getting deleted by the above
mentioned mechanism.

A simpler way to do it is to do:

	machine 1: touch a
	machine 2: touch b; mv -f b a
	machine 1: stat a

on an afs volume.  The bug shows up as the stat failing with ENOENT and the
file server log showing that machine 1 deleted "a".

Fixes: 79ddbfa500 ("afs: Implement sillyrename for unlink and rename")
Reported-by: Markus Suvanto <markus.suvanto@gmail.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Tested-by: Markus Suvanto <markus.suvanto@gmail.com>
cc: linux-afs@lists.infradead.org
Link: https://bugzilla.kernel.org/show_bug.cgi?id=214217#c4 [1]
Link: https://lore.kernel.org/r/163111668100.283156.3851669884664475428.stgit@warthog.procyon.org.uk/
Signed-off-by: Sasha Levin <sashal@kernel.org>
2021-09-30 10:09:22 +02:00
..
Kconfig treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
Makefile afs: do not send list of client addresses 2019-06-02 18:06:26 -07:00
addr_list.c Keyrings namespacing 2019-07-08 19:36:47 -07:00
afs.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
afs_cm.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
afs_fs.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
afs_vl.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
cache.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
callback.c afs: Fix possible assert with callbacks from yfs servers 2019-11-22 14:19:26 -08:00
cell.c afs: Fix storage of cell names 2020-06-30 15:37:02 -04:00
cmservice.c afs: Fix tracepoint string placement with built-in AFS 2021-07-28 13:30:58 +02:00
dir.c afs: Fix incorrect triggering of sillyrename on 3rd-party invalidation 2021-09-30 10:09:22 +02:00
dir_edit.c afs: Remove set but not used variables 'before', 'after' 2020-01-26 10:01:08 +01:00
dir_silly.c afs: Fix race between post-modification dir edit and readdir/d_revalidate 2020-04-23 10:36:25 +02:00
dynroot.c afs: Fix NULL deref in afs_dynroot_depopulate() 2020-08-26 10:41:05 +02:00
file.c afs: Stop listxattr() from listing "afs.*" attributes 2021-03-24 11:26:37 +01:00
flock.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
fs_probe.c rxrpc: Make rxrpc_kernel_get_srtt() indicate validity 2020-09-09 19:12:23 +02:00
fsclient.c afs: Set error flag rather than return error from file status decode 2020-06-24 17:50:46 +02:00
inode.c afs: Stop listxattr() from listing "afs.*" attributes 2021-03-24 11:26:37 +01:00
internal.h afs: Stop listxattr() from listing "afs.*" attributes 2021-03-24 11:26:37 +01:00
main.c afs: Fix an IS_ERR() vs NULL check 2021-06-23 14:41:23 +02:00
misc.c afs: Fix the mapping of the UAEOVERFLOW abort code 2020-06-24 17:50:46 +02:00
mntpt.c afs: Stop listxattr() from listing "afs.*" attributes 2021-03-24 11:26:37 +01:00
proc.c afs: Fix memory leak in afs_put_sysnames() 2020-06-24 17:50:42 +02:00
protocol_uae.h afs: Add support for the UAE error table 2019-06-28 18:37:53 +01:00
protocol_yfs.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 36 2019-05-24 17:27:11 +02:00
rotate.c afs: Make record checking use TASK_UNINTERRUPTIBLE when appropriate 2020-05-02 08:48:43 +02:00
rxrpc.c afs: Set error flag rather than return error from file status decode 2020-06-24 17:50:46 +02:00
security.c afs: Support RCU pathwalk 2019-09-02 11:43:54 +01:00
server.c afs: Make record checking use TASK_UNINTERRUPTIBLE when appropriate 2020-05-02 08:48:43 +02:00
server_list.c AFS development 2019-07-10 20:55:33 -07:00
super.c afs: Fix memory leak when mounting with multiple source parameters 2020-12-30 11:50:54 +01:00
vl_list.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
vl_probe.c rxrpc: Make rxrpc_kernel_get_srtt() indicate validity 2020-09-09 19:12:23 +02:00
vl_rotate.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 36 2019-05-24 17:27:11 +02:00
vlclient.c afs: Fix loop index mixup in afs_deliver_vl_get_entry_by_name_u() 2019-07-30 14:38:51 +01:00
volume.c afs: Make record checking use TASK_UNINTERRUPTIBLE when appropriate 2020-05-02 08:48:43 +02:00
write.c afs: afs_write_end() should change i_size under the right lock 2020-06-24 17:50:46 +02:00
xattr.c afs: Stop listxattr() from listing "afs.*" attributes 2021-03-24 11:26:37 +01:00
xdr_fs.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 36 2019-05-24 17:27:11 +02:00
yfsclient.c afs: Fix warning due to unadvanced marshalling pointer 2020-11-18 19:20:18 +01:00