mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
ext4: refactor and move ext4_ioctl_get_encryption_pwsalt()
This patch move code for FS_IOC_GET_ENCRYPTION_PWSALT case into ext4's crypto.c file, i.e. ext4_ioctl_get_encryption_pwsalt() and uuid_is_zero(). This is mostly refactoring logic and should not affect any functionality change. Suggested-by: Eric Biggers <ebiggers@google.com> Reviewed-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Ritesh Harjani <ritesh.list@gmail.com> Link: https://lore.kernel.org/r/5af98b17152a96b245b4f7d2dfb8607fc93e36aa.1652595565.git.ritesh.list@gmail.com Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
3030b59c85
commit
72f63f4a77
3 changed files with 64 additions and 57 deletions
|
@ -1,6 +1,7 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
#include <linux/quotaops.h>
|
#include <linux/quotaops.h>
|
||||||
|
#include <linux/uuid.h>
|
||||||
|
|
||||||
#include "ext4.h"
|
#include "ext4.h"
|
||||||
#include "xattr.h"
|
#include "xattr.h"
|
||||||
|
@ -71,6 +72,59 @@ void ext4_fname_free_filename(struct ext4_filename *fname)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool uuid_is_zero(__u8 u[16])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
if (u[i])
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ext4_ioctl_get_encryption_pwsalt(struct file *filp, void __user *arg)
|
||||||
|
{
|
||||||
|
struct super_block *sb = file_inode(filp)->i_sb;
|
||||||
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||||
|
int err, err2;
|
||||||
|
handle_t *handle;
|
||||||
|
|
||||||
|
if (!ext4_has_feature_encrypt(sb))
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
if (uuid_is_zero(sbi->s_es->s_encrypt_pw_salt)) {
|
||||||
|
err = mnt_want_write_file(filp);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
handle = ext4_journal_start_sb(sb, EXT4_HT_MISC, 1);
|
||||||
|
if (IS_ERR(handle)) {
|
||||||
|
err = PTR_ERR(handle);
|
||||||
|
goto pwsalt_err_exit;
|
||||||
|
}
|
||||||
|
err = ext4_journal_get_write_access(handle, sb, sbi->s_sbh,
|
||||||
|
EXT4_JTR_NONE);
|
||||||
|
if (err)
|
||||||
|
goto pwsalt_err_journal;
|
||||||
|
lock_buffer(sbi->s_sbh);
|
||||||
|
generate_random_uuid(sbi->s_es->s_encrypt_pw_salt);
|
||||||
|
ext4_superblock_csum_set(sb);
|
||||||
|
unlock_buffer(sbi->s_sbh);
|
||||||
|
err = ext4_handle_dirty_metadata(handle, NULL, sbi->s_sbh);
|
||||||
|
pwsalt_err_journal:
|
||||||
|
err2 = ext4_journal_stop(handle);
|
||||||
|
if (err2 && !err)
|
||||||
|
err = err2;
|
||||||
|
pwsalt_err_exit:
|
||||||
|
mnt_drop_write_file(filp);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (copy_to_user(arg, sbi->s_es->s_encrypt_pw_salt, 16))
|
||||||
|
return -EFAULT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int ext4_get_context(struct inode *inode, void *ctx, size_t len)
|
static int ext4_get_context(struct inode *inode, void *ctx, size_t len)
|
||||||
{
|
{
|
||||||
return ext4_xattr_get(inode, EXT4_XATTR_INDEX_ENCRYPTION,
|
return ext4_xattr_get(inode, EXT4_XATTR_INDEX_ENCRYPTION,
|
||||||
|
|
|
@ -2745,6 +2745,8 @@ int ext4_fname_prepare_lookup(struct inode *dir, struct dentry *dentry,
|
||||||
|
|
||||||
void ext4_fname_free_filename(struct ext4_filename *fname);
|
void ext4_fname_free_filename(struct ext4_filename *fname);
|
||||||
|
|
||||||
|
int ext4_ioctl_get_encryption_pwsalt(struct file *filp, void __user *arg);
|
||||||
|
|
||||||
#else /* !CONFIG_FS_ENCRYPTION */
|
#else /* !CONFIG_FS_ENCRYPTION */
|
||||||
static inline int ext4_fname_setup_filename(struct inode *dir,
|
static inline int ext4_fname_setup_filename(struct inode *dir,
|
||||||
const struct qstr *iname,
|
const struct qstr *iname,
|
||||||
|
@ -2777,6 +2779,12 @@ static inline void ext4_fname_free_filename(struct ext4_filename *fname)
|
||||||
fname->cf_name.name = NULL;
|
fname->cf_name.name = NULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int ext4_ioctl_get_encryption_pwsalt(struct file *filp,
|
||||||
|
void __user *arg)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
#endif /* !CONFIG_FS_ENCRYPTION */
|
#endif /* !CONFIG_FS_ENCRYPTION */
|
||||||
|
|
||||||
/* dir.c */
|
/* dir.c */
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#include <linux/file.h>
|
#include <linux/file.h>
|
||||||
#include <linux/quotaops.h>
|
#include <linux/quotaops.h>
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/uuid.h>
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/iversion.h>
|
#include <linux/iversion.h>
|
||||||
|
@ -504,18 +503,6 @@ journal_err_out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FS_ENCRYPTION
|
|
||||||
static int uuid_is_zero(__u8 u[16])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
if (u[i])
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If immutable is set and we are not clearing it, we're not allowed to change
|
* If immutable is set and we are not clearing it, we're not allowed to change
|
||||||
* anything else in the inode. Don't error out if we're only trying to set
|
* anything else in the inode. Don't error out if we're only trying to set
|
||||||
|
@ -1432,51 +1419,9 @@ resizefs_out:
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
return fscrypt_ioctl_set_policy(filp, (const void __user *)arg);
|
return fscrypt_ioctl_set_policy(filp, (const void __user *)arg);
|
||||||
|
|
||||||
case FS_IOC_GET_ENCRYPTION_PWSALT: {
|
case FS_IOC_GET_ENCRYPTION_PWSALT:
|
||||||
#ifdef CONFIG_FS_ENCRYPTION
|
return ext4_ioctl_get_encryption_pwsalt(filp, (void __user *)arg);
|
||||||
int err, err2;
|
|
||||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
|
||||||
handle_t *handle;
|
|
||||||
|
|
||||||
if (!ext4_has_feature_encrypt(sb))
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
if (uuid_is_zero(sbi->s_es->s_encrypt_pw_salt)) {
|
|
||||||
err = mnt_want_write_file(filp);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
handle = ext4_journal_start_sb(sb, EXT4_HT_MISC, 1);
|
|
||||||
if (IS_ERR(handle)) {
|
|
||||||
err = PTR_ERR(handle);
|
|
||||||
goto pwsalt_err_exit;
|
|
||||||
}
|
|
||||||
err = ext4_journal_get_write_access(handle, sb,
|
|
||||||
sbi->s_sbh,
|
|
||||||
EXT4_JTR_NONE);
|
|
||||||
if (err)
|
|
||||||
goto pwsalt_err_journal;
|
|
||||||
lock_buffer(sbi->s_sbh);
|
|
||||||
generate_random_uuid(sbi->s_es->s_encrypt_pw_salt);
|
|
||||||
ext4_superblock_csum_set(sb);
|
|
||||||
unlock_buffer(sbi->s_sbh);
|
|
||||||
err = ext4_handle_dirty_metadata(handle, NULL,
|
|
||||||
sbi->s_sbh);
|
|
||||||
pwsalt_err_journal:
|
|
||||||
err2 = ext4_journal_stop(handle);
|
|
||||||
if (err2 && !err)
|
|
||||||
err = err2;
|
|
||||||
pwsalt_err_exit:
|
|
||||||
mnt_drop_write_file(filp);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if (copy_to_user((void __user *) arg,
|
|
||||||
sbi->s_es->s_encrypt_pw_salt, 16))
|
|
||||||
return -EFAULT;
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
case FS_IOC_GET_ENCRYPTION_POLICY:
|
case FS_IOC_GET_ENCRYPTION_POLICY:
|
||||||
if (!ext4_has_feature_encrypt(sb))
|
if (!ext4_has_feature_encrypt(sb))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue