On Wed, Sep 23, 2020 at 01:01:51AM +0000, Daniel Rosenberg wrote: > Expand f2fs's casefolding support to include encrypted directories. To > index casefolded+encrypted directories, we use the SipHash of the > casefolded name, keyed by a key derived from the directory's fscrypt > master key. This ensures that the dirhash doesn't leak information > about the plaintext filenames. > > Encryption keys are unavailable during roll-forward recovery, so we > can't compute the dirhash when recovering a new dentry in an encrypted + > casefolded directory. To avoid having to force a checkpoint when a new > file is fsync'ed, store the dirhash on-disk appended to i_name. > > This patch incorporates work by Eric Biggers <ebiggers@xxxxxxxxxx> > and Jaegeuk Kim <jaegeuk@xxxxxxxxxx>. > > Co-developed-by: Eric Biggers <ebiggers@xxxxxxxxxx> > Signed-off-by: Eric Biggers <ebiggers@xxxxxxxxxx> > Signed-off-by: Daniel Rosenberg <drosen@xxxxxxxxxx> > --- Generally looks good. If it's needed, you can add: Reviewed-by: Eric Biggers <ebiggers@xxxxxxxxxx> (Though, some may claim I can't give Reviewed-by since this patch already has my Co-developed-by.) One comment below, though: > @@ -218,9 +219,28 @@ static bool f2fs_match_ci_name(const struct inode *dir, const struct qstr *name, > { > const struct super_block *sb = dir->i_sb; > const struct unicode_map *um = sb->s_encoding; > + struct fscrypt_str decrypted_name = FSTR_INIT(NULL, de_name_len); > struct qstr entry = QSTR_INIT(de_name, de_name_len); > int res; > > + if (IS_ENCRYPTED(dir)) { > + const struct fscrypt_str encrypted_name = > + FSTR_INIT((u8 *)de_name, de_name_len); > + > + if (WARN_ON_ONCE(!fscrypt_has_encryption_key(dir))) > + return false; > + > + decrypted_name.name = kmalloc(de_name_len, GFP_KERNEL); > + if (!decrypted_name.name) > + return false; > + res = fscrypt_fname_disk_to_usr(dir, 0, 0, &encrypted_name, > + &decrypted_name); > + if (res < 0) > + goto out; We probably should be passing up errors from here to f2fs_match_name(), then to f2fs_find_target_dentry(), then to f2fs_find_in_inline_dir() or find_in_block(). Ignoring the filename may be okay if fscrypt_fname_disk_to_usr() returns -EUCLEAN, indicating that it's invalid. However, if the error is -ENOMEM, either from the kmalloc() or from fscrypt_fname_disk_to_usr(), then the caller should receive an error rather than the filename being ignored. - Eric