Eric Biggers 2b4eae95c7 fscrypt: don't evict dirty inodes after removing key
After FS_IOC_REMOVE_ENCRYPTION_KEY removes a key, it syncs the
filesystem and tries to get and put all inodes that were unlocked by the
key so that unused inodes get evicted via fscrypt_drop_inode().
Normally, the inodes are all clean due to the sync.

However, after the filesystem is sync'ed, userspace can modify and close
one of the files.  (Userspace is *supposed* to close the files before
removing the key.  But it doesn't always happen, and the kernel can't
assume it.)  This causes the inode to be dirtied and have i_count == 0.
Then, fscrypt_drop_inode() failed to consider this case and indicated
that the inode can be dropped, causing the write to be lost.

On f2fs, other problems such as a filesystem freeze could occur due to
the inode being freed while still on f2fs's dirty inode list.

Fix this bug by making fscrypt_drop_inode() only drop clean inodes.

I've written an xfstest which detects this bug on ext4, f2fs, and ubifs.

Fixes: b1c0ec3599f4 ("fscrypt: add FS_IOC_REMOVE_ENCRYPTION_KEY ioctl")
Cc: <stable@vger.kernel.org> # v5.4+
Link: https://lore.kernel.org/r/20200305084138.653498-1-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>
2020-03-07 18:43:07 -08:00
..
2019-09-27 15:10:34 -07:00
2020-02-23 09:43:50 -08:00
2019-09-19 09:42:37 -07:00
2020-02-17 21:08:37 -08:00
2019-11-11 09:21:59 -05:00
2020-02-11 16:52:08 -08:00
2019-09-19 09:42:37 -07:00
2020-02-05 05:28:20 +00:00
2020-02-07 17:50:21 -08:00
\n
2020-01-30 15:37:41 -08:00
2019-09-19 09:42:37 -07:00
2020-01-14 13:28:28 -08:00
2020-02-11 16:52:08 -08:00
2020-02-26 16:58:15 +09:00
2020-02-05 20:34:32 -08:00
2019-08-07 21:51:47 -04:00
2020-01-29 19:38:34 -08:00
2020-02-07 14:48:35 -05:00
2020-02-07 14:48:35 -05:00
2020-01-29 18:53:37 -08:00
2020-02-08 13:44:41 -08:00
2020-02-09 15:51:46 -08:00
2020-02-09 15:51:46 -08:00
2020-02-01 10:36:49 -08:00
2020-02-03 21:23:33 -05:00
2020-02-04 11:45:21 +00:00
2019-12-08 14:37:36 +01:00