dump/fsck: convert encrypted file name

If fscrypt is enabled, we need to convert the encrypted file name before
printing it. So let's export convert_encrypted_name for other functions,
and make it returns the length of converted string.
This patch also changes the parameter of file_is_encrypt to f2fs_inode.

Signed-off-by: Sheng Yong <shengyong1@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Sheng Yong 2016-10-24 10:16:03 +08:00 committed by Jaegeuk Kim
parent b0a2386089
commit c4c65265da
5 changed files with 45 additions and 20 deletions

View File

@ -353,9 +353,10 @@ static void dump_file(struct f2fs_sb_info *sbi, struct node_info *ni,
struct f2fs_inode *inode = &node_blk->i;
u32 imode = le32_to_cpu(inode->i_mode);
u32 namelen = le32_to_cpu(inode->i_namelen);
char name[255] = {0};
unsigned char name[F2FS_NAME_LEN + 1] = {0};
char path[1024] = {0};
char ans[255] = {0};
int is_encrypt = file_is_encrypt(inode);
int ret;
if (!S_ISREG(imode) || namelen == 0 || namelen > F2FS_NAME_LEN) {
@ -375,7 +376,8 @@ dump:
ASSERT(ret >= 0);
/* make a file */
strncpy(name, (const char *)inode->i_name, namelen);
namelen = convert_encrypted_name(inode->i_name, namelen,
name, is_encrypt);
name[namelen] = 0;
sprintf(path, "./lost_found/%s", name);

View File

@ -426,8 +426,19 @@ static int sanity_check_nid(struct f2fs_sb_info *sbi, u32 nid,
if (ntype == TYPE_INODE && ftype == F2FS_FT_DIR) {
u32 len = le32_to_cpu(node_blk->i.i_namelen);
if (name && memcmp(name, node_blk->i.i_name, len)) {
ASSERT_MSG("mismatch name [0x%x] [%s vs. %s]",
nid, name, node_blk->i.i_name);
int is_encrypt = file_is_encrypt(&node_blk->i);
unsigned char en1[F2FS_NAME_LEN + 1];
unsigned char en2[F2FS_NAME_LEN + 1];
/* if file is encrypted, its parent must be encrypted */
int len1 = convert_encrypted_name(name, len, en1,
is_encrypt);
int len2 = convert_encrypted_name(node_blk->i.i_name,
len, en2, is_encrypt);
en1[len1] = '\0';
en2[len2] = '\0';
ASSERT_MSG("mismatch name [0x%x] [%s vs. %s]%s",
nid, en1, en2,
is_encrypt ? " <encrypted>" : "");
return -EINVAL;
}
}
@ -607,6 +618,8 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
u32 i_links = le32_to_cpu(node_blk->i.i_links);
u64 i_size = le64_to_cpu(node_blk->i.i_size);
u64 i_blocks = le64_to_cpu(node_blk->i.i_blocks);
unsigned char en[F2FS_NAME_LEN + 1];
int namelen;
unsigned int idx = 0;
int need_fix = 0;
int ret;
@ -727,7 +740,7 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
blkaddr,
&child, (i_blocks == *blk_cnt),
ftype, nid, idx, ni->version,
file_is_encrypt(node_blk->i.i_advise));
file_is_encrypt(&node_blk->i));
if (!ret) {
*blk_cnt = *blk_cnt + 1;
} else if (c.fix_on) {
@ -798,16 +811,18 @@ check:
}
}
skip_blkcnt_fix:
namelen = convert_encrypted_name(node_blk->i.i_name,
le32_to_cpu(node_blk->i.i_namelen),
en, file_is_encrypt(&node_blk->i));
en[namelen] = '\0';
if (ftype == F2FS_FT_ORPHAN)
DBG(1, "Orphan Inode: 0x%x [%s] i_blocks: %u\n\n",
le32_to_cpu(node_blk->footer.ino),
node_blk->i.i_name,
(u32)i_blocks);
en, (u32)i_blocks);
if (ftype == F2FS_FT_DIR) {
DBG(1, "Directory Inode: 0x%x [%s] depth: %d has %d files\n\n",
le32_to_cpu(node_blk->footer.ino),
node_blk->i.i_name,
le32_to_cpu(node_blk->footer.ino), en,
le32_to_cpu(node_blk->i.i_current_depth),
child.files);
@ -883,7 +898,7 @@ int fsck_chk_dnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode,
blkaddr, child,
le64_to_cpu(inode->i_blocks) == *blk_cnt, ftype,
nid, idx, ni->version,
file_is_encrypt(inode->i_advise));
file_is_encrypt(inode));
if (!ret) {
*blk_cnt = *blk_cnt + 1;
} else if (c.fix_on) {
@ -1009,17 +1024,17 @@ static int digest_encode(const char *src, int len, char *dst)
return cp - dst;
}
static void convert_encrypted_name(unsigned char *name, int len,
int convert_encrypted_name(unsigned char *name, int len,
unsigned char *new, int encrypted)
{
if (!encrypted) {
memcpy(new, name, len);
new[len] = 0;
return;
return len;
}
*new = '_';
digest_encode((const char *)name, 24, (char *)new + 1);
return digest_encode((const char *)name, 24, (char *)new + 1);
}
static void print_dentry(__u32 depth, __u8 *name,
@ -1220,7 +1235,8 @@ static int __chk_dentries(struct f2fs_sb_info *sbi, struct child_info *child,
int dentries = 0;
u32 blk_cnt;
u8 *name;
u16 name_len;;
unsigned char en[F2FS_NAME_LEN + 1];
u16 name_len, en_len;
int ret = 0;
int fixed = 0;
int i, slots;
@ -1332,8 +1348,10 @@ static int __chk_dentries(struct f2fs_sb_info *sbi, struct child_info *child,
f2fs_check_dirent_position(name, name_len, child->pgofs,
child->dir_level, child->p_ino);
en_len = convert_encrypted_name(name, name_len, en, encrypted);
en[en_len] = '\0';
DBG(1, "[%3u]-[0x%x] name[%s] len[0x%x] ino[0x%x] type[0x%x]\n",
fsck->dentry_depth, i, name, name_len,
fsck->dentry_depth, i, en, name_len,
le32_to_cpu(dentry[i].ino),
dentry[i].file_type);
@ -1383,7 +1401,7 @@ int fsck_chk_inline_dentries(struct f2fs_sb_info *sbi,
de_blk->dentry_bitmap,
de_blk->dentry, de_blk->filename,
NR_INLINE_DENTRY, 1,
file_is_encrypt(node_blk->i.i_advise));
file_is_encrypt(&node_blk->i));
if (dentries < 0) {
DBG(1, "[%3d] Inline Dentry Block Fixed hash_codes\n\n",
fsck->dentry_depth);

View File

@ -130,6 +130,7 @@ extern int fsck_chk_dentry_blk(struct f2fs_sb_info *, u32, struct child_info *,
int fsck_chk_inline_dentries(struct f2fs_sb_info *, struct f2fs_node *,
struct child_info *);
int fsck_chk_meta(struct f2fs_sb_info *sbi);
int convert_encrypted_name(unsigned char *, int, unsigned char *, int);
extern void update_free_segments(struct f2fs_sb_info *);
void print_cp_state(u32);

View File

@ -37,12 +37,17 @@ void update_free_segments(struct f2fs_sb_info *sbi)
void print_inode_info(struct f2fs_inode *inode, int name)
{
unsigned char en[F2FS_NAME_LEN + 1];
unsigned int i = 0;
int namelen = le32_to_cpu(inode->i_namelen);
int is_encrypt = file_is_encrypt(inode);
namelen = convert_encrypted_name(inode->i_name, namelen, en, is_encrypt);
en[namelen] = '\0';
if (name && namelen) {
inode->i_name[namelen] = '\0';
MSG(0, " - File name : %s\n", inode->i_name);
MSG(0, " - File name : %s%s\n", en,
is_encrypt ? " <encrypted>" : "");
setlocale(LC_ALL, "");
MSG(0, " - File size : %'llu (bytes)\n",
le64_to_cpu(inode->i_size));
@ -74,8 +79,7 @@ void print_inode_info(struct f2fs_inode *inode, int name)
if (namelen) {
DISP_u32(inode, i_namelen);
inode->i_name[namelen] = '\0';
DISP_utf(inode, i_name);
printf("%-30s\t\t[%s]\n", "i_name", en);
}
printf("i_ext: fofs:%x blkaddr:%x len:%x\n",

View File

@ -606,7 +606,7 @@ struct f2fs_extent {
#define FADVISE_LOST_PINO_BIT 0x02
#define FADVISE_ENCRYPT_BIT 0x04
#define file_is_encrypt(i_advise) ((i_advise) & FADVISE_ENCRYPT_BIT)
#define file_is_encrypt(fi) ((fi)->i_advise & FADVISE_ENCRYPT_BIT)
struct f2fs_inode {
__le16 i_mode; /* file mode */