* [PATCH 1/5] mkfs.f2fs: set encryption feature @ 2015-05-09 4:24 Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 2/5] fsck.f2fs: show superblock features and encryption info Jaegeuk Kim ` (3 more replies) 0 siblings, 4 replies; 5+ messages in thread From: Jaegeuk Kim @ 2015-05-09 4:24 UTC (permalink / raw) To: linux-f2fs-devel; +Cc: Jaegeuk Kim This patch add to support encryption feature. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- include/f2fs_fs.h | 7 +++++++ mkfs/f2fs_format.c | 2 ++ mkfs/f2fs_format_main.c | 16 +++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index d23ae1b..6aefa5d 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -251,6 +251,7 @@ struct f2fs_configuration { int fix_on; int bug_on; int auto_fix; + __le32 feature; /* defined features */ } __attribute__((packed)); #ifdef CONFIG_64BIT @@ -315,6 +316,8 @@ enum { #define MAX_ACTIVE_NODE_LOGS 8 #define MAX_ACTIVE_DATA_LOGS 8 +#define F2FS_FEATURE_ENCRYPT 0x0001 + /* * For superblock */ @@ -353,6 +356,10 @@ struct f2fs_super_block { __le32 cp_payload; __u8 version[VERSION_LEN]; /* the kernel version */ __u8 init_version[VERSION_LEN]; /* the initial kernel version */ + __le32 feature; /* defined features */ + __u8 encryption_level; /* versioning level for encryption */ + __u8 encrypt_pw_salt[16]; /* Salt used for string2key algorithm */ + __u8 reserved[871]; /* valid reserved region */ } __attribute__((packed)); /* diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c index 094afa3..f879bca 100644 --- a/mkfs/f2fs_format.c +++ b/mkfs/f2fs_format.c @@ -364,6 +364,8 @@ static int f2fs_prepare_super_block(void) memcpy(sb.version, config.version, VERSION_LEN); memcpy(sb.init_version, config.version, VERSION_LEN); + sb.feature = config.feature; + return 0; } diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c index 9a96798..5a9e7e2 100644 --- a/mkfs/f2fs_format_main.c +++ b/mkfs/f2fs_format_main.c @@ -33,6 +33,7 @@ static void mkfs_usage() MSG(0, " -e [extension list] e.g. \"mp3,gif,mov\"\n"); MSG(0, " -l label\n"); MSG(0, " -o overprovision ratio [default:5]\n"); + MSG(0, " -O set feature\n"); MSG(0, " -q quiet mode\n"); MSG(0, " -s # of segments per section [default:1]\n"); MSG(0, " -z # of sections per zone [default:1]\n"); @@ -61,9 +62,19 @@ static void f2fs_show_info() MSG(0, "Info: Trim is %s\n", config.trim ? "enabled": "disabled"); } +static void parse_feature(char *features) +{ + if (!strcmp(features, "encrypt")) { + config.feature |= cpu_to_le32(F2FS_FEATURE_ENCRYPT); + } else { + MSG(0, "Error: Wrong features\n"); + mkfs_usage(); + } +} + static void f2fs_parse_options(int argc, char *argv[]) { - static const char *option_string = "qa:d:e:l:o:s:z:t:"; + static const char *option_string = "qa:d:e:l:o:O:s:z:t:"; int32_t option=0; while ((option = getopt(argc,argv,option_string)) != EOF) { @@ -91,6 +102,9 @@ static void f2fs_parse_options(int argc, char *argv[]) case 'o': config.overprovision = atoi(optarg); break; + case 'O': + parse_feature(strdup(optarg)); + break; case 's': config.segs_per_sec = atoi(optarg); break; -- 2.1.1 ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/5] fsck.f2fs: show superblock features and encryption info 2015-05-09 4:24 [PATCH 1/5] mkfs.f2fs: set encryption feature Jaegeuk Kim @ 2015-05-09 4:24 ` Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 3/5] dump.f2fs: show i_advise field in inode Jaegeuk Kim ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: Jaegeuk Kim @ 2015-05-09 4:24 UTC (permalink / raw) To: linux-f2fs-devel; +Cc: Jaegeuk Kim Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fsck/mount.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/fsck/mount.c b/fsck/mount.c index 1c55f40..11ab197 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -224,6 +224,23 @@ void print_cp_state(u32 flag) MSG(0, "\n"); } +void print_sb_state(struct f2fs_super_block *sb) +{ + __le32 f = sb->feature; + int i; + + MSG(0, "Info: superblock features = %x : ", f); + if (f & cpu_to_le32(F2FS_FEATURE_ENCRYPT)) { + MSG(0, "%s", " encrypt"); + } + MSG(0, "\n"); + MSG(0, "Info: superblock encrypt level = %d, salt = ", + sb->encryption_level); + for (i = 0; i < 16; i++) + MSG(0, "%02x", sb->encrypt_pw_salt[i]); + MSG(0, "\n"); +} + int sanity_check_raw_super(struct f2fs_super_block *raw_super) { unsigned int blocksize; @@ -300,6 +317,7 @@ int validate_super_block(struct f2fs_sb_info *sbi, int block) config.auto_fix = 0; config.fix_on = 1; } + print_sb_state(sbi->raw_super); return 0; } -- 2.1.1 ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/5] dump.f2fs: show i_advise field in inode 2015-05-09 4:24 [PATCH 1/5] mkfs.f2fs: set encryption feature Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 2/5] fsck.f2fs: show superblock features and encryption info Jaegeuk Kim @ 2015-05-09 4:24 ` Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 4/5] fsck.f2fs: avoid build warning Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 5/5] fsck.f2fs: add hash conversion for encrypted dentries Jaegeuk Kim 3 siblings, 0 replies; 5+ messages in thread From: Jaegeuk Kim @ 2015-05-09 4:24 UTC (permalink / raw) To: linux-f2fs-devel; +Cc: Jaegeuk Kim Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fsck/mount.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fsck/mount.c b/fsck/mount.c index 11ab197..13b73e9 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -26,6 +26,7 @@ void print_inode_info(struct f2fs_inode *inode, int name) } DISP_u32(inode, i_mode); + DISP_u32(inode, i_advise); DISP_u32(inode, i_uid); DISP_u32(inode, i_gid); DISP_u32(inode, i_links); -- 2.1.1 ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/5] fsck.f2fs: avoid build warning 2015-05-09 4:24 [PATCH 1/5] mkfs.f2fs: set encryption feature Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 2/5] fsck.f2fs: show superblock features and encryption info Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 3/5] dump.f2fs: show i_advise field in inode Jaegeuk Kim @ 2015-05-09 4:24 ` Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 5/5] fsck.f2fs: add hash conversion for encrypted dentries Jaegeuk Kim 3 siblings, 0 replies; 5+ messages in thread From: Jaegeuk Kim @ 2015-05-09 4:24 UTC (permalink / raw) To: linux-f2fs-devel; +Cc: Jaegeuk Kim Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fsck/mount.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsck/mount.c b/fsck/mount.c index 13b73e9..649940d 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -462,7 +462,7 @@ int get_valid_checkpoint(struct f2fs_sb_info *sbi) goto fail_no_cp; } - MSG(0, "Info: CKPT version = %"PRIx64"\n", version); + MSG(0, "Info: CKPT version = %llx\n", version); memcpy(sbi->ckpt, cur_page, blk_size); -- 2.1.1 ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 5/5] fsck.f2fs: add hash conversion for encrypted dentries 2015-05-09 4:24 [PATCH 1/5] mkfs.f2fs: set encryption feature Jaegeuk Kim ` (2 preceding siblings ...) 2015-05-09 4:24 ` [PATCH 4/5] fsck.f2fs: avoid build warning Jaegeuk Kim @ 2015-05-09 4:24 ` Jaegeuk Kim 3 siblings, 0 replies; 5+ messages in thread From: Jaegeuk Kim @ 2015-05-09 4:24 UTC (permalink / raw) To: linux-f2fs-devel; +Cc: Jaegeuk Kim If dentry is encrypted, we should convert its hash value. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fsck/fsck.c | 91 ++++++++++++++++++++++++++++++++++++++++--------------- fsck/fsck.h | 7 +++-- include/f2fs_fs.h | 9 ++++++ 3 files changed, 80 insertions(+), 27 deletions(-) diff --git a/fsck/fsck.c b/fsck/fsck.c index f3fbdfa..b15edbe 100644 --- a/fsck/fsck.c +++ b/fsck/fsck.c @@ -583,7 +583,8 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid, ret = fsck_chk_data_blk(sbi, le32_to_cpu(node_blk->i.i_addr[idx]), &child, (i_blocks == *blk_cnt), - ftype, nid, idx, ni->version); + ftype, nid, idx, ni->version, + file_is_encrypt(node_blk->i.i_advise)); if (!ret) { *blk_cnt = *blk_cnt + 1; } else if (config.fix_on) { @@ -695,7 +696,8 @@ int fsck_chk_dnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode, ret = fsck_chk_data_blk(sbi, le32_to_cpu(node_blk->dn.addr[idx]), child, le64_to_cpu(inode->i_blocks) == *blk_cnt, ftype, - nid, idx, ni->version); + nid, idx, ni->version, + file_is_encrypt(inode->i_advise)); if (!ret) { *blk_cnt = *blk_cnt + 1; } else if (config.fix_on) { @@ -753,16 +755,37 @@ int fsck_chk_didnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode, return 0; } +static void convert_encrypted_name(unsigned char *name, int len, + unsigned char *new, int encrypted) +{ + if (!encrypted) { + memcpy(new, name, len); + new[len] = 0; + return; + } + + while (len--) { + *new = *name++; + if (*new > 128) + *new -= 128; + if (*new < 32 || *new == 0x7f) + *new ^= 0x40; /* ^@, ^A, ^B; ^? for DEL */ + new++; + } + *new = 0; +} + static void print_dentry(__u32 depth, __u8 *name, unsigned long *bitmap, struct f2fs_dir_entry *dentry, - int max, int idx, int last_blk) + int max, int idx, int last_blk, int encrypted) { int last_de = 0; int next_idx = 0; int name_len; unsigned int i; int bit_offset; + unsigned char new[F2FS_NAME_LEN + 1]; if (config.dbg_lv != -1) return; @@ -787,25 +810,49 @@ static void print_dentry(__u32 depth, __u8 *name, if (tree_mark[depth - 1] == '`') tree_mark[depth - 1] = ' '; - for (i = 1; i < depth; i++) printf("%c ", tree_mark[i]); - printf("%c-- %s 0x%x\n", last_de ? '`' : '|', - name, le32_to_cpu(dentry[idx].ino)); + + convert_encrypted_name(name, name_len, new, encrypted); + + printf("%c-- %s <ino = 0x%x>, <encrypted (%d)>\n", + last_de ? '`' : '|', + new, le32_to_cpu(dentry[idx].ino), + encrypted); +} + +static int f2fs_check_hash_code(struct f2fs_dir_entry *dentry, + const unsigned char *name, u32 len, int encrypted) +{ + f2fs_hash_t hash_code = f2fs_dentry_hash(name, len); + + /* fix hash_code made by old buggy code */ + if (dentry->hash_code != hash_code) { + unsigned char new[F2FS_NAME_LEN + 1]; + + convert_encrypted_name((unsigned char *)name, len, + new, encrypted); + FIX_MSG("Mismatch hash_code for \"%s\" [%x:%x]", + new, le32_to_cpu(dentry->hash_code), + hash_code); + dentry->hash_code = cpu_to_le32(hash_code); + return 1; + } + return 0; } static int __chk_dentries(struct f2fs_sb_info *sbi, struct child_info *child, unsigned long *bitmap, struct f2fs_dir_entry *dentry, __u8 (*filenames)[F2FS_SLOT_LEN], - int max, int last_blk) + int max, int last_blk, int encrypted) { struct f2fs_fsck *fsck = F2FS_FSCK(sbi); enum FILE_TYPE ftype; int dentries = 0; u32 blk_cnt; u8 *name; - u32 hash_code, ino; + u32 ino; u16 name_len;; int ret = 0; int fixed = 0; @@ -875,20 +922,10 @@ static int __chk_dentries(struct f2fs_sb_info *sbi, struct child_info *child, i++; continue; } - name = calloc(name_len + 1, 1); memcpy(name, filenames[i], name_len); - hash_code = f2fs_dentry_hash((const unsigned char *)name, - name_len); slots = (name_len + F2FS_SLOT_LEN - 1) / F2FS_SLOT_LEN; - /* fix hash_code made by old buggy code */ - if (le32_to_cpu(dentry[i].hash_code) != hash_code) { - dentry[i].hash_code = hash_code; - fixed = 1; - FIX_MSG("hash_code[%d] of %s", i, name); - } - /* Becareful. 'dentry.file_type' is not imode. */ if (ftype == F2FS_FT_DIR) { if ((name[0] == '.' && name_len == 1) || @@ -901,13 +938,16 @@ static int __chk_dentries(struct f2fs_sb_info *sbi, struct child_info *child, } } + if (f2fs_check_hash_code(dentry + i, name, name_len, encrypted)) + fixed = 1; + DBG(1, "[%3u]-[0x%x] name[%s] len[0x%x] ino[0x%x] type[0x%x]\n", fsck->dentry_depth, i, name, name_len, le32_to_cpu(dentry[i].ino), dentry[i].file_type); print_dentry(fsck->dentry_depth, name, bitmap, - dentry, max, i, last_blk); + dentry, max, i, last_blk, encrypted); blk_cnt = 1; ret = fsck_chk_node_blk(sbi, @@ -951,7 +991,8 @@ int fsck_chk_inline_dentries(struct f2fs_sb_info *sbi, dentries = __chk_dentries(sbi, child, (unsigned long *)de_blk->dentry_bitmap, de_blk->dentry, de_blk->filename, - NR_INLINE_DENTRY, 1); + NR_INLINE_DENTRY, 1, + file_is_encrypt(node_blk->i.i_advise)); if (dentries < 0) { DBG(1, "[%3d] Inline Dentry Block Fixed hash_codes\n\n", fsck->dentry_depth); @@ -966,7 +1007,7 @@ int fsck_chk_inline_dentries(struct f2fs_sb_info *sbi, } int fsck_chk_dentry_blk(struct f2fs_sb_info *sbi, u32 blk_addr, - struct child_info *child, int last_blk) + struct child_info *child, int last_blk, int encrypted) { struct f2fs_fsck *fsck = F2FS_FSCK(sbi); struct f2fs_dentry_block *de_blk; @@ -982,7 +1023,7 @@ int fsck_chk_dentry_blk(struct f2fs_sb_info *sbi, u32 blk_addr, dentries = __chk_dentries(sbi, child, (unsigned long *)de_blk->dentry_bitmap, de_blk->dentry, de_blk->filename, - NR_DENTRY_IN_BLOCK, last_blk); + NR_DENTRY_IN_BLOCK, last_blk, encrypted); if (dentries < 0) { ret = dev_write_block(de_blk, blk_addr); @@ -1002,7 +1043,8 @@ int fsck_chk_dentry_blk(struct f2fs_sb_info *sbi, u32 blk_addr, int fsck_chk_data_blk(struct f2fs_sb_info *sbi, u32 blk_addr, struct child_info *child, int last_blk, - enum FILE_TYPE ftype, u32 parent_nid, u16 idx_in_node, u8 ver) + enum FILE_TYPE ftype, u32 parent_nid, u16 idx_in_node, u8 ver, + int encrypted) { struct f2fs_fsck *fsck = F2FS_FSCK(sbi); @@ -1035,7 +1077,8 @@ int fsck_chk_data_blk(struct f2fs_sb_info *sbi, u32 blk_addr, if (ftype == F2FS_FT_DIR) { f2fs_set_main_bitmap(sbi, blk_addr, CURSEG_HOT_DATA); - return fsck_chk_dentry_blk(sbi, blk_addr, child, last_blk); + return fsck_chk_dentry_blk(sbi, blk_addr, child, + last_blk, encrypted); } else { f2fs_set_main_bitmap(sbi, blk_addr, CURSEG_WARM_DATA); } diff --git a/fsck/fsck.h b/fsck/fsck.h index 5eac45c..37a25ba 100644 --- a/fsck/fsck.h +++ b/fsck/fsck.h @@ -87,7 +87,8 @@ enum seg_type { extern void fsck_chk_orphan_node(struct f2fs_sb_info *); extern int fsck_chk_node_blk(struct f2fs_sb_info *, struct f2fs_inode *, u32, - u8 *, enum FILE_TYPE, enum NODE_TYPE, u32 *, struct child_info *); + u8 *, enum FILE_TYPE, enum NODE_TYPE, u32 *, + struct child_info *); extern void fsck_chk_inode_blk(struct f2fs_sb_info *, u32, enum FILE_TYPE, struct f2fs_node *, u32 *, struct node_info *); extern int fsck_chk_dnode_blk(struct f2fs_sb_info *, struct f2fs_inode *, @@ -98,9 +99,9 @@ extern int fsck_chk_idnode_blk(struct f2fs_sb_info *, struct f2fs_inode *, extern int fsck_chk_didnode_blk(struct f2fs_sb_info *, struct f2fs_inode *, enum FILE_TYPE, struct f2fs_node *, u32 *, struct child_info *); extern int fsck_chk_data_blk(struct f2fs_sb_info *sbi, u32, struct child_info *, - int, enum FILE_TYPE, u32, u16, u8); + int, enum FILE_TYPE, u32, u16, u8, int); extern int fsck_chk_dentry_blk(struct f2fs_sb_info *, u32, struct child_info *, - int); + int, int); int fsck_chk_inline_dentries(struct f2fs_sb_info *, struct f2fs_node *, struct child_info *); diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index 6aefa5d..59cc0d1 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -453,6 +453,15 @@ struct f2fs_extent { #define DEF_DIR_LEVEL 0 +/* + * i_advise uses FADVISE_XXX_BIT. We can add additional hints later. + */ +#define FADVISE_COLD_BIT 0x01 +#define FADVISE_LOST_PINO_BIT 0x02 +#define FADVISE_ENCRYPT_BIT 0x04 + +#define file_is_encrypt(i_advise) ((i_advise) & FADVISE_ENCRYPT_BIT) + struct f2fs_inode { __le16 i_mode; /* file mode */ __u8 i_advise; /* file hints */ -- 2.1.1 ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-05-09 4:25 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-05-09 4:24 [PATCH 1/5] mkfs.f2fs: set encryption feature Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 2/5] fsck.f2fs: show superblock features and encryption info Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 3/5] dump.f2fs: show i_advise field in inode Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 4/5] fsck.f2fs: avoid build warning Jaegeuk Kim 2015-05-09 4:24 ` [PATCH 5/5] fsck.f2fs: add hash conversion for encrypted dentries Jaegeuk Kim
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).