Note that when the compression is disabled for the files, this count
                doesn't decrease. If you write "0" here, you can initialize
                compr_new_inode to "0".
+
+What:          /sys/fs/f2fs/<disk>/atgc_candidate_ratio
+Date:          May 2021
+Contact:       "Chao Yu" <yuchao0@huawei.com>
+Description:   When ATGC is on, it controls candidate ratio in order to limit total
+               number of potential victim in all candidates, the value should be in
+               range of [0, 100], by default it was initialized as 20(%).
+
+What:          /sys/fs/f2fs/<disk>/atgc_candidate_count
+Date:          May 2021
+Contact:       "Chao Yu" <yuchao0@huawei.com>
+Description:   When ATGC is on, it controls candidate count in order to limit total
+               number of potential victim in all candidates, by default it was
+               initialized as 10 (sections).
+
+What:          /sys/fs/f2fs/<disk>/atgc_age_weight
+Date:          May 2021
+Contact:       "Chao Yu" <yuchao0@huawei.com>
+Description:   When ATGC is on, it controls age weight to balance weight proportion
+               in between aging and valid blocks, the value should be in range of
+               [0, 100], by default it was initialized as 60(%).
+
+What:          /sys/fs/f2fs/<disk>/atgc_age_threshold
+Date:          May 2021
+Contact:       "Chao Yu" <yuchao0@huawei.com>
+Description:   When ATGC is on, it controls age threshold to bypass GCing young
+               candidates whose age is not beyond the threshold, by default it was
+               initialized as 604800 seconds (equals to 7 days).
 
 #endif
        RESERVED_BLOCKS,        /* struct f2fs_sb_info */
        CPRC_INFO,      /* struct ckpt_req_control */
+       ATGC_INFO,      /* struct atgc_management */
 };
 
 struct f2fs_attr {
 #endif
        else if (struct_type == CPRC_INFO)
                return (unsigned char *)&sbi->cprc_info;
+       else if (struct_type == ATGC_INFO)
+               return (unsigned char *)&sbi->am;
        return NULL;
 }
 
        }
 #endif
 
+       if (!strcmp(a->attr.name, "atgc_candidate_ratio")) {
+               if (t > 100)
+                       return -EINVAL;
+               sbi->am.candidate_ratio = t;
+               return count;
+       }
+
+       if (!strcmp(a->attr.name, "atgc_age_weight")) {
+               if (t > 100)
+                       return -EINVAL;
+               sbi->am.age_weight = t;
+               return count;
+       }
+
        *ui = (unsigned int)t;
 
        return count;
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, compr_saved_block, compr_saved_block);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, compr_new_inode, compr_new_inode);
 #endif
+/* For ATGC */
+F2FS_RW_ATTR(ATGC_INFO, atgc_management, atgc_candidate_ratio, candidate_ratio);
+F2FS_RW_ATTR(ATGC_INFO, atgc_management, atgc_candidate_count, max_candidate_count);
+F2FS_RW_ATTR(ATGC_INFO, atgc_management, atgc_age_weight, age_weight);
+F2FS_RW_ATTR(ATGC_INFO, atgc_management, atgc_age_threshold, age_threshold);
 
 #define ATTR_LIST(name) (&f2fs_attr_##name.attr)
 static struct attribute *f2fs_attrs[] = {
        ATTR_LIST(compr_saved_block),
        ATTR_LIST(compr_new_inode),
 #endif
+       /* For ATGC */
+       ATTR_LIST(atgc_candidate_ratio),
+       ATTR_LIST(atgc_candidate_count),
+       ATTR_LIST(atgc_age_weight),
+       ATTR_LIST(atgc_age_threshold),
        NULL,
 };
 ATTRIBUTE_GROUPS(f2fs);