Commit 17b9e388 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 49f48103 2a0e8571
...@@ -31,15 +31,15 @@ However, except for filenames, fscrypt does not encrypt filesystem ...@@ -31,15 +31,15 @@ However, except for filenames, fscrypt does not encrypt filesystem
metadata. metadata.
Unlike eCryptfs, which is a stacked filesystem, fscrypt is integrated Unlike eCryptfs, which is a stacked filesystem, fscrypt is integrated
directly into supported filesystems --- currently ext4, F2FS, and directly into supported filesystems --- currently ext4, F2FS, UBIFS,
UBIFS. This allows encrypted files to be read and written without and CephFS. This allows encrypted files to be read and written
caching both the decrypted and encrypted pages in the pagecache, without caching both the decrypted and encrypted pages in the
thereby nearly halving the memory used and bringing it in line with pagecache, thereby nearly halving the memory used and bringing it in
unencrypted files. Similarly, half as many dentries and inodes are line with unencrypted files. Similarly, half as many dentries and
needed. eCryptfs also limits encrypted filenames to 143 bytes, inodes are needed. eCryptfs also limits encrypted filenames to 143
causing application compatibility issues; fscrypt allows the full 255 bytes, causing application compatibility issues; fscrypt allows the
bytes (NAME_MAX). Finally, unlike eCryptfs, the fscrypt API can be full 255 bytes (NAME_MAX). Finally, unlike eCryptfs, the fscrypt API
used by unprivileged users, with no need to mount anything. can be used by unprivileged users, with no need to mount anything.
fscrypt does not support encrypting files in-place. Instead, it fscrypt does not support encrypting files in-place. Instead, it
supports marking an empty directory as encrypted. Then, after supports marking an empty directory as encrypted. Then, after
...@@ -1382,7 +1382,8 @@ directory.) These structs are defined as follows:: ...@@ -1382,7 +1382,8 @@ directory.) These structs are defined as follows::
u8 contents_encryption_mode; u8 contents_encryption_mode;
u8 filenames_encryption_mode; u8 filenames_encryption_mode;
u8 flags; u8 flags;
u8 __reserved[4]; u8 log2_data_unit_size;
u8 __reserved[3];
u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE]; u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
u8 nonce[FSCRYPT_FILE_NONCE_SIZE]; u8 nonce[FSCRYPT_FILE_NONCE_SIZE];
}; };
......
...@@ -11,7 +11,7 @@ config FS_ENCRYPTION ...@@ -11,7 +11,7 @@ config FS_ENCRYPTION
feature is similar to ecryptfs, but it is more memory feature is similar to ecryptfs, but it is more memory
efficient since it avoids caching the encrypted and efficient since it avoids caching the encrypted and
decrypted pages in the page cache. Currently Ext4, 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 # Filesystems supporting encryption must select this if FS_ENCRYPTION. This
# allows the algorithms to be built as modules when all the filesystems are, # 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, ...@@ -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 * FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS (all_users=true) always removes the
* key itself. * key itself.
* *
* To "remove the key itself", first we wipe the actual master key secret, so * To "remove the key itself", first we transition the key to the "incompletely
* that no more inodes can be unlocked with it. Then we try to evict all cached * removed" state, so that no more inodes can be unlocked with it. Then we try
* inodes that had been unlocked with the key. * 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 * 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" * keyring. Otherwise it remains in the keyring in the "incompletely removed"
......
...@@ -1717,12 +1717,10 @@ static void f2fs_put_super(struct super_block *sb) ...@@ -1717,12 +1717,10 @@ static void f2fs_put_super(struct super_block *sb)
kvfree(sbi->ckpt); kvfree(sbi->ckpt);
sb->s_fs_info = NULL;
if (sbi->s_chksum_driver) if (sbi->s_chksum_driver)
crypto_free_shash(sbi->s_chksum_driver); crypto_free_shash(sbi->s_chksum_driver);
kfree(sbi->raw_super); kfree(sbi->raw_super);
destroy_device_list(sbi);
f2fs_destroy_page_array_cache(sbi); f2fs_destroy_page_array_cache(sbi);
f2fs_destroy_xattr_caches(sbi); f2fs_destroy_xattr_caches(sbi);
mempool_destroy(sbi->write_io_dummy); mempool_destroy(sbi->write_io_dummy);
...@@ -1738,7 +1736,6 @@ static void f2fs_put_super(struct super_block *sb) ...@@ -1738,7 +1736,6 @@ static void f2fs_put_super(struct super_block *sb)
#if IS_ENABLED(CONFIG_UNICODE) #if IS_ENABLED(CONFIG_UNICODE)
utf8_unload(sb->s_encoding); utf8_unload(sb->s_encoding);
#endif #endif
kfree(sbi);
} }
int f2fs_sync_fs(struct super_block *sb, int sync) 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, ...@@ -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) 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); set_sbi_flag(sbi, SBI_IS_CLOSE);
f2fs_stop_gc_thread(sbi); f2fs_stop_gc_thread(sbi);
f2fs_stop_discard_thread(sbi); f2fs_stop_discard_thread(sbi);
...@@ -4931,6 +4928,12 @@ static void kill_f2fs_super(struct super_block *sb) ...@@ -4931,6 +4928,12 @@ static void kill_f2fs_super(struct super_block *sb)
sb->s_flags &= ~SB_RDONLY; sb->s_flags &= ~SB_RDONLY;
} }
kill_block_super(sb); 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 = { static struct file_system_type f2fs_fs_type = {
......
...@@ -637,12 +637,6 @@ void generic_shutdown_super(struct super_block *sb) ...@@ -637,12 +637,6 @@ void generic_shutdown_super(struct super_block *sb)
fsnotify_sb_delete(sb); fsnotify_sb_delete(sb);
security_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) { if (sb->s_dio_done_wq) {
destroy_workqueue(sb->s_dio_done_wq); destroy_workqueue(sb->s_dio_done_wq);
sb->s_dio_done_wq = NULL; sb->s_dio_done_wq = NULL;
...@@ -651,6 +645,12 @@ void generic_shutdown_super(struct super_block *sb) ...@@ -651,6 +645,12 @@ void generic_shutdown_super(struct super_block *sb)
if (sop->put_super) if (sop->put_super)
sop->put_super(sb); 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), if (CHECK_DATA_CORRUPTION(!list_empty(&sb->s_inodes),
"VFS: Busy inodes after unmount of %s (%s)", "VFS: Busy inodes after unmount of %s (%s)",
sb->s_id, sb->s_type->name)) { sb->s_id, sb->s_type->name)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment