mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 18:52:02 +00:00
fscrypt updates for 6.8
Adjust the timing of the fscrypt keyring destruction, to prepare for btrfs's fscrypt support. Also document that CephFS supports fscrypt now. -----BEGIN PGP SIGNATURE----- iIoEABYIADIWIQSacvsUNc7UX4ntmEPzXCl4vpKOKwUCZZx4UBQcZWJpZ2dlcnNA Z29vZ2xlLmNvbQAKCRDzXCl4vpKOK85+AQCBHoG6R5UuPqafoDtabcCpxRW/ZHdo WzOwjvHz1/tq5AEApogvjPI/3v2gelLnG9ZrXUBZMWZN6W0LQbH/k1VHjQ8= =nvWY -----END PGP SIGNATURE----- Merge tag 'fscrypt-for-linus' of git://git.kernel.org/pub/scm/fs/fscrypt/linux Pull fscrypt updates from Eric Biggers: "Adjust the timing of the fscrypt keyring destruction, to prepare for btrfs's fscrypt support. Also document that CephFS supports fscrypt now" * tag 'fscrypt-for-linus' of git://git.kernel.org/pub/scm/fs/fscrypt/linux: fs: move fscrypt keyring destruction to after ->put_super f2fs: move release of block devices to after kill_block_super() fscrypt: document that CephFS supports fscrypt now fscrypt: update comment for do_remove_key() fscrypt.rst: update definition of struct fscrypt_context_v2
This commit is contained in:
commit
17b9e388c6
@ -31,15 +31,15 @@ However, except for filenames, fscrypt does not encrypt filesystem
|
||||
metadata.
|
||||
|
||||
Unlike eCryptfs, which is a stacked filesystem, fscrypt is integrated
|
||||
directly into supported filesystems --- currently ext4, F2FS, and
|
||||
UBIFS. This allows encrypted files to be read and written without
|
||||
caching both the decrypted and encrypted pages in the pagecache,
|
||||
thereby nearly halving the memory used and bringing it in line with
|
||||
unencrypted files. Similarly, half as many dentries and inodes are
|
||||
needed. eCryptfs also limits encrypted filenames to 143 bytes,
|
||||
causing application compatibility issues; fscrypt allows the full 255
|
||||
bytes (NAME_MAX). Finally, unlike eCryptfs, the fscrypt API can be
|
||||
used by unprivileged users, with no need to mount anything.
|
||||
directly into supported filesystems --- currently ext4, F2FS, UBIFS,
|
||||
and CephFS. This allows encrypted files to be read and written
|
||||
without caching both the decrypted and encrypted pages in the
|
||||
pagecache, thereby nearly halving the memory used and bringing it in
|
||||
line with unencrypted files. Similarly, half as many dentries and
|
||||
inodes are needed. eCryptfs also limits encrypted filenames to 143
|
||||
bytes, causing application compatibility issues; fscrypt allows the
|
||||
full 255 bytes (NAME_MAX). Finally, unlike eCryptfs, the fscrypt API
|
||||
can be used by unprivileged users, with no need to mount anything.
|
||||
|
||||
fscrypt does not support encrypting files in-place. Instead, it
|
||||
supports marking an empty directory as encrypted. Then, after
|
||||
@ -1382,7 +1382,8 @@ directory.) These structs are defined as follows::
|
||||
u8 contents_encryption_mode;
|
||||
u8 filenames_encryption_mode;
|
||||
u8 flags;
|
||||
u8 __reserved[4];
|
||||
u8 log2_data_unit_size;
|
||||
u8 __reserved[3];
|
||||
u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
|
||||
u8 nonce[FSCRYPT_FILE_NONCE_SIZE];
|
||||
};
|
||||
|
@ -11,7 +11,7 @@ config FS_ENCRYPTION
|
||||
feature is similar to ecryptfs, but it is more memory
|
||||
efficient since it avoids caching the encrypted and
|
||||
decrypted pages in the page cache. Currently Ext4,
|
||||
F2FS and UBIFS make use of this feature.
|
||||
F2FS, UBIFS, and CephFS make use of this feature.
|
||||
|
||||
# Filesystems supporting encryption must select this if FS_ENCRYPTION. This
|
||||
# allows the algorithms to be built as modules when all the filesystems are,
|
||||
|
@ -1002,9 +1002,9 @@ static int try_to_lock_encrypted_files(struct super_block *sb,
|
||||
* FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS (all_users=true) always removes the
|
||||
* key itself.
|
||||
*
|
||||
* To "remove the key itself", first we wipe the actual master key secret, so
|
||||
* that no more inodes can be unlocked with it. Then we try to evict all cached
|
||||
* inodes that had been unlocked with the key.
|
||||
* To "remove the key itself", first we transition the key to the "incompletely
|
||||
* removed" state, so that no more inodes can be unlocked with it. Then we try
|
||||
* to evict all cached inodes that had been unlocked with the key.
|
||||
*
|
||||
* If all inodes were evicted, then we unlink the fscrypt_master_key from the
|
||||
* keyring. Otherwise it remains in the keyring in the "incompletely removed"
|
||||
|
@ -1717,12 +1717,10 @@ static void f2fs_put_super(struct super_block *sb)
|
||||
|
||||
kvfree(sbi->ckpt);
|
||||
|
||||
sb->s_fs_info = NULL;
|
||||
if (sbi->s_chksum_driver)
|
||||
crypto_free_shash(sbi->s_chksum_driver);
|
||||
kfree(sbi->raw_super);
|
||||
|
||||
destroy_device_list(sbi);
|
||||
f2fs_destroy_page_array_cache(sbi);
|
||||
f2fs_destroy_xattr_caches(sbi);
|
||||
mempool_destroy(sbi->write_io_dummy);
|
||||
@ -1738,7 +1736,6 @@ static void f2fs_put_super(struct super_block *sb)
|
||||
#if IS_ENABLED(CONFIG_UNICODE)
|
||||
utf8_unload(sb->s_encoding);
|
||||
#endif
|
||||
kfree(sbi);
|
||||
}
|
||||
|
||||
int f2fs_sync_fs(struct super_block *sb, int sync)
|
||||
@ -4902,9 +4899,9 @@ static struct dentry *f2fs_mount(struct file_system_type *fs_type, int flags,
|
||||
|
||||
static void kill_f2fs_super(struct super_block *sb)
|
||||
{
|
||||
if (sb->s_root) {
|
||||
struct f2fs_sb_info *sbi = F2FS_SB(sb);
|
||||
struct f2fs_sb_info *sbi = F2FS_SB(sb);
|
||||
|
||||
if (sb->s_root) {
|
||||
set_sbi_flag(sbi, SBI_IS_CLOSE);
|
||||
f2fs_stop_gc_thread(sbi);
|
||||
f2fs_stop_discard_thread(sbi);
|
||||
@ -4931,6 +4928,12 @@ static void kill_f2fs_super(struct super_block *sb)
|
||||
sb->s_flags &= ~SB_RDONLY;
|
||||
}
|
||||
kill_block_super(sb);
|
||||
/* Release block devices last, after fscrypt_destroy_keyring(). */
|
||||
if (sbi) {
|
||||
destroy_device_list(sbi);
|
||||
kfree(sbi);
|
||||
sb->s_fs_info = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static struct file_system_type f2fs_fs_type = {
|
||||
|
12
fs/super.c
12
fs/super.c
@ -637,12 +637,6 @@ void generic_shutdown_super(struct super_block *sb)
|
||||
fsnotify_sb_delete(sb);
|
||||
security_sb_delete(sb);
|
||||
|
||||
/*
|
||||
* Now that all potentially-encrypted inodes have been evicted,
|
||||
* the fscrypt keyring can be destroyed.
|
||||
*/
|
||||
fscrypt_destroy_keyring(sb);
|
||||
|
||||
if (sb->s_dio_done_wq) {
|
||||
destroy_workqueue(sb->s_dio_done_wq);
|
||||
sb->s_dio_done_wq = NULL;
|
||||
@ -651,6 +645,12 @@ void generic_shutdown_super(struct super_block *sb)
|
||||
if (sop->put_super)
|
||||
sop->put_super(sb);
|
||||
|
||||
/*
|
||||
* Now that all potentially-encrypted inodes have been evicted,
|
||||
* the fscrypt keyring can be destroyed.
|
||||
*/
|
||||
fscrypt_destroy_keyring(sb);
|
||||
|
||||
if (CHECK_DATA_CORRUPTION(!list_empty(&sb->s_inodes),
|
||||
"VFS: Busy inodes after unmount of %s (%s)",
|
||||
sb->s_id, sb->s_type->name)) {
|
||||
|
Loading…
Reference in New Issue
Block a user