Hi, Jaegeuk

On 2018/4/20 4:54, Jaegeuk Kim wrote:
> This patch add -O features for fsck.f2fs in order to tune the feature bits.
> Currently, it supports -O encrypt only.
> 

Shall we introduce a new tool like tune.f2fs to tune the parameters of f2fs?
Maybe we will tune others parameters in the future, not only features bits in 
sb :)

> Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org>
> ---
>  fsck/fsck.h   |  1 +
>  fsck/main.c   |  9 ++++++++-
>  fsck/mount.c  | 39 ++++++++++++++++++++++++++++++++++++++-
>  fsck/resize.c | 18 +-----------------
>  4 files changed, 48 insertions(+), 19 deletions(-)
> 
> diff --git a/fsck/fsck.h b/fsck/fsck.h
> index 8e133fa..3e13fc6 100644
> --- a/fsck/fsck.h
> +++ b/fsck/fsck.h
> @@ -176,6 +176,7 @@ extern void move_curseg_info(struct f2fs_sb_info *, u64);
>  extern void write_curseg_info(struct f2fs_sb_info *);
>  extern int find_next_free_block(struct f2fs_sb_info *, u64 *, int, int);
>  extern void write_checkpoint(struct f2fs_sb_info *);
> +extern void write_superblock(struct f2fs_super_block *);
>  extern void update_data_blkaddr(struct f2fs_sb_info *, nid_t, u16, block_t);
>  extern void update_nat_blkaddr(struct f2fs_sb_info *, nid_t, nid_t, block_t);
>  
> diff --git a/fsck/main.c b/fsck/main.c
> index 9256d21..c4dd8b1 100644
> --- a/fsck/main.c
> +++ b/fsck/main.c
> @@ -28,6 +28,8 @@ struct f2fs_fsck gfsck;
>  extern struct sparse_file *f2fs_sparse_file;
>  #endif
>  
> +INIT_FEATURE_TABLE;
> +
>  static char *absolute_path(const char *file)
>  {
>       char *ret;
> @@ -54,6 +56,7 @@ void fsck_usage()
>       MSG(0, "  -d debug level [default:0]\n");
>       MSG(0, "  -f check/fix entire partition\n");
>       MSG(0, "  -g add default options\n");
> +     MSG(0, "  -O feature1[feature2,feature3,...] e.g. \"encrypt\"\n");
>       MSG(0, "  -p preen mode [default:0 the same as -a [0|1]]\n");
>       MSG(0, "  -S sparse_mode\n");
>       MSG(0, "  -t show directory tree\n");
> @@ -180,7 +183,7 @@ void f2fs_parse_options(int argc, char *argv[])
>       }
>  
>       if (!strcmp("fsck.f2fs", prog)) {
> -             const char *option_string = ":ad:fg:p:q:StyV";
> +             const char *option_string = ":ad:fg:O:p:q:StyV";
>               int opt = 0;
>               struct option long_opt[] = {
>                       {"dry-run", no_argument, 0, 1},
> @@ -203,6 +206,10 @@ void f2fs_parse_options(int argc, char *argv[])
>                               if (!strcmp(optarg, "android"))
>                                       c.defset = CONF_ANDROID;
>                               break;
> +                     case 'O':
> +                             if (parse_feature(feature_table, optarg))
> +                                     fsck_usage();
> +                             break;
>                       case 'p':
>                               /* preen mode has different levels:
>                                *  0: default level, the same as -a
> diff --git a/fsck/mount.c b/fsck/mount.c
> index e5574c5..b374b46 100644
> --- a/fsck/mount.c
> +++ b/fsck/mount.c
> @@ -2144,6 +2144,22 @@ void write_checkpoint(struct f2fs_sb_info *sbi)
>       ASSERT(ret >= 0);
>  }
>  
> +void write_superblock(struct f2fs_super_block *new_sb)
> +{
> +     int index, ret;
> +     u_int8_t *buf;
> +
> +     buf = calloc(BLOCK_SZ, 1);
> +
> +     memcpy(buf + F2FS_SUPER_OFFSET, new_sb, sizeof(*new_sb));
> +     for (index = 0; index < 2; index++) {
> +             ret = dev_write_block(buf, index);
> +             ASSERT(ret >= 0);
> +     }
> +     free(buf);
> +     DBG(0, "Info: Done to rebuild superblock\n");
> +}
> +
>  void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
>  {
>       struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
> @@ -2314,6 +2330,26 @@ static int check_sector_size(struct f2fs_super_block 
> *sb)
>       return 0;
>  }
>  
> +static void tune_sb_features(struct f2fs_sb_info *sbi)
> +{
> +     int sb_changed = 0;
> +     struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
> +
> +     if (!(sb->feature & cpu_to_le32(F2FS_FEATURE_ENCRYPT)) &&
> +                     c.feature & cpu_to_le32(F2FS_FEATURE_ENCRYPT)) {
> +             sb->feature |= cpu_to_le32(F2FS_FEATURE_ENCRYPT);
> +             MSG(0, "Info: Set Encryption feature\n");
> +             sb_changed = 1;
> +     }
> +     /* TODO: quota needs to allocate inode numbers */
> +
> +     c.feature = sb->feature;
> +     if (!sb_changed)
> +             return;
> +
> +     write_superblock(sb);
> +}
> +
>  int f2fs_do_mount(struct f2fs_sb_info *sbi)
>  {
>       struct f2fs_checkpoint *cp = NULL;
> @@ -2365,7 +2401,8 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
>       }
>  
>       c.bug_on = 0;
> -     c.feature = sb->feature;
> +
> +     tune_sb_features(sbi);
>  
>       /* precompute checksum seed for metadata */
>       if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM))
> diff --git a/fsck/resize.c b/fsck/resize.c
> index 019da71..d285dd7 100644
> --- a/fsck/resize.c
> +++ b/fsck/resize.c
> @@ -569,22 +569,6 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
>       DBG(0, "Info: Done to rebuild checkpoint blocks\n");
>  }
>  
> -static void rebuild_superblock(struct f2fs_super_block *new_sb)
> -{
> -     int index, ret;
> -     u_int8_t *buf;
> -
> -     buf = calloc(BLOCK_SZ, 1);
> -
> -     memcpy(buf + F2FS_SUPER_OFFSET, new_sb, sizeof(*new_sb));
> -     for (index = 0; index < 2; index++) {
> -             ret = dev_write_block(buf, index);
> -             ASSERT(ret >= 0);
> -     }
> -     free(buf);
> -     DBG(0, "Info: Done to rebuild superblock\n");
> -}
> -
>  int f2fs_resize(struct f2fs_sb_info *sbi)
>  {
>       struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
> @@ -636,6 +620,6 @@ int f2fs_resize(struct f2fs_sb_info *sbi)
>       migrate_nat(sbi, new_sb);
>       migrate_sit(sbi, new_sb, offset_seg);
>       rebuild_checkpoint(sbi, new_sb, offset_seg);
> -     rebuild_superblock(new_sb);
> +     write_superblock(new_sb);
>       return 0;
>  }
> 



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to