On 07/01, Chao Yu wrote:
> Hi all,
> 
> I think code in this patch is clear, not sure about the comments,
> Jaegeuk, any comments on this patch, Fengnan has pinged many times....
> 
> Let me know, if you are too busy to review this patch these days.

I reviewed it, and looks good to me. Merged in -dev.

> 
> Thanks
> 
> On 2021/7/1 11:30, Fengnan Chang wrote:
> > Hi chao & jaegeuk:
> >      Any comments about this version? It's have been a while,are you not
> > agree with this patch?  Pelase give me some feedback.
> > 
> > Thanks
> > 
> > On 2021/6/21 11:37, Fengnan Chang wrote:
> > > Hi chao & jaegeuk:
> > >     Any comments about this version?
> > > 
> > > Thanks.
> > > 
> > > On 2021/6/8 19:15, Fengnan Chang wrote:
> > > > When we create a directory with enable compression, all file write into
> > > > directory will try to compress.But sometimes we may know, new file
> > > > cannot meet compression ratio requirements.
> > > > We need a nocompress extension to skip those files to avoid unnecessary
> > > > compress page test.
> > > > 
> > > > After add nocompress_extension, the priority should be:
> > > > dir_flag < comp_extention,nocompress_extension < comp_file_flag,
> > > > no_comp_file_flag.
> > > > 
> > > > Priority in between FS_COMPR_FL, FS_NOCOMP_FS, extensions:
> > > >      * compress_extension=so; nocompress_extension=zip; chattr +c dir;
> > > >        touch dir/foo.so; touch dir/bar.zip; touch dir/baz.txt; then 
> > > > foo.so
> > > >        and baz.txt should be compresse, bar.zip should be 
> > > > non-compressed.
> > > >        chattr +c dir/bar.zip can enable compress on bar.zip.
> > > >      * compress_extension=so; nocompress_extension=zip; chattr -c dir;
> > > >        touch dir/foo.so; touch dir/bar.zip; touch dir/baz.txt; then 
> > > > foo.so
> > > >        should be compresse, bar.zip and baz.txt should be 
> > > > non-compressed.
> > > >        chattr+c dir/bar.zip; chattr+c dir/baz.txt; can enable compress 
> > > > on
> > > >        bar.zip and baz.txt.
> > > > 
> > > > Signed-off-by: Fengnan Chang <[email protected]>
> > > > ---
> > > >    Documentation/filesystems/f2fs.rst | 31 +++++++++++-
> > > >    fs/f2fs/f2fs.h                     |  2 +
> > > >    fs/f2fs/namei.c                    | 18 +++++--
> > > >    fs/f2fs/super.c                    | 79 
> > > > +++++++++++++++++++++++++++++-
> > > >    4 files changed, 125 insertions(+), 5 deletions(-)
> > > > 
> > > > diff --git a/Documentation/filesystems/f2fs.rst
> > > > b/Documentation/filesystems/f2fs.rst
> > > > index 992bf91eeec8..c68f1c822665 100644
> > > > --- a/Documentation/filesystems/f2fs.rst
> > > > +++ b/Documentation/filesystems/f2fs.rst
> > > > @@ -281,6 +281,18 @@ compress_extension=%s     Support adding
> > > > specified extension, so that f2fs can enab
> > > >                 For other files, we can still enable compression via
> > > > ioctl.
> > > >                 Note that, there is one reserved special extension '*', 
> > > > it
> > > >                 can be set to enable compression for all files.
> > > > +nocompress_extension=%s       Support adding specified extension, so
> > > > that f2fs can disable
> > > > +             compression on those corresponding files, just contrary
> > > > to compression extension.
> > > > +             If you know exactly which files cannot be compressed,
> > > > you can use this.
> > > > +             The same extension name can't appear in both compress
> > > > and nocompress
> > > > +             extension at the same time.
> > > > +             If the compress extension specifies all files, the types
> > > > specified by the
> > > > +             nocompress extension will be treated as special cases
> > > > and will not be compressed.
> > > > +             Don't allow use '*' to specifie all file in nocompress
> > > > extension.
> > > > +             After add nocompress_extension, the priority should be:
> > > > +             dir_flag < comp_extention,nocompress_extension <
> > > > comp_file_flag,no_comp_file_flag.
> > > > +             See more in compression sections.
> > > > +
> > > >    compress_chksum         Support verifying chksum of raw data in
> > > > compressed cluster.
> > > >    compress_mode=%s     Control file compression mode. This supports
> > > > "fs" and "user"
> > > >                 modes. In "fs" mode (default), f2fs does automatic
> > > > compression
> > > > @@ -814,13 +826,30 @@ Compression implementation
> > > >      all logical blocks in cluster contain valid data and compress
> > > > ratio of
> > > >      cluster data is lower than specified threshold.
> > > > -- To enable compression on regular inode, there are three ways:
> > > > +- To enable compression on regular inode, there are four ways:
> > > >      * chattr +c file
> > > >      * chattr +c dir; touch dir/file
> > > >      * mount w/ -o compress_extension=ext; touch file.ext
> > > >      * mount w/ -o compress_extension=*; touch any_file
> > > > +- To disable compression on regular inode, there are two ways:
> > > > +
> > > > +  * chattr -c file
> > > > +  * mount w/ -o nocompress_extension=ext; touch file.ext
> > > > +
> > > > +- Priority in between FS_COMPR_FL, FS_NOCOMP_FS, extensions:
> > > > +
> > > > +  * compress_extension=so; nocompress_extension=zip; chattr +c dir;
> > > > touch
> > > > +    dir/foo.so; touch dir/bar.zip; touch dir/baz.txt; then foo.so and
> > > > baz.txt
> > > > +    should be compresse, bar.zip should be non-compressed. chattr +c
> > > > dir/bar.zip
> > > > +    can enable compress on bar.zip.
> > > > +  * compress_extension=so; nocompress_extension=zip; chattr -c dir;
> > > > touch
> > > > +    dir/foo.so; touch dir/bar.zip; touch dir/baz.txt; then foo.so
> > > > should be
> > > > +    compresse, bar.zip and baz.txt should be non-compressed.
> > > > +    chattr+c dir/bar.zip; chattr+c dir/baz.txt; can enable compress
> > > > on bar.zip
> > > > +    and baz.txt.
> > > > +
> > > >    - At this point, compression feature doesn't expose compressed space
> > > > to user
> > > >      directly in order to guarantee potential data updates later to the
> > > > space.
> > > >      Instead, the main goal is to reduce data writes to flash disk as
> > > > much as
> > > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> > > > index 9ad502f92529..7d13d4d64d59 100644
> > > > --- a/fs/f2fs/f2fs.h
> > > > +++ b/fs/f2fs/f2fs.h
> > > > @@ -150,8 +150,10 @@ struct f2fs_mount_info {
> > > >        unsigned char compress_level;        /* compress level */
> > > >        bool compress_chksum;            /* compressed data chksum */
> > > >        unsigned char compress_ext_cnt;        /* extension count */
> > > > +    unsigned char nocompress_ext_cnt;        /* nocompress extension
> > > > count */
> > > >        int compress_mode;            /* compression mode */
> > > >        unsigned char
> > > > extensions[COMPRESS_EXT_NUM][F2FS_EXTENSION_LEN];    /* extensions */
> > > > +    unsigned char noextensions[COMPRESS_EXT_NUM][F2FS_EXTENSION_LEN];
> > > > /* extensions */
> > > >    };
> > > >    #define F2FS_FEATURE_ENCRYPT        0x0001
> > > > diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
> > > > index d4139e166b95..f343842da4f3 100644
> > > > --- a/fs/f2fs/namei.c
> > > > +++ b/fs/f2fs/namei.c
> > > > @@ -287,14 +287,16 @@ static void set_compress_inode(struct
> > > > f2fs_sb_info *sbi, struct inode *inode,
> > > >                            const unsigned char *name)
> > > >    {
> > > >        __u8 (*extlist)[F2FS_EXTENSION_LEN] =
> > > > sbi->raw_super->extension_list;
> > > > +    unsigned char (*noext)[F2FS_EXTENSION_LEN] =
> > > > F2FS_OPTION(sbi).noextensions;
> > > >        unsigned char (*ext)[F2FS_EXTENSION_LEN];
> > > > -    unsigned int ext_cnt = F2FS_OPTION(sbi).compress_ext_cnt;
> > > > +    unsigned char ext_cnt = F2FS_OPTION(sbi).compress_ext_cnt;
> > > > +    unsigned char noext_cnt = F2FS_OPTION(sbi).nocompress_ext_cnt;
> > > >        int i, cold_count, hot_count;
> > > >        if (!f2fs_sb_has_compression(sbi) ||
> > > > -            is_inode_flag_set(inode, FI_COMPRESSED_FILE) ||
> > > >                F2FS_I(inode)->i_flags & F2FS_NOCOMP_FL ||
> > > > -            !f2fs_may_compress(inode))
> > > > +            !f2fs_may_compress(inode) ||
> > > > +            (!ext_cnt && !noext_cnt))
> > > >            return;
> > > >        down_read(&sbi->sb_lock);
> > > > @@ -311,6 +313,16 @@ static void set_compress_inode(struct
> > > > f2fs_sb_info *sbi, struct inode *inode,
> > > >        up_read(&sbi->sb_lock);
> > > > +    for (i = 0; i < noext_cnt; i++) {
> > > > +        if (is_extension_exist(name, noext[i])) {
> > > > +            f2fs_disable_compressed_file(inode);
> > > > +            return;
> > > > +        }
> > > > +    }
> > > > +
> > > > +    if (is_inode_flag_set(inode, FI_COMPRESSED_FILE))
> > > > +        return;
> > > > +
> > > >        ext = F2FS_OPTION(sbi).extensions;
> > > >        for (i = 0; i < ext_cnt; i++) {
> > > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> > > > index 6788e7b71e27..e720323b900c 100644
> > > > --- a/fs/f2fs/super.c
> > > > +++ b/fs/f2fs/super.c
> > > > @@ -148,6 +148,7 @@ enum {
> > > >        Opt_compress_algorithm,
> > > >        Opt_compress_log_size,
> > > >        Opt_compress_extension,
> > > > +    Opt_nocompress_extension,
> > > >        Opt_compress_chksum,
> > > >        Opt_compress_mode,
> > > >        Opt_atgc,
> > > > @@ -222,6 +223,7 @@ static match_table_t f2fs_tokens = {
> > > >        {Opt_compress_algorithm, "compress_algorithm=%s"},
> > > >        {Opt_compress_log_size, "compress_log_size=%u"},
> > > >        {Opt_compress_extension, "compress_extension=%s"},
> > > > +    {Opt_nocompress_extension, "nocompress_extension=%s"},
> > > >        {Opt_compress_chksum, "compress_chksum"},
> > > >        {Opt_compress_mode, "compress_mode=%s"},
> > > >        {Opt_atgc, "atgc"},
> > > > @@ -473,6 +475,43 @@ static int f2fs_set_test_dummy_encryption(struct
> > > > super_block *sb,
> > > >    }
> > > >    #ifdef CONFIG_F2FS_FS_COMPRESSION
> > > > +/*
> > > > + * 1. The same extension name cannot not appear in both compress and
> > > > non-compress extension
> > > > + * at the same time.
> > > > + * 2. If the compress extension specifies all files, the types
> > > > specified by the non-compress
> > > > + * extension will be treated as special cases and will not be
> > > > compressed.
> > > > + * 3. Don't allow the non-compress extension specifies all files.
> > > > + */
> > > > +static int f2fs_test_compress_extension(struct f2fs_sb_info *sbi)
> > > > +{
> > > > +    unsigned char (*ext)[F2FS_EXTENSION_LEN];
> > > > +    unsigned char (*noext)[F2FS_EXTENSION_LEN];
> > > > +    int ext_cnt, noext_cnt, index = 0, no_index = 0;
> > > > +
> > > > +    ext = F2FS_OPTION(sbi).extensions;
> > > > +    ext_cnt = F2FS_OPTION(sbi).compress_ext_cnt;
> > > > +    noext = F2FS_OPTION(sbi).noextensions;
> > > > +    noext_cnt = F2FS_OPTION(sbi).nocompress_ext_cnt;
> > > > +
> > > > +    if (!noext_cnt)
> > > > +        return 0;
> > > > +
> > > > +    for (no_index = 0; no_index < noext_cnt; no_index++) {
> > > > +        if (!strcasecmp("*", noext[no_index])) {
> > > > +            f2fs_info(sbi, "Don't allow the nocompress extension
> > > > specifies all files");
> > > > +            return -EINVAL;
> > > > +        }
> > > > +        for (index = 0; index < ext_cnt; index++) {
> > > > +            if (!strcasecmp(ext[index], noext[no_index])) {
> > > > +                f2fs_info(sbi, "Don't allow the same extension %s
> > > > appear in both compress and nocompress extension",
> > > > +                        ext[index]);
> > > > +                return -EINVAL;
> > > > +            }
> > > > +        }
> > > > +    }
> > > > +    return 0;
> > > > +}
> > > > +
> > > >    #ifdef CONFIG_F2FS_FS_LZ4
> > > >    static int f2fs_set_lz4hc_level(struct f2fs_sb_info *sbi, const char
> > > > *str)
> > > >    {
> > > > @@ -546,7 +585,8 @@ static int parse_options(struct super_block *sb,
> > > > char *options, bool is_remount)
> > > >        substring_t args[MAX_OPT_ARGS];
> > > >    #ifdef CONFIG_F2FS_FS_COMPRESSION
> > > >        unsigned char (*ext)[F2FS_EXTENSION_LEN];
> > > > -    int ext_cnt;
> > > > +    unsigned char (*noext)[F2FS_EXTENSION_LEN];
> > > > +    int ext_cnt, noext_cnt;
> > > >    #endif
> > > >        char *p, *name;
> > > >        int arg = 0;
> > > > @@ -1049,6 +1089,30 @@ static int parse_options(struct super_block
> > > > *sb, char *options, bool is_remount)
> > > >                F2FS_OPTION(sbi).compress_ext_cnt++;
> > > >                kfree(name);
> > > >                break;
> > > > +        case Opt_nocompress_extension:
> > > > +            if (!f2fs_sb_has_compression(sbi)) {
> > > > +                f2fs_info(sbi, "Image doesn't support compression");
> > > > +                break;
> > > > +            }
> > > > +            name = match_strdup(&args[0]);
> > > > +            if (!name)
> > > > +                return -ENOMEM;
> > > > +
> > > > +            noext = F2FS_OPTION(sbi).noextensions;
> > > > +            noext_cnt = F2FS_OPTION(sbi).nocompress_ext_cnt;
> > > > +
> > > > +            if (strlen(name) >= F2FS_EXTENSION_LEN ||
> > > > +                noext_cnt >= COMPRESS_EXT_NUM) {
> > > > +                f2fs_err(sbi,
> > > > +                    "invalid extension length/number");
> > > > +                kfree(name);
> > > > +                return -EINVAL;
> > > > +            }
> > > > +
> > > > +            strcpy(noext[noext_cnt], name);
> > > > +            F2FS_OPTION(sbi).nocompress_ext_cnt++;
> > > > +            kfree(name);
> > > > +            break;
> > > >            case Opt_compress_chksum:
> > > >                F2FS_OPTION(sbi).compress_chksum = true;
> > > >                break;
> > > > @@ -1070,6 +1134,7 @@ static int parse_options(struct super_block *sb,
> > > > char *options, bool is_remount)
> > > >            case Opt_compress_algorithm:
> > > >            case Opt_compress_log_size:
> > > >            case Opt_compress_extension:
> > > > +        case Opt_nocompress_extension:
> > > >            case Opt_compress_chksum:
> > > >            case Opt_compress_mode:
> > > >                f2fs_info(sbi, "compression options not supported");
> > > > @@ -1123,6 +1188,13 @@ static int parse_options(struct super_block
> > > > *sb, char *options, bool is_remount)
> > > >        }
> > > >    #endif
> > > > +#ifdef CONFIG_F2FS_FS_COMPRESSION
> > > > +    if (f2fs_test_compress_extension(sbi)) {
> > > > +        f2fs_err(sbi, "invalid compress or nocompress extension");
> > > > +        return -EINVAL;
> > > > +    }
> > > > +#endif
> > > > +
> > > >        if (F2FS_IO_SIZE_BITS(sbi) && !f2fs_lfs_mode(sbi)) {
> > > >            f2fs_err(sbi, "Should set mode=lfs with %uKB-sized IO",
> > > >                 F2FS_IO_SIZE_KB(sbi));
> > > > @@ -1671,6 +1743,11 @@ static inline void
> > > > f2fs_show_compress_options(struct seq_file *seq,
> > > >                F2FS_OPTION(sbi).extensions[i]);
> > > >        }
> > > > +    for (i = 0; i < F2FS_OPTION(sbi).nocompress_ext_cnt; i++) {
> > > > +        seq_printf(seq, ",nocompress_extension=%s",
> > > > +            F2FS_OPTION(sbi).noextensions[i]);
> > > > +    }
> > > > +
> > > >        if (F2FS_OPTION(sbi).compress_chksum)
> > > >            seq_puts(seq, ",compress_chksum");
> > > > 


_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to