ubifs: use fscrypt_prepare_new_inode() and fscrypt_set_context()
Convert ubifs to use the new functions fscrypt_prepare_new_inode() and fscrypt_set_context(). Unlike ext4 and f2fs, this doesn't appear to fix any deadlock bug. But it does shorten the code slightly and get all filesystems using the same helper functions, so that fscrypt_inherit_context() can be removed. It also fixes an incorrect error code where ubifs returned EPERM instead of the expected ENOKEY. Link: https://lore.kernel.org/r/20200917041136.178600-6-ebiggers@kernel.org Signed-off-by: Eric Biggers <ebiggers@google.com>
This commit is contained in:
parent
e075b69010
commit
4c030fa887
1 changed files with 16 additions and 22 deletions
|
@ -81,19 +81,6 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
|
|||
struct ubifs_inode *ui;
|
||||
bool encrypted = false;
|
||||
|
||||
if (IS_ENCRYPTED(dir)) {
|
||||
err = fscrypt_get_encryption_info(dir);
|
||||
if (err) {
|
||||
ubifs_err(c, "fscrypt_get_encryption_info failed: %i", err);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
if (!fscrypt_has_encryption_key(dir))
|
||||
return ERR_PTR(-EPERM);
|
||||
|
||||
encrypted = true;
|
||||
}
|
||||
|
||||
inode = new_inode(c->vfs_sb);
|
||||
ui = ubifs_inode(inode);
|
||||
if (!inode)
|
||||
|
@ -112,6 +99,12 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
|
|||
current_time(inode);
|
||||
inode->i_mapping->nrpages = 0;
|
||||
|
||||
err = fscrypt_prepare_new_inode(dir, inode, &encrypted);
|
||||
if (err) {
|
||||
ubifs_err(c, "fscrypt_prepare_new_inode failed: %i", err);
|
||||
goto out_iput;
|
||||
}
|
||||
|
||||
switch (mode & S_IFMT) {
|
||||
case S_IFREG:
|
||||
inode->i_mapping->a_ops = &ubifs_file_address_operations;
|
||||
|
@ -131,7 +124,6 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
|
|||
case S_IFBLK:
|
||||
case S_IFCHR:
|
||||
inode->i_op = &ubifs_file_inode_operations;
|
||||
encrypted = false;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
|
@ -151,9 +143,8 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
|
|||
if (c->highest_inum >= INUM_WATERMARK) {
|
||||
spin_unlock(&c->cnt_lock);
|
||||
ubifs_err(c, "out of inode numbers");
|
||||
make_bad_inode(inode);
|
||||
iput(inode);
|
||||
return ERR_PTR(-EINVAL);
|
||||
err = -EINVAL;
|
||||
goto out_iput;
|
||||
}
|
||||
ubifs_warn(c, "running out of inode numbers (current %lu, max %u)",
|
||||
(unsigned long)c->highest_inum, INUM_WATERMARK);
|
||||
|
@ -171,16 +162,19 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
|
|||
spin_unlock(&c->cnt_lock);
|
||||
|
||||
if (encrypted) {
|
||||
err = fscrypt_inherit_context(dir, inode, &encrypted, true);
|
||||
err = fscrypt_set_context(inode, NULL);
|
||||
if (err) {
|
||||
ubifs_err(c, "fscrypt_inherit_context failed: %i", err);
|
||||
make_bad_inode(inode);
|
||||
iput(inode);
|
||||
return ERR_PTR(err);
|
||||
ubifs_err(c, "fscrypt_set_context failed: %i", err);
|
||||
goto out_iput;
|
||||
}
|
||||
}
|
||||
|
||||
return inode;
|
||||
|
||||
out_iput:
|
||||
make_bad_inode(inode);
|
||||
iput(inode);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static int dbg_check_name(const struct ubifs_info *c,
|
||||
|
|
Loading…
Reference in a new issue