Amir Goldstein a37d9a17f0 fsnotify: invalidate dcache before IN_DELETE event
Apparently, there are some applications that use IN_DELETE event as an
invalidation mechanism and expect that if they try to open a file with
the name reported with the delete event, that it should not contain the
content of the deleted file.

Commit 49246466a989 ("fsnotify: move fsnotify_nameremove() hook out of
d_delete()") moved the fsnotify delete hook before d_delete() so fsnotify
will have access to a positive dentry.

This allowed a race where opening the deleted file via cached dentry
is now possible after receiving the IN_DELETE event.

To fix the regression, create a new hook fsnotify_delete() that takes
the unlinked inode as an argument and use a helper d_delete_notify() to
pin the inode, so we can pass it to fsnotify_delete() after d_delete().

Backporting hint: this regression is from v5.3. Although patch will
apply with only trivial conflicts to v5.4 and v5.10, it won't build,
because fsnotify_delete() implementation is different in each of those
versions (see fsnotify_link()).

A follow up patch will fix the fsnotify_unlink/rmdir() calls in pseudo
filesystem that do not need to call d_delete().

Link: https://lore.kernel.org/r/20220120215305.282577-1-amir73il@gmail.com
Reported-by: Ivan Delalande <colona@arista.com>
Link: https://lore.kernel.org/linux-fsdevel/YeNyzoDM5hP5LtGW@visor/
Fixes: 49246466a989 ("fsnotify: move fsnotify_nameremove() hook out of d_delete()")
Cc: stable@vger.kernel.org # v5.3+
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
2022-01-24 14:16:46 +01:00
..
2022-01-12 13:45:12 -08:00
2021-08-19 09:02:55 +09:00
2022-01-12 13:45:12 -08:00
2022-01-12 13:45:12 -08:00
2021-11-09 10:02:51 -08:00
2021-10-25 19:11:50 -07:00
2022-01-12 11:11:34 -08:00
2021-12-03 18:44:06 +01:00
2022-01-12 15:46:11 -08:00
2022-01-17 05:40:02 +02:00
2022-01-19 11:50:20 +02:00
2022-01-12 11:11:34 -08:00
2022-01-12 15:46:11 -08:00
2021-11-03 09:23:25 -07:00
2022-01-11 14:26:55 -08:00
2022-01-10 11:48:37 -08:00
\n
2021-11-06 16:40:48 -07:00
2022-01-16 10:15:32 +02:00
2021-08-19 09:02:55 +09:00
2021-12-17 16:56:35 +09:00
2021-11-17 09:26:09 +01:00
2021-09-09 13:25:49 -07:00
2022-01-12 13:45:12 -08:00
2022-01-12 10:26:52 -08:00
2022-01-07 13:40:39 +00:00
2021-10-19 14:11:39 -04:00
2022-01-11 14:26:55 -08:00
2021-08-10 17:57:22 +02:00