Applied this as well.

--- a/fsck/main.c
+++ b/fsck/main.c
@@ -866,6 +866,12 @@ void f2fs_parse_options(int argc, char *argv[])
 #endif /* WITH_INJECT */
        }

+#if defined(__MINGW32__)
+       if (c.need_whint) {
+               MSG(0, "-H not supported for Windows\n");
+               err = EWRONG_OPT;
+       }
+#endif
        if (err == NOERROR) {
                add_default_options();

diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c
index c40d826c41b4..1923c0b87dfc 100644
--- a/lib/libf2fs_io.c
+++ b/lib/libf2fs_io.c
@@ -609,7 +609,6 @@ enum rw_hint f2fs_io_type_to_rw_hint(int seg_type)

 static int __dev_write(void *buf, __u64 offset, size_t len, enum rw_hint whint)
 {
-       bool set_whint = (c.need_whint && (c.whint != whint));
        int fd;

        fd = __get_device_fd(&offset);
@@ -619,7 +618,8 @@ static int __dev_write(void *buf, __u64 offset, size_t len, 
enum rw_hint whint)
        if (lseek(fd, (off_t)offset, SEEK_SET) < 0)
                return -1;

-       if (set_whint) {
+#if ! defined(__MINGW32__)
+       if (c.need_whint && (c.whint != whint)) {
                u64 hint = whint;
                int ret;

@@ -627,6 +627,7 @@ static int __dev_write(void *buf, __u64 offset, size_t len, 
enum rw_hint whint)
                if (ret != -1)
                        c.whint = whint;
        }
+#endif

        if (write(fd, buf, len) < 0)
                return -1;


On 09/07, Jaegeuk Kim via Linux-f2fs-devel wrote:
> Applied this change for Android build.
> 
> --- a/fsck/mount.c
> +++ b/fsck/mount.c
> @@ -4222,7 +4222,7 @@ int f2fs_sparse_initialize_meta(struct f2fs_sb_info 
> *sbi)
>         DBG(1, "\tSparse: filling sit area at block offset: 0x%08"PRIx64" 
> len: %u\n",
>                                                         sit_seg_addr, 
> sit_size);
>         ret = dev_fill(NULL, sit_seg_addr * F2FS_BLKSIZE,
> -                                       sit_size * F2FS_BLKSIZE);
> +                       sit_size * F2FS_BLKSIZE, WRITE_LIFE_NONE);
>         if (ret) {
>                 MSG(1, "\tError: While zeroing out the sit area "
>                                 "on disk!!!\n");
> @@ -4236,7 +4236,7 @@ int f2fs_sparse_initialize_meta(struct f2fs_sb_info 
> *sbi)
>         DBG(1, "\tSparse: filling nat area at block offset 0x%08"PRIx64" len: 
> %u\n",
>                                                         nat_seg_addr, 
> nat_size);
>         ret = dev_fill(NULL, nat_seg_addr * F2FS_BLKSIZE,
> -                                       nat_size * F2FS_BLKSIZE);
> +                       nat_size * F2FS_BLKSIZE, WRITE_LIFE_NONE);
>         if (ret) {
>                 MSG(1, "\tError: While zeroing out the nat area "
>                                 "on disk!!!\n");
> @@ -4248,7 +4248,7 @@ int f2fs_sparse_initialize_meta(struct f2fs_sb_info 
> *sbi)
>         DBG(1, "\tSparse: filling bitmap area at block offset 0x%08"PRIx64" 
> len: %u\n",
>                                         payload_addr, get_sb(cp_payload));
>         ret = dev_fill(NULL, payload_addr * F2FS_BLKSIZE,
> -                                       get_sb(cp_payload) * F2FS_BLKSIZE);
> +                       get_sb(cp_payload) * F2FS_BLKSIZE, WRITE_LIFE_NONE);
>         if (ret) {
>                 MSG(1, "\tError: While zeroing out the nat/sit bitmap area "
>                                 "on disk!!!\n");
> @@ -4260,7 +4260,7 @@ int f2fs_sparse_initialize_meta(struct f2fs_sb_info 
> *sbi)
>         DBG(1, "\tSparse: filling bitmap area at block offset 0x%08"PRIx64" 
> len: %u\n",
>                                         payload_addr, get_sb(cp_payload));
>         ret = dev_fill(NULL, payload_addr * F2FS_BLKSIZE,
> -                                       get_sb(cp_payload) * F2FS_BLKSIZE);
> +                       get_sb(cp_payload) * F2FS_BLKSIZE, WRITE_LIFE_NONE);
>         if (ret) {
>                 MSG(1, "\tError: While zeroing out the nat/sit bitmap area "
>                                 "on disk!!!\n");
> diff --git a/include/android_config.h b/include/android_config.h
> index 9c8b163dac22..f5cd4dea0c99 100644
> --- a/include/android_config.h
> +++ b/include/android_config.h
> @@ -1,9 +1,11 @@
>  #if defined(__linux__)
> +#define HAVE_ARCH_STRUCT_FLOCK 1
>  #define HAVE_BLK_ZONE_REP_V2 1
>  #define HAVE_BYTESWAP_H 1
>  #define HAVE_FCNTL_H 1
>  #define HAVE_FALLOC_H 1
>  #define HAVE_FSYNC 1
> +#define HAVE_LINUX_FCNTL_H 1
>  #define HAVE_LINUX_HDREG_H 1
>  #define HAVE_LINUX_LIMITS_H 1
>  #define HAVE_LINUX_LOOP_H 1
> 
> On 09/04, Daejun Park wrote:
> > This patch enables support for write hints by segment type.
> > 
> > Signed-off-by: Daejun Park <daejun7.p...@samsung.com>
> > ---
> > 
> > v2:
> >  - Add -H option for write hint enabling.
> >  - Keep last write hint to reduce fnctl call.
> > 
> >  configure.ac            |   2 +
> >  fsck/defrag.c           |   5 +-
> >  fsck/dir.c              |  27 +++++++---
> >  fsck/fsck.c             |  24 +++++----
> >  fsck/inject.c           |   4 +-
> >  fsck/main.c             |  22 ++++++--
> >  fsck/mount.c            |  43 ++++++++-------
> >  fsck/node.c             |  11 ++--
> >  fsck/resize.c           |  37 +++++++------
> >  fsck/segment.c          |  21 +++++---
> >  fsck/xattr.c            |   6 ++-
> >  include/f2fs_fs.h       |  26 +++++++--
> >  lib/libf2fs.c           |   6 +--
> >  lib/libf2fs_io.c        | 117 ++++++++++++++++++++++++++++++----------
> >  man/defrag.f2fs.8       |   6 +++
> >  man/fsck.f2fs.8         |   6 +++
> >  man/mkfs.f2fs.8         |   6 +++
> >  man/resize.f2fs.8       |   6 +++
> >  mkfs/f2fs_format.c      |  52 ++++++++++--------
> >  mkfs/f2fs_format_main.c |   9 +++-
> >  20 files changed, 309 insertions(+), 127 deletions(-)
> > 
> > diff --git a/configure.ac b/configure.ac
> > index 21c6391..2053a65 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -139,6 +139,8 @@ AC_CHECK_HEADERS(m4_flatten([
> >     fcntl.h
> >     kernel/uapi/linux/blkzoned.h
> >     linux/blkzoned.h
> > +   linux/rw_hint.h
> > +   linux/fcntl.h
> >     linux/falloc.h
> >     linux/fiemap.h
> >     linux/fs.h
> > diff --git a/fsck/defrag.c b/fsck/defrag.c
> > index 361fe73..9889b70 100644
> > --- a/fsck/defrag.c
> > +++ b/fsck/defrag.c
> > @@ -23,12 +23,13 @@ static int migrate_block(struct f2fs_sb_info *sbi, u64 
> > from, u64 to)
> >     ret = dev_read_block(raw, from);
> >     ASSERT(ret >= 0);
> >  
> > +   /* get segment type */
> > +   se = get_seg_entry(sbi, GET_SEGNO(sbi, from));
> >     /* write to */
> > -   ret = dev_write_block(raw, to);
> > +   ret = dev_write_block(raw, to, f2fs_io_type_to_rw_hint(se->type));
> >     ASSERT(ret >= 0);
> >  
> >     /* update sit bitmap & valid_blocks && se->type */
> > -   se = get_seg_entry(sbi, GET_SEGNO(sbi, from));
> >     offset = OFFSET_IN_SEG(sbi, from);
> >     type = se->type;
> >     se->valid_blocks--;
> > diff --git a/fsck/dir.c b/fsck/dir.c
> > index 3fac850..4debda8 100644
> > --- a/fsck/dir.c
> > +++ b/fsck/dir.c
> > @@ -299,7 +299,9 @@ add_dentry:
> >  
> >     if (c.zoned_model == F2FS_ZONED_HM) {
> >             if (datablk_alloced) {
> > -                   ret = dev_write_block(dentry_blk, dn.data_blkaddr);
> > +                   /* dentry uses hot data segment */
> > +                   ret = dev_write_block(dentry_blk, dn.data_blkaddr,
> > +                           f2fs_io_type_to_rw_hint(CURSEG_HOT_DATA));
> >             } else {
> >                     ret = update_block(sbi, dentry_blk, &dn.data_blkaddr,
> >                                     dn.node_blk);
> > @@ -309,7 +311,9 @@ add_dentry:
> >                             dn.ndirty = 1;
> >             }
> >     } else {
> > -           ret = dev_write_block(dentry_blk, dn.data_blkaddr);
> > +           /* dentry uses hot data segment */
> > +           ret = dev_write_block(dentry_blk, dn.data_blkaddr,
> > +                           f2fs_io_type_to_rw_hint(CURSEG_HOT_DATA));
> >     }
> >     ASSERT(ret >= 0);
> >  
> > @@ -336,8 +340,13 @@ add_dentry:
> >     }
> >  
> >     if (dn.ndirty) {
> > +           struct seg_entry *se;
> > +
> > +           /* get segment type for rw hint */
> > +           se = get_seg_entry(sbi, GET_SEGNO(sbi, dn.node_blkaddr));
> >             ret = dn.alloced ?
> > -                   dev_write_block(dn.node_blk, dn.node_blkaddr) :
> > +                   dev_write_block(dn.node_blk, dn.node_blkaddr,
> > +                                   f2fs_io_type_to_rw_hint(se->type)) :
> >                     update_block(sbi, dn.node_blk, &dn.node_blkaddr, NULL);
> >             ASSERT(ret >= 0);
> >     }
> > @@ -388,7 +397,8 @@ static void make_empty_dir(struct f2fs_sb_info *sbi, 
> > struct f2fs_node *inode)
> >     ret = reserve_new_block(sbi, &blkaddr, &sum, CURSEG_HOT_DATA, 0);
> >     ASSERT(!ret);
> >  
> > -   ret = dev_write_block(dent_blk, blkaddr);
> > +   ret = dev_write_block(dent_blk, blkaddr,
> > +                         f2fs_io_type_to_rw_hint(CURSEG_HOT_DATA));
> >     ASSERT(ret >= 0);
> >  
> >     inode->i.i_addr[get_extra_isize(inode)] = cpu_to_le32(blkaddr);
> > @@ -424,7 +434,8 @@ static void page_symlink(struct f2fs_sb_info *sbi, 
> > struct f2fs_node *inode,
> >     ret = reserve_new_block(sbi, &blkaddr, &sum, CURSEG_WARM_DATA, 0);
> >     ASSERT(!ret);
> >  
> > -   ret = dev_write_block(data_blk, blkaddr);
> > +   ret = dev_write_block(data_blk, blkaddr,
> > +                         f2fs_io_type_to_rw_hint(CURSEG_WARM_DATA));
> >     ASSERT(ret >= 0);
> >  
> >     inode->i.i_addr[get_extra_isize(inode)] = cpu_to_le32(blkaddr);
> > @@ -618,7 +629,8 @@ int convert_inline_dentry(struct f2fs_sb_info *sbi, 
> > struct f2fs_node *node,
> >             memcpy(dst.filename, src.filename, src.max * F2FS_SLOT_LEN);
> >  
> >             ret = datablk_alloced ?
> > -                   dev_write_block(dentry_blk, dn.data_blkaddr) :
> > +                   dev_write_block(dentry_blk, dn.data_blkaddr,
> > +                                   
> > f2fs_io_type_to_rw_hint(CURSEG_HOT_DATA)) :
> >                     update_block(sbi, dentry_blk, &dn.data_blkaddr, NULL);
> >             ASSERT(ret >= 0);
> >  
> > @@ -818,7 +830,8 @@ int f2fs_create(struct f2fs_sb_info *sbi, struct dentry 
> > *de)
> >     update_nat_blkaddr(sbi, de->ino, de->ino, blkaddr);
> >  
> >  write_child_dir:
> > -   ret = nodeblk_alloced ? dev_write_block(child, blkaddr) :
> > +   ret = nodeblk_alloced ? dev_write_block(child, blkaddr,
> > +                   f2fs_io_type_to_rw_hint(CURSEG_HOT_NODE)) :
> >             update_block(sbi, child, &blkaddr, NULL);
> >     ASSERT(ret >= 0);
> >  
> > diff --git a/fsck/fsck.c b/fsck/fsck.c
> > index a18bee9..e4d4aae 100644
> > --- a/fsck/fsck.c
> > +++ b/fsck/fsck.c
> > @@ -216,7 +216,7 @@ static int is_valid_ssa_node_blk(struct f2fs_sb_info 
> > *sbi, u32 nid,
> >             int ret2;
> >  
> >             ssa_blk = GET_SUM_BLKADDR(sbi, segno);
> > -           ret2 = dev_write_block(sum_blk, ssa_blk);
> > +           ret2 = dev_write_block(sum_blk, ssa_blk, WRITE_LIFE_NONE);
> >             ASSERT(ret2 >= 0);
> >     }
> >  out:
> > @@ -350,7 +350,7 @@ static int is_valid_ssa_data_blk(struct f2fs_sb_info 
> > *sbi, u32 blk_addr,
> >             int ret2;
> >  
> >             ssa_blk = GET_SUM_BLKADDR(sbi, segno);
> > -           ret2 = dev_write_block(sum_blk, ssa_blk);
> > +           ret2 = dev_write_block(sum_blk, ssa_blk, WRITE_LIFE_NONE);
> >             ASSERT(ret2 >= 0);
> >     }
> >  out:
> > @@ -2153,7 +2153,8 @@ int fsck_chk_orphan_node(struct f2fs_sb_info *sbi)
> >             if (f2fs_dev_is_writable() && c.fix_on &&
> >                             entry_count != new_entry_count) {
> >                     F2FS_ORPHAN_BLOCK_FOOTER(new_blk)->entry_count = 
> > cpu_to_le32(new_entry_count);
> > -                   ret = dev_write_block(new_blk, start_blk + i);
> > +                   ret = dev_write_block(new_blk, start_blk + i,
> > +                                         WRITE_LIFE_NONE);
> >                     ASSERT(ret >= 0);
> >             }
> >             memset(orphan_blk, 0, F2FS_BLKSIZE);
> > @@ -2569,12 +2570,13 @@ static void fix_checkpoint(struct f2fs_sb_info *sbi)
> >     if (sbi->cur_cp == 2)
> >             cp_blk_no += 1 << get_sb(log_blocks_per_seg);
> >  
> > -   ret = dev_write_block(cp, cp_blk_no++);
> > +   ret = dev_write_block(cp, cp_blk_no++, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     for (i = 0; i < get_sb(cp_payload); i++) {
> >             ret = dev_write_block(((unsigned char *)cp) +
> > -                                   (i + 1) * F2FS_BLKSIZE, cp_blk_no++);
> > +                                   (i + 1) * F2FS_BLKSIZE, cp_blk_no++,
> > +                                   WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >     }
> >  
> > @@ -2586,7 +2588,8 @@ static void fix_checkpoint(struct f2fs_sb_info *sbi)
> >             if (!(flags & CP_UMOUNT_FLAG) && IS_NODESEG(i))
> >                     continue;
> >  
> > -           ret = dev_write_block(curseg->sum_blk, cp_blk_no++);
> > +           ret = dev_write_block(curseg->sum_blk, cp_blk_no++,
> > +                                 WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >     }
> >  
> > @@ -2597,7 +2600,7 @@ static void fix_checkpoint(struct f2fs_sb_info *sbi)
> >     ret = f2fs_fsync_device();
> >     ASSERT(ret >= 0);
> >  
> > -   ret = dev_write_block(cp, cp_blk_no++);
> > +   ret = dev_write_block(cp, cp_blk_no++, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     ret = f2fs_fsync_device();
> > @@ -3328,9 +3331,11 @@ static int chk_and_fix_wp_with_sit(int UNUSED(i), 
> > void *blkzone, void *opaque)
> >     if (ret) {
> >             u64 fill_sects = blk_zone_length(blkz) -
> >                     (blk_zone_wp_sector(blkz) - blk_zone_sector(blkz));
> > +           struct seg_entry *se = get_seg_entry(sbi, wp_segno);
> >             printf("[FSCK] Finishing zone failed: %s\n", dev->path);
> >             ret = dev_fill(NULL, wp_block * F2FS_BLKSIZE,
> > -                   (fill_sects >> log_sectors_per_block) * F2FS_BLKSIZE);
> > +                   (fill_sects >> log_sectors_per_block) * F2FS_BLKSIZE,
> > +                   f2fs_io_type_to_rw_hint(se->type));
> >             if (ret)
> >                     printf("[FSCK] Fill up zone failed: %s\n", dev->path);
> >     }
> > @@ -3646,7 +3651,8 @@ int fsck_verify(struct f2fs_sb_info *sbi)
> >                                     ssa_blk = GET_SUM_BLKADDR(sbi,
> >                                                     curseg->segno);
> >                                     ret = dev_write_block(curseg->sum_blk,
> > -                                                   ssa_blk);
> > +                                                   ssa_blk,
> > +                                                   WRITE_LIFE_NONE);
> >                                     ASSERT(ret >= 0);
> >                             }
> >                             if (c.roll_forward)
> > diff --git a/fsck/inject.c b/fsck/inject.c
> > index 9dc085f..e24f3f5 100644
> > --- a/fsck/inject.c
> > +++ b/fsck/inject.c
> > @@ -565,7 +565,7 @@ static int inject_nat(struct f2fs_sb_info *sbi, struct 
> > inject_option *opt)
> >     }
> >     print_raw_nat_entry_info(ne);
> >  
> > -   ret = dev_write_block(nat_blk, blk_addr);
> > +   ret = dev_write_block(nat_blk, blk_addr, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >     /* restore NAT version bitmap */
> >     if (is_set)
> > @@ -724,7 +724,7 @@ static int inject_ssa(struct f2fs_sb_info *sbi, struct 
> > inject_option *opt)
> >     print_sum_footer_info(footer);
> >  
> >     ssa_blkaddr = GET_SUM_BLKADDR(sbi, segno);
> > -   ret = dev_write_block(sum_blk, ssa_blkaddr);
> > +   ret = dev_write_block(sum_blk, ssa_blkaddr, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >  out:
> > diff --git a/fsck/main.c b/fsck/main.c
> > index 8881936..43b807f 100644
> > --- a/fsck/main.c
> > +++ b/fsck/main.c
> > @@ -77,6 +77,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, "  -H support write hint\n");
> >     MSG(0, "  -l show superblock/checkpoint\n");
> >     MSG(0, "  -M show a file map\n");
> >     MSG(0, "  -O feature1[feature2,feature3,...] e.g. \"encrypt\"\n");
> > @@ -108,6 +109,7 @@ void dump_usage()
> >     MSG(0, "  -b blk_addr (in 4KB)\n");
> >     MSG(0, "  -r dump out from the root inode\n");
> >     MSG(0, "  -f do not prompt before dumping\n");
> > +   MSG(0, "  -H support write hint\n");
> >     MSG(0, "  -y alias for -f\n");
> >     MSG(0, "  -o dump inodes to the given path\n");
> >     MSG(0, "  -P preserve mode/owner/group for dumped inode\n");
> > @@ -122,6 +124,7 @@ void defrag_usage()
> >     MSG(0, "\nUsage: defrag.f2fs [options] device\n");
> >     MSG(0, "[options]:\n");
> >     MSG(0, "  -d debug level [default:0]\n");
> > +   MSG(0, "  -H support write hint\n");
> >     MSG(0, "  -s start block address [default: main_blkaddr]\n");
> >     MSG(0, "  -S sparse_mode\n");
> >     MSG(0, "  -l length [default:512 (2MB)]\n");
> > @@ -136,6 +139,7 @@ void resize_usage()
> >     MSG(0, "\nUsage: resize.f2fs [options] device\n");
> >     MSG(0, "[options]:\n");
> >     MSG(0, "  -d debug level [default:0]\n");
> > +   MSG(0, "  -H support write hint\n");
> >     MSG(0, "  -i extended node bitmap, node ratio is 20%% by default\n");
> >     MSG(0, "  -o overprovision percentage [default:auto]\n");
> >     MSG(0, "  -s safe resize (Does not resize metadata)\n");
> > @@ -246,7 +250,7 @@ void f2fs_parse_options(int argc, char *argv[])
> >     }
> >  
> >     if (!strcmp("fsck.f2fs", prog)) {
> > -           const char *option_string = ":aC:c:m:Md:fg:lO:p:q:StyV";
> > +           const char *option_string = ":aC:c:m:Md:fg:HlO:p:q:StyV";
> >             int opt = 0, val;
> >             char *token;
> >             struct option long_opt[] = {
> > @@ -295,6 +299,10 @@ void f2fs_parse_options(int argc, char *argv[])
> >                                     MSG(0, "Info: Set conf for android\n");
> >                             }
> >                             break;
> > +                   case 'H':
> > +                           c.need_whint = true;
> > +                           c.whint = WRITE_LIFE_NOT_SET;
> > +                           break;
> >                     case 'l':
> >                             c.layout = 1;
> >                             break;
> > @@ -517,7 +525,7 @@ void f2fs_parse_options(int argc, char *argv[])
> >  #endif
> >     } else if (!strcmp("defrag.f2fs", prog)) {
> >  #ifdef WITH_DEFRAG
> > -           const char *option_string = "d:s:Sl:t:iV";
> > +           const char *option_string = "d:Hs:Sl:t:iV";
> >  
> >             c.func = DEFRAG;
> >             while ((option = getopt(argc, argv, option_string)) != EOF) {
> > @@ -533,6 +541,10 @@ void f2fs_parse_options(int argc, char *argv[])
> >                             MSG(0, "Info: Debug level = %d\n",
> >                                                     c.dbg_lv);
> >                             break;
> > +                   case 'H':
> > +                           c.need_whint = true;
> > +                           c.whint = WRITE_LIFE_NOT_SET;
> > +                           break;
> >                     case 's':
> >                             if (strncmp(optarg, "0x", 2))
> >                                     ret = sscanf(optarg, "%"PRIu64"",
> > @@ -577,7 +589,7 @@ void f2fs_parse_options(int argc, char *argv[])
> >  #endif
> >     } else if (!strcmp("resize.f2fs", prog)) {
> >  #ifdef WITH_RESIZE
> > -           const char *option_string = "d:fst:io:V";
> > +           const char *option_string = "d:fHst:io:V";
> >  
> >             c.func = RESIZE;
> >             while ((option = getopt(argc, argv, option_string)) != EOF) {
> > @@ -597,6 +609,10 @@ void f2fs_parse_options(int argc, char *argv[])
> >                             c.force = 1;
> >                             MSG(0, "Info: Force to resize\n");
> >                             break;
> > +                   case 'H':
> > +                           c.need_whint = true;
> > +                           c.whint = WRITE_LIFE_NOT_SET;
> > +                           break;
> >                     case 's':
> >                             c.safe_resize = 1;
> >                             break;
> > diff --git a/fsck/mount.c b/fsck/mount.c
> > index dab0611..4bb1cde 100644
> > --- a/fsck/mount.c
> > +++ b/fsck/mount.c
> > @@ -889,7 +889,7 @@ void update_superblock(struct f2fs_super_block *sb, int 
> > sb_mask)
> >     memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
> >     for (addr = SB0_ADDR; addr < SB_MAX_ADDR; addr++) {
> >             if (SB_MASK(addr) & sb_mask) {
> > -                   ret = dev_write_block(buf, addr);
> > +                   ret = dev_write_block(buf, addr, WRITE_LIFE_NONE);
> >                     ASSERT(ret >= 0);
> >             }
> >     }
> > @@ -1783,7 +1783,8 @@ void write_nat_bits(struct f2fs_sb_info *sbi,
> >     DBG(1, "\tWriting NAT bits pages, at offset 0x%08x\n", blkaddr);
> >  
> >     for (i = 0; i < nat_bits_blocks; i++) {
> > -           if (dev_write_block(nat_bits + i * F2FS_BLKSIZE, blkaddr + i))
> > +           if (dev_write_block(nat_bits + i * F2FS_BLKSIZE, blkaddr + i,
> > +                               WRITE_LIFE_NONE))
> >                     ASSERT_MSG("\tError: write NAT bits to disk!!!\n");
> >     }
> >     MSG(0, "Info: Write valid nat_bits in checkpoint\n");
> > @@ -2155,7 +2156,8 @@ void update_sum_entry(struct f2fs_sb_info *sbi, 
> > block_t blk_addr,
> >                                                     SUM_TYPE_DATA;
> >  
> >     /* write SSA all the time */
> > -   ret = dev_write_block(sum_blk, GET_SUM_BLKADDR(sbi, segno));
> > +   ret = dev_write_block(sum_blk, GET_SUM_BLKADDR(sbi, segno),
> > +                         WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     if (type == SEG_TYPE_NODE || type == SEG_TYPE_DATA ||
> > @@ -2262,7 +2264,7 @@ void rewrite_current_sit_page(struct f2fs_sb_info 
> > *sbi,
> >  {
> >     block_t blk_addr = current_sit_addr(sbi, segno);
> >  
> > -   ASSERT(dev_write_block(sit_blk, blk_addr) >= 0);
> > +   ASSERT(dev_write_block(sit_blk, blk_addr, WRITE_LIFE_NONE) >= 0);
> >  }
> >  
> >  void check_block_count(struct f2fs_sb_info *sbi,
> > @@ -2552,7 +2554,7 @@ void update_nat_blkaddr(struct f2fs_sb_info *sbi, 
> > nid_t ino,
> >             entry->ino = cpu_to_le32(ino);
> >     entry->block_addr = cpu_to_le32(newaddr);
> >  
> > -   ret = dev_write_block(nat_block, block_addr);
> > +   ret = dev_write_block(nat_block, block_addr, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  update_cache:
> >     if (c.func == FSCK)
> > @@ -2848,7 +2850,7 @@ next:
> >     memcpy(&nat_block->entries[entry_off], &nat_in_journal(journal, i),
> >                                     sizeof(struct f2fs_nat_entry));
> >  
> > -   ret = dev_write_block(nat_block, block_addr);
> > +   ret = dev_write_block(nat_block, block_addr, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >     i++;
> >     goto next;
> > @@ -3028,7 +3030,8 @@ int find_next_free_block(struct f2fs_sb_info *sbi, 
> > u64 *to, int left,
> >                     }
> >  
> >                     ssa_blk = GET_SUM_BLKADDR(sbi, curseg->segno);
> > -                   ret = dev_write_block(curseg->sum_blk, ssa_blk);
> > +                   ret = dev_write_block(curseg->sum_blk, ssa_blk,
> > +                                         WRITE_LIFE_NONE);
> >                     ASSERT(ret >= 0);
> >  
> >                     curseg->segno = segno;
> > @@ -3133,7 +3136,7 @@ void move_one_curseg_info(struct f2fs_sb_info *sbi, 
> > u64 from, int left,
> >  
> >     /* update original SSA too */
> >     ssa_blk = GET_SUM_BLKADDR(sbi, curseg->segno);
> > -   ret = dev_write_block(curseg->sum_blk, ssa_blk);
> > +   ret = dev_write_block(curseg->sum_blk, ssa_blk, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  bypass_ssa:
> >     to = from;
> > @@ -3286,7 +3289,7 @@ void nullify_nat_entry(struct f2fs_sb_info *sbi, u32 
> > nid)
> >             FIX_MSG("Remove nid [0x%x] in NAT", nid);
> >     }
> >  
> > -   ret = dev_write_block(nat_block, block_addr);
> > +   ret = dev_write_block(nat_block, block_addr, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >     free(nat_block);
> >  }
> > @@ -3318,7 +3321,7 @@ void duplicate_checkpoint(struct f2fs_sb_info *sbi)
> >     ASSERT(ret >= 0);
> >  
> >     ret = dev_write(buf, dst << F2FS_BLKSIZE_BITS,
> > -                           seg_size << F2FS_BLKSIZE_BITS);
> > +                           seg_size << F2FS_BLKSIZE_BITS, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     free(buf);
> > @@ -3383,7 +3386,7 @@ void write_checkpoint(struct f2fs_sb_info *sbi)
> >             cp_blk_no += 1 << get_sb(log_blocks_per_seg);
> >  
> >     /* write the first cp */
> > -   ret = dev_write_block(cp, cp_blk_no++);
> > +   ret = dev_write_block(cp, cp_blk_no++, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     /* skip payload */
> > @@ -3399,13 +3402,15 @@ void write_checkpoint(struct f2fs_sb_info *sbi)
> >             if (!(flags & CP_UMOUNT_FLAG) && IS_NODESEG(i))
> >                     continue;
> >  
> > -           ret = dev_write_block(curseg->sum_blk, cp_blk_no++);
> > +           ret = dev_write_block(curseg->sum_blk, cp_blk_no++,
> > +                                 WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >  
> >             if (!(get_sb(feature) & F2FS_FEATURE_RO)) {
> >                     /* update original SSA too */
> >                     ssa_blk = GET_SUM_BLKADDR(sbi, curseg->segno);
> > -                   ret = dev_write_block(curseg->sum_blk, ssa_blk);
> > +                   ret = dev_write_block(curseg->sum_blk, ssa_blk,
> > +                                         WRITE_LIFE_NONE);
> >                     ASSERT(ret >= 0);
> >             }
> >     }
> > @@ -3419,7 +3424,7 @@ void write_checkpoint(struct f2fs_sb_info *sbi)
> >     ASSERT(ret >= 0);
> >  
> >     /* write the last cp */
> > -   ret = dev_write_block(cp, cp_blk_no++);
> > +   ret = dev_write_block(cp, cp_blk_no++, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     ret = f2fs_fsync_device();
> > @@ -3455,12 +3460,12 @@ void write_raw_cp_blocks(struct f2fs_sb_info *sbi,
> >             cp_blkaddr += 1 << get_sb(log_blocks_per_seg);
> >  
> >     /* write the first cp block in this CP pack */
> > -   ret = dev_write_block(cp, cp_blkaddr);
> > +   ret = dev_write_block(cp, cp_blkaddr, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     /* write the second cp block in this CP pack */
> >     cp_blkaddr += get_cp(cp_pack_total_block_count) - 1;
> > -   ret = dev_write_block(cp, cp_blkaddr);
> > +   ret = dev_write_block(cp, cp_blkaddr, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  }
> >  
> > @@ -3695,6 +3700,7 @@ static int loop_node_chain_fix(block_t blkaddr_fast,
> >             block_t blkaddr, struct f2fs_node *node_blk)
> >  {
> >     block_t blkaddr_entry, blkaddr_tmp;
> > +   enum rw_hint whint;
> >     int err;
> >  
> >     /* find the entry point of the looped node chain */
> > @@ -3722,10 +3728,11 @@ static int loop_node_chain_fix(block_t blkaddr_fast,
> >  
> >     /* fix the blkaddr of last node with NULL_ADDR. */
> >     F2FS_NODE_FOOTER(node_blk)->next_blkaddr = NULL_ADDR;
> > +   whint = f2fs_io_type_to_rw_hint(CURSEG_WARM_NODE);
> >     if (IS_INODE(node_blk))
> > -           err = write_inode(node_blk, blkaddr_tmp);
> > +           err = write_inode(node_blk, blkaddr_tmp, whint);
> >     else
> > -           err = dev_write_block(node_blk, blkaddr_tmp);
> > +           err = dev_write_block(node_blk, blkaddr_tmp, whint);
> >     if (!err)
> >             FIX_MSG("Fix looped node chain on blkaddr %u\n",
> >                             blkaddr_tmp);
> > diff --git a/fsck/node.c b/fsck/node.c
> > index 632151a..8d4479c 100644
> > --- a/fsck/node.c
> > +++ b/fsck/node.c
> > @@ -78,7 +78,7 @@ int f2fs_rebuild_qf_inode(struct f2fs_sb_info *sbi, int 
> > qtype)
> >             goto err_out;
> >     }
> >  
> > -   ret = write_inode(raw_node, blkaddr);
> > +   ret = write_inode(raw_node, blkaddr, 
> > f2fs_io_type_to_rw_hint(CURSEG_HOT_NODE));
> >     if (ret < 0) {
> >             MSG(1, "\tError: While rebuilding the quota inode to disk!\n");
> >             goto err_out;
> > @@ -282,8 +282,13 @@ int get_dnode_of_data(struct f2fs_sb_info *sbi, struct 
> > dnode_of_data *dn,
> >                     /* Parent node has changed */
> >                     if (!parent_alloced)
> >                             ret = update_block(sbi, parent, &nblk[i - 1], 
> > NULL);
> > -                   else
> > -                           ret = dev_write_block(parent, nblk[i - 1]);
> > +                   else {
> > +                           struct seg_entry *se;
> > +
> > +                           se = get_seg_entry(sbi, GET_SEGNO(sbi, nblk[i - 
> > 1]));
> > +                           ret = dev_write_block(parent, nblk[i - 1],
> > +                                           
> > f2fs_io_type_to_rw_hint(se->type));
> > +                   }
> >                     ASSERT(ret >= 0);
> >  
> >                     /* Function new_node_blk get a new f2fs_node blk and 
> > update*/
> > diff --git a/fsck/resize.c b/fsck/resize.c
> > index 049ddd3..9b3b071 100644
> > --- a/fsck/resize.c
> > +++ b/fsck/resize.c
> > @@ -189,7 +189,8 @@ static void migrate_main(struct f2fs_sb_info *sbi, 
> > unsigned int offset)
> >                     ASSERT(ret >= 0);
> >  
> >                     to = from + offset;
> > -                   ret = dev_write_block(raw, to);
> > +                   ret = dev_write_block(raw, to,
> > +                                         
> > f2fs_io_type_to_rw_hint(se->type));
> >                     ASSERT(ret >= 0);
> >  
> >                     get_sum_entry(sbi, from, &sum);
> > @@ -218,7 +219,8 @@ static void move_ssa(struct f2fs_sb_info *sbi, unsigned 
> > int segno,
> >     if (type < SEG_TYPE_MAX) {
> >             int ret;
> >  
> > -           ret = dev_write_block(sum_blk, new_sum_blk_addr);
> > +           ret = dev_write_block(sum_blk, new_sum_blk_addr,
> > +                                 WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >             DBG(1, "Write summary block: (%d) segno=%x/%x --> (%d) %x\n",
> >                             type, segno, GET_SUM_BLKADDR(sbi, segno),
> > @@ -252,7 +254,8 @@ static void migrate_ssa(struct f2fs_sb_info *sbi,
> >                     if (blkaddr < expand_sum_blkaddr) {
> >                             move_ssa(sbi, offset++, blkaddr++);
> >                     } else {
> > -                           ret = dev_write_block(zero_block, blkaddr++);
> > +                           ret = dev_write_block(zero_block, blkaddr++,
> > +                                                 WRITE_LIFE_NONE);
> >                             ASSERT(ret >=0);
> >                     }
> >             }
> > @@ -261,7 +264,8 @@ static void migrate_ssa(struct f2fs_sb_info *sbi,
> >             offset = MAIN_SEGS(sbi) - 1;
> >             while (blkaddr >= new_sum_blkaddr) {
> >                     if (blkaddr >= expand_sum_blkaddr) {
> > -                           ret = dev_write_block(zero_block, blkaddr--);
> > +                           ret = dev_write_block(zero_block, blkaddr--,
> > +                                                 WRITE_LIFE_NONE);
> >                             ASSERT(ret >=0);
> >                     } else {
> >                             move_ssa(sbi, offset--, blkaddr--);
> > @@ -360,7 +364,7 @@ static void migrate_nat(struct f2fs_sb_info *sbi,
> >                             (block_off & ((1 << sbi->log_blocks_per_seg) - 
> > 1)));
> >  
> >             /* new bitmap should be zeros */
> > -           ret = dev_write_block(nat_block, block_addr);
> > +           ret = dev_write_block(nat_block, block_addr, WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >     }
> >     /* zero out newly assigned nids */
> > @@ -381,7 +385,7 @@ static void migrate_nat(struct f2fs_sb_info *sbi,
> >             block_addr = (pgoff_t)(new_nat_blkaddr +
> >                             (seg_off << sbi->log_blocks_per_seg << 1) +
> >                             (block_off & ((1 << sbi->log_blocks_per_seg) - 
> > 1)));
> > -           ret = dev_write_block(nat_block, block_addr);
> > +           ret = dev_write_block(nat_block, block_addr, WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >             DBG(3, "Write NAT: %lx\n", block_addr);
> >     }
> > @@ -407,7 +411,8 @@ static void migrate_sit(struct f2fs_sb_info *sbi,
> >  
> >     /* initialize with zeros */
> >     for (index = 0; index < sit_blks; index++) {
> > -           ret = dev_write_block(sit_blk, get_newsb(sit_blkaddr) + index);
> > +           ret = dev_write_block(sit_blk, get_newsb(sit_blkaddr) + index,
> > +                                 WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >             DBG(3, "Write zero sit: %x\n", get_newsb(sit_blkaddr) + index);
> >     }
> > @@ -425,7 +430,8 @@ static void migrate_sit(struct f2fs_sb_info *sbi,
> >  
> >             if (ofs != pre_ofs) {
> >                     blk_addr = get_newsb(sit_blkaddr) + pre_ofs;
> > -                   ret = dev_write_block(sit_blk, blk_addr);
> > +                   ret = dev_write_block(sit_blk, blk_addr,
> > +                                         WRITE_LIFE_NONE);
> >                     ASSERT(ret >= 0);
> >                     DBG(1, "Write valid sit: %x\n", blk_addr);
> >  
> > @@ -439,7 +445,7 @@ static void migrate_sit(struct f2fs_sb_info *sbi,
> >                                                     se->valid_blocks);
> >     }
> >     blk_addr = get_newsb(sit_blkaddr) + ofs;
> > -   ret = dev_write_block(sit_blk, blk_addr);
> > +   ret = dev_write_block(sit_blk, blk_addr, WRITE_LIFE_NONE);
> >     DBG(1, "Write valid sit: %x\n", blk_addr);
> >     ASSERT(ret >= 0);
> >  
> > @@ -558,12 +564,12 @@ static void rebuild_checkpoint(struct f2fs_sb_info 
> > *sbi,
> >             new_cp_blk_no += 1 << get_sb(log_blocks_per_seg);
> >  
> >     /* write first cp */
> > -   ret = dev_write_block(new_cp, new_cp_blk_no++);
> > +   ret = dev_write_block(new_cp, new_cp_blk_no++, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     memset(buf, 0, F2FS_BLKSIZE);
> >     for (i = 0; i < get_newsb(cp_payload); i++) {
> > -           ret = dev_write_block(buf, new_cp_blk_no++);
> > +           ret = dev_write_block(buf, new_cp_blk_no++, WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >     }
> >  
> > @@ -573,7 +579,7 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
> >             ret = dev_read_block(buf, orphan_blk_no++);
> >             ASSERT(ret >= 0);
> >  
> > -           ret = dev_write_block(buf, new_cp_blk_no++);
> > +           ret = dev_write_block(buf, new_cp_blk_no++, WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >     }
> >  
> > @@ -581,12 +587,13 @@ static void rebuild_checkpoint(struct f2fs_sb_info 
> > *sbi,
> >     for (i = 0; i < NO_CHECK_TYPE; i++) {
> >             struct curseg_info *curseg = CURSEG_I(sbi, i);
> >  
> > -           ret = dev_write_block(curseg->sum_blk, new_cp_blk_no++);
> > +           ret = dev_write_block(curseg->sum_blk, new_cp_blk_no++,
> > +                                 WRITE_LIFE_NONE);
> >             ASSERT(ret >= 0);
> >     }
> >  
> >     /* write the last cp */
> > -   ret = dev_write_block(new_cp, new_cp_blk_no++);
> > +   ret = dev_write_block(new_cp, new_cp_blk_no++, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     /* Write nat bits */
> > @@ -595,7 +602,7 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
> >  
> >     /* disable old checkpoint */
> >     memset(buf, 0, F2FS_BLKSIZE);
> > -   ret = dev_write_block(buf, old_cp_blk_no);
> > +   ret = dev_write_block(buf, old_cp_blk_no, WRITE_LIFE_NONE);
> >     ASSERT(ret >= 0);
> >  
> >     free(buf);
> > diff --git a/fsck/segment.c b/fsck/segment.c
> > index 9bea105..96de22a 100644
> > --- a/fsck/segment.c
> > +++ b/fsck/segment.c
> > @@ -322,12 +322,16 @@ static u64 f2fs_write_ex(struct f2fs_sb_info *sbi, 
> > nid_t ino, u8 *buffer,
> >             ASSERT(remained_blkentries > 0);
> >  
> >             if (!has_data) {
> > +                   struct seg_entry *se;
> > +
> > +                   se = get_seg_entry(sbi, GET_SEGNO(sbi, 
> > dn.node_blkaddr));
> >                     dn.data_blkaddr = addr_type;
> >                     set_data_blkaddr(&dn);
> >                     idirty |= dn.idirty;
> >                     if (dn.ndirty) {
> >                             ret = dn.alloced ? dev_write_block(dn.node_blk,
> > -                                   dn.node_blkaddr) :
> > +                                   dn.node_blkaddr,
> > +                                   f2fs_io_type_to_rw_hint(se->type)) :
> >                                     update_block(sbi, dn.node_blk,
> >                                     &dn.node_blkaddr, NULL);
> >                             ASSERT(ret >= 0);
> > @@ -365,7 +369,8 @@ static u64 f2fs_write_ex(struct f2fs_sb_info *sbi, 
> > nid_t ino, u8 *buffer,
> >  
> >             if (c.zoned_model == F2FS_ZONED_HM) {
> >                     if (datablk_alloced) {
> > -                           ret = dev_write_block(wbuf, blkaddr);
> > +                           ret = dev_write_block(wbuf, blkaddr,
> > +                                   
> > f2fs_io_type_to_rw_hint(CURSEG_WARM_DATA));
> >                     } else {
> >                             ret = update_block(sbi, wbuf, &blkaddr,
> >                                             dn.node_blk);
> > @@ -375,7 +380,8 @@ static u64 f2fs_write_ex(struct f2fs_sb_info *sbi, 
> > nid_t ino, u8 *buffer,
> >                                     dn.ndirty = 1;
> >                     }
> >             } else {
> > -                   ret = dev_write_block(wbuf, blkaddr);
> > +                   ret = dev_write_block(wbuf, blkaddr,
> > +                                   
> > f2fs_io_type_to_rw_hint(CURSEG_WARM_DATA));
> >             }
> >             ASSERT(ret >= 0);
> >  
> > @@ -386,8 +392,11 @@ static u64 f2fs_write_ex(struct f2fs_sb_info *sbi, 
> > nid_t ino, u8 *buffer,
> >  
> >             dn.ofs_in_node++;
> >             if ((--remained_blkentries == 0 || count == 0) && (dn.ndirty)) {
> > +                   struct seg_entry *se;
> > +                   se = get_seg_entry(sbi, GET_SEGNO(sbi, 
> > dn.node_blkaddr));
> >                     ret = dn.alloced ?
> > -                           dev_write_block(dn.node_blk, dn.node_blkaddr) :
> > +                           dev_write_block(dn.node_blk, dn.node_blkaddr,
> > +                                           
> > f2fs_io_type_to_rw_hint(se->type)) :
> >                             update_block(sbi, dn.node_blk, 
> > &dn.node_blkaddr, NULL);
> >                     ASSERT(ret >= 0);
> >             }
> > @@ -764,7 +773,7 @@ int update_block(struct f2fs_sb_info *sbi, void *buf, 
> > u32 *blkaddr,
> >     int ret, type;
> >  
> >     if (c.zoned_model != F2FS_ZONED_HM)
> > -           return dev_write_block(buf, old_blkaddr);
> > +           return dev_write_block(buf, old_blkaddr, WRITE_LIFE_NONE);
> >  
> >     /* update sit bitmap & valid_blocks && se->type for old block*/
> >     se = get_seg_entry(sbi, GET_SEGNO(sbi, old_blkaddr));
> > @@ -784,7 +793,7 @@ int update_block(struct f2fs_sb_info *sbi, void *buf, 
> > u32 *blkaddr,
> >             ASSERT(0);
> >     }
> >  
> > -   ret = dev_write_block(buf, new_blkaddr);
> > +   ret = dev_write_block(buf, new_blkaddr, f2fs_io_type_to_rw_hint(type));
> >     ASSERT(ret >= 0);
> >  
> >     *blkaddr = new_blkaddr;
> > diff --git a/fsck/xattr.c b/fsck/xattr.c
> > index 241e339..6373c06 100644
> > --- a/fsck/xattr.c
> > +++ b/fsck/xattr.c
> > @@ -95,6 +95,7 @@ void write_all_xattrs(struct f2fs_sb_info *sbi,
> >     u64 inline_size = inline_xattr_size(&inode->i);
> >     int ret;
> >     bool xattrblk_alloced = false;
> > +   struct seg_entry *se;
> >  
> >     memcpy(inline_xattr_addr(&inode->i), txattr_addr, inline_size);
> >  
> > @@ -126,8 +127,9 @@ void write_all_xattrs(struct f2fs_sb_info *sbi,
> >     xattr_addr = (void *)xattr_node;
> >     memcpy(xattr_addr, txattr_addr + inline_size,
> >                     F2FS_BLKSIZE - sizeof(struct node_footer));
> > -
> > -   ret = xattrblk_alloced ? dev_write_block(xattr_node, blkaddr) :
> > +   se = get_seg_entry(sbi, GET_SEGNO(sbi, blkaddr));
> > +   ret = xattrblk_alloced ? dev_write_block(xattr_node, blkaddr,
> > +                                   f2fs_io_type_to_rw_hint(se->type)) :
> >             update_block(sbi, xattr_node, &blkaddr, NULL);
> >  
> >  free_xattr_node:
> > diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> > index 15a1c82..d1c656d 100644
> > --- a/include/f2fs_fs.h
> > +++ b/include/f2fs_fs.h
> > @@ -60,6 +60,19 @@
> >  #include <linux/blkzoned.h>
> >  #endif
> >  
> > +#ifdef HAVE_LINUX_RW_HINT_H
> > +#include <linux/rw_hint.h>
> > +#else
> > +enum rw_hint {
> > +   WRITE_LIFE_NOT_SET      = 0,
> > +   WRITE_LIFE_NONE,
> > +   WRITE_LIFE_SHORT,
> > +   WRITE_LIFE_MEDIUM,
> > +   WRITE_LIFE_LONG,
> > +   WRITE_LIFE_EXTREME
> > +};
> > +#endif
> > +
> >  #ifdef HAVE_LIBSELINUX
> >  #include <selinux/selinux.h>
> >  #include <selinux/label.h>
> > @@ -1520,6 +1533,8 @@ struct f2fs_configuration {
> >     time_t fixed_time;
> >     int roll_forward;
> >     bool need_fsync;
> > +   bool need_whint;
> > +   int whint;
> >  
> >     /* mkfs parameters */
> >     int fake_seed;
> > @@ -1581,7 +1596,7 @@ extern unsigned int addrs_per_page(struct f2fs_inode 
> > *, bool);
> >  extern unsigned int f2fs_max_file_offset(struct f2fs_inode *);
> >  extern __u32 f2fs_inode_chksum(struct f2fs_node *);
> >  extern __u32 f2fs_checkpoint_chksum(struct f2fs_checkpoint *);
> > -extern int write_inode(struct f2fs_node *, u64);
> > +extern int write_inode(struct f2fs_node *, u64, enum rw_hint);
> >  
> >  extern int get_bits_in_byte(unsigned char n);
> >  extern int test_and_set_bit_le(u32, u8 *);
> > @@ -1618,15 +1633,16 @@ extern int dev_readahead(__u64, size_t);
> >  #else
> >  extern int dev_readahead(__u64, size_t UNUSED(len));
> >  #endif
> > -extern int dev_write(void *, __u64, size_t);
> > -extern int dev_write_block(void *, __u64);
> > +extern enum rw_hint f2fs_io_type_to_rw_hint(int);
> > +extern int dev_write(void *, __u64, size_t, enum rw_hint);
> > +extern int dev_write_block(void *, __u64, enum rw_hint);
> >  extern int dev_write_dump(void *, __u64, size_t);
> >  #if !defined(__MINGW32__)
> >  extern int dev_write_symlink(char *, size_t);
> >  #endif
> >  /* All bytes in the buffer must be 0 use dev_fill(). */
> > -extern int dev_fill(void *, __u64, size_t);
> > -extern int dev_fill_block(void *, __u64);
> > +extern int dev_fill(void *, __u64, size_t, enum rw_hint);
> > +extern int dev_fill_block(void *, __u64, enum rw_hint);
> >  
> >  extern int dev_read_block(void *, __u64);
> >  extern int dev_reada_block(__u64);
> > diff --git a/lib/libf2fs.c b/lib/libf2fs.c
> > index 1e0f422..ecd22d4 100644
> > --- a/lib/libf2fs.c
> > +++ b/lib/libf2fs.c
> > @@ -603,12 +603,12 @@ __u32 f2fs_checkpoint_chksum(struct f2fs_checkpoint 
> > *cp)
> >     return chksum;
> >  }
> >  
> > -int write_inode(struct f2fs_node *inode, u64 blkaddr)
> > +int write_inode(struct f2fs_node *inode, u64 blkaddr, enum rw_hint whint)
> >  {
> >     if (c.feature & F2FS_FEATURE_INODE_CHKSUM)
> >             inode->i.i_inode_checksum =
> >                     cpu_to_le32(f2fs_inode_chksum(inode));
> > -   return dev_write_block(inode, blkaddr);
> > +   return dev_write_block(inode, blkaddr, whint);
> >  }
> >  
> >  /*
> > @@ -1005,7 +1005,7 @@ int get_device_info(int i)
> >  #endif
> >  
> >     if (!c.sparse_mode) {
> > -           if (dev->zoned_model == F2FS_ZONED_HM && c.func == FSCK)
> > +           if (dev->zoned_model == F2FS_ZONED_HM)
> >                     flags |= O_DSYNC;
> >  
> >             if (S_ISBLK(stat_buf->st_mode) &&
> > diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c
> > index f39367a..c40d826 100644
> > --- a/lib/libf2fs_io.c
> > +++ b/lib/libf2fs_io.c
> > @@ -39,6 +39,11 @@
> >  #include <inttypes.h>
> >  #include "f2fs_fs.h"
> >  
> > +#ifdef HAVE_LINUX_FCNTL_H
> > +#define HAVE_ARCH_STRUCT_FLOCK
> > +#include <linux/fcntl.h>
> > +#endif
> > +
> >  struct f2fs_configuration c;
> >  
> >  #ifdef HAVE_SPARSE_SPARSE_H
> > @@ -553,11 +558,86 @@ int dev_readahead(__u64 offset, size_t UNUSED(len))
> >     return 0;
> >  #endif
> >  }
> > +/*
> > + * Copied from fs/f2fs/segment.c
> > + */
> > +/*
> > + * This returns write hints for each segment type. This hints will be
> > + * passed down to block layer as below by default.
> > + *
> > + * User                  F2FS                     Block
> > + * ----                  ----                     -----
> > + *                       META                     WRITE_LIFE_NONE|REQ_META
> > + *                       HOT_NODE                 WRITE_LIFE_NONE
> > + *                       WARM_NODE                WRITE_LIFE_MEDIUM
> > + *                       COLD_NODE                WRITE_LIFE_LONG
> > + * ioctl(COLD)           COLD_DATA                WRITE_LIFE_EXTREME
> > + * extension list        "                        "
> > + *
> > + * -- buffered io
> > + *                       COLD_DATA                WRITE_LIFE_EXTREME
> > + *                       HOT_DATA                 WRITE_LIFE_SHORT
> > + *                       WARM_DATA                WRITE_LIFE_NOT_SET
> > + *
> > + * -- direct io
> > + * WRITE_LIFE_EXTREME    COLD_DATA                WRITE_LIFE_EXTREME
> > + * WRITE_LIFE_SHORT      HOT_DATA                 WRITE_LIFE_SHORT
> > + * WRITE_LIFE_NOT_SET    WARM_DATA                WRITE_LIFE_NOT_SET
> > + * WRITE_LIFE_NONE       "                        WRITE_LIFE_NONE
> > + * WRITE_LIFE_MEDIUM     "                        WRITE_LIFE_MEDIUM
> > + * WRITE_LIFE_LONG       "                        WRITE_LIFE_LONG
> > + */
> > +enum rw_hint f2fs_io_type_to_rw_hint(int seg_type)
> > +{
> > +   switch (seg_type) {
> > +   case CURSEG_WARM_DATA:
> > +           return WRITE_LIFE_NOT_SET;
> > +   case CURSEG_HOT_DATA:
> > +           return WRITE_LIFE_SHORT;
> > +   case CURSEG_COLD_DATA:
> > +           return WRITE_LIFE_EXTREME;
> > +   case CURSEG_WARM_NODE:
> > +           return WRITE_LIFE_MEDIUM;
> > +   case CURSEG_HOT_NODE:
> > +           return WRITE_LIFE_NONE;
> > +   case CURSEG_COLD_NODE:
> > +           return WRITE_LIFE_LONG;
> > +   default:
> > +           return WRITE_LIFE_NONE;
> > +   }
> > +}
> >  
> > -int dev_write(void *buf, __u64 offset, size_t len)
> > +static int __dev_write(void *buf, __u64 offset, size_t len, enum rw_hint 
> > whint)
> >  {
> > +   bool set_whint = (c.need_whint && (c.whint != whint));
> >     int fd;
> >  
> > +   fd = __get_device_fd(&offset);
> > +   if (fd < 0)
> > +           return fd;
> > +
> > +   if (lseek(fd, (off_t)offset, SEEK_SET) < 0)
> > +           return -1;
> > +
> > +   if (set_whint) {
> > +           u64 hint = whint;
> > +           int ret;
> > +
> > +           ret = fcntl(fd, F_SET_RW_HINT, &hint);
> > +           if (ret != -1)
> > +                   c.whint = whint;
> > +   }
> > +
> > +   if (write(fd, buf, len) < 0)
> > +           return -1;
> > +
> > +   c.need_fsync = true;
> > +
> > +   return 0;
> > +}
> > +
> > +int dev_write(void *buf, __u64 offset, size_t len, enum rw_hint whint)
> > +{
> >     if (c.dry_run)
> >             return 0;
> >  
> > @@ -572,21 +652,12 @@ int dev_write(void *buf, __u64 offset, size_t len)
> >     if (dcache_update_cache(buf, offset, len) < 0)
> >             return -1;
> >  
> > -   fd = __get_device_fd(&offset);
> > -   if (fd < 0)
> > -           return fd;
> > -
> > -   if (lseek(fd, (off_t)offset, SEEK_SET) < 0)
> > -           return -1;
> > -   if (write(fd, buf, len) < 0)
> > -           return -1;
> > -   c.need_fsync = true;
> > -   return 0;
> > +   return __dev_write(buf, offset, len, whint);
> >  }
> >  
> > -int dev_write_block(void *buf, __u64 blk_addr)
> > +int dev_write_block(void *buf, __u64 blk_addr, enum rw_hint whint)
> >  {
> > -   return dev_write(buf, blk_addr << F2FS_BLKSIZE_BITS, F2FS_BLKSIZE);
> > +   return dev_write(buf, blk_addr << F2FS_BLKSIZE_BITS, F2FS_BLKSIZE, 
> > whint);
> >  }
> >  
> >  int dev_write_dump(void *buf, __u64 offset, size_t len)
> > @@ -608,32 +679,22 @@ int dev_write_symlink(char *buf, size_t len)
> >  }
> >  #endif
> >  
> > -int dev_fill(void *buf, __u64 offset, size_t len)
> > +int dev_fill(void *buf, __u64 offset, size_t len, enum rw_hint whint)
> >  {
> > -   int fd;
> > -
> >     if (c.sparse_mode)
> >             return sparse_write_zeroed_blk(offset / F2FS_BLKSIZE,
> >                                             len / F2FS_BLKSIZE);
> >  
> > -   fd = __get_device_fd(&offset);
> > -   if (fd < 0)
> > -           return fd;
> > -
> >     /* Only allow fill to zero */
> >     if (*((__u8*)buf))
> >             return -1;
> > -   if (lseek(fd, (off_t)offset, SEEK_SET) < 0)
> > -           return -1;
> > -   if (write(fd, buf, len) < 0)
> > -           return -1;
> > -   c.need_fsync = true;
> > -   return 0;
> > +
> > +   return __dev_write(buf, offset, len, whint);
> >  }
> >  
> > -int dev_fill_block(void *buf, __u64 blk_addr)
> > +int dev_fill_block(void *buf, __u64 blk_addr, enum rw_hint whint)
> >  {
> > -   return dev_fill(buf, blk_addr << F2FS_BLKSIZE_BITS, F2FS_BLKSIZE);
> > +   return dev_fill(buf, blk_addr << F2FS_BLKSIZE_BITS, F2FS_BLKSIZE, 
> > whint);
> >  }
> >  
> >  int dev_read_block(void *buf, __u64 blk_addr)
> > diff --git a/man/defrag.f2fs.8 b/man/defrag.f2fs.8
> > index 34113de..fcbe3bc 100644
> > --- a/man/defrag.f2fs.8
> > +++ b/man/defrag.f2fs.8
> > @@ -18,6 +18,9 @@ defrag.f2fs \- relocate blocks in a given area to the 
> > specified region
> >  .I target block address
> >  ]
> >  [
> > +.B \-H
> > +]
> > +[
> >  .B \-i
> >  .I direction
> >  ]
> > @@ -53,6 +56,9 @@ Specify the number of blocks to move.
> >  .BI \-t " target block address"
> >  Specify the destination block address.
> >  .TP
> > +.BI \-H
> > +Specify support write hint.
> > +.TP
> >  .BI \-i " direction"
> >  Set the direction to left. If it is not set, the direction becomes right
> >  by default.
> > diff --git a/man/fsck.f2fs.8 b/man/fsck.f2fs.8
> > index aff4ff2..e39a846 100644
> > --- a/man/fsck.f2fs.8
> > +++ b/man/fsck.f2fs.8
> > @@ -14,6 +14,9 @@ fsck.f2fs \- check a Linux F2FS file system
> >  .I enable force fix
> >  ]
> >  [
> > +.B \-H
> > +]
> > +[
> >  .B \-M
> >  .I show file map
> >  ]
> > @@ -48,6 +51,9 @@ module. It is disabled by default.
> >  .BI \-f " enable force fix"
> >  Enable to fix all the inconsistency in the partition.
> >  .TP
> > +.BI \-H
> > +Specify support write hint.
> > +.TP
> >  .BI \-M " show files map"
> >  Enable to show all the filenames and inode numbers stored in the image
> >  .TP
> > diff --git a/man/mkfs.f2fs.8 b/man/mkfs.f2fs.8
> > index 1f0c724..de885be 100644
> > --- a/man/mkfs.f2fs.8
> > +++ b/man/mkfs.f2fs.8
> > @@ -31,6 +31,9 @@ mkfs.f2fs \- create an F2FS file system
> >  .I default-options
> >  ]
> >  [
> > +.B \-H
> > +]
> > +[
> >  .B \-i
> >  ]
> >  [
> > @@ -152,6 +155,9 @@ The following values are supported:
> >  Use default options for Android having "-d1 -f -w 4096 -R 0:0 -O encrypt 
> > -O project_quota,extra_attr,{quota} -O verity".
> >  .RE
> >  .TP
> > +.BI \-H
> > +Specify support write hint.
> > +.TP
> >  .BI \-i
> >  Enable extended node bitmap.
> >  .TP
> > diff --git a/man/resize.f2fs.8 b/man/resize.f2fs.8
> > index 3288760..d41ad79 100644
> > --- a/man/resize.f2fs.8
> > +++ b/man/resize.f2fs.8
> > @@ -18,6 +18,9 @@ resize.f2fs \- resize filesystem size
> >  .I overprovision-ratio-percentage
> >  ]
> >  [
> > +.B \-H
> > +]
> > +[
> >  .B \-i
> >  ]
> >  [
> > @@ -53,6 +56,9 @@ Specify the percentage of the volume that will be used as 
> > overprovision area.
> >  This area is hidden to users, and utilized by F2FS cleaner. If not 
> > specified, the
> >  best number will be assigned automatically according to the partition size.
> >  .TP
> > +.BI \-H
> > +Specify support write hint.
> > +.TP
> >  .BI \-i
> >  Enable extended node bitmap.
> >  .TP
> > diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
> > index 247a836..8960b71 100644
> > --- a/mkfs/f2fs_format.c
> > +++ b/mkfs/f2fs_format.c
> > @@ -640,7 +640,7 @@ static int f2fs_init_sit_area(void)
> >  
> >     DBG(1, "\tFilling sit area at offset 0x%08"PRIx64"\n", sit_seg_addr);
> >     for (index = 0; index < (get_sb(segment_count_sit) / 2); index++) {
> > -           if (dev_fill(zero_buf, sit_seg_addr, seg_size)) {
> > +           if (dev_fill(zero_buf, sit_seg_addr, seg_size, 
> > WRITE_LIFE_NONE)) {
> >                     MSG(1, "\tError: While zeroing out the sit area "
> >                                     "on disk!!!\n");
> >                     free(zero_buf);
> > @@ -674,7 +674,7 @@ static int f2fs_init_nat_area(void)
> >  
> >     DBG(1, "\tFilling nat area at offset 0x%08"PRIx64"\n", nat_seg_addr);
> >     for (index = 0; index < get_sb(segment_count_nat) / 2; index++) {
> > -           if (dev_fill(nat_buf, nat_seg_addr, seg_size)) {
> > +           if (dev_fill(nat_buf, nat_seg_addr, seg_size, WRITE_LIFE_NONE)) 
> > {
> >                     MSG(1, "\tError: While zeroing out the nat area "
> >                                     "on disk!!!\n");
> >                     free(nat_buf);
> > @@ -855,14 +855,14 @@ static int f2fs_write_check_point_pack(void)
> >  
> >     DBG(1, "\tWriting main segments, cp at offset 0x%08"PRIx64"\n",
> >                                             cp_seg_blk);
> > -   if (dev_write_block(cp, cp_seg_blk)) {
> > +   if (dev_write_block(cp, cp_seg_blk, WRITE_LIFE_NONE)) {
> >             MSG(1, "\tError: While writing the cp to disk!!!\n");
> >             goto free_cp_payload;
> >     }
> >  
> >     for (i = 0; i < get_sb(cp_payload); i++) {
> >             cp_seg_blk++;
> > -           if (dev_fill_block(cp_payload, cp_seg_blk)) {
> > +           if (dev_fill_block(cp_payload, cp_seg_blk, WRITE_LIFE_NONE)) {
> >                     MSG(1, "\tError: While zeroing out the sit bitmap area "
> >                                     "on disk!!!\n");
> >                     goto free_cp_payload;
> > @@ -943,7 +943,7 @@ static int f2fs_write_check_point_pack(void)
> >     cp_seg_blk++;
> >     DBG(1, "\tWriting Segment summary for HOT/WARM/COLD_DATA, at offset 
> > 0x%08"PRIx64"\n",
> >                     cp_seg_blk);
> > -   if (dev_write_block(sum_compact, cp_seg_blk)) {
> > +   if (dev_write_block(sum_compact, cp_seg_blk, WRITE_LIFE_NONE)) {
> >             MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
> >             goto free_cp_payload;
> >     }
> > @@ -957,7 +957,7 @@ static int f2fs_write_check_point_pack(void)
> >     cp_seg_blk++;
> >     DBG(1, "\tWriting Segment summary for HOT_NODE, at offset 
> > 0x%08"PRIx64"\n",
> >                     cp_seg_blk);
> > -   if (dev_write_block(sum, cp_seg_blk)) {
> > +   if (dev_write_block(sum, cp_seg_blk, WRITE_LIFE_NONE)) {
> >             MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
> >             goto free_cp_payload;
> >     }
> > @@ -969,7 +969,7 @@ static int f2fs_write_check_point_pack(void)
> >     cp_seg_blk++;
> >     DBG(1, "\tWriting Segment summary for WARM_NODE, at offset 
> > 0x%08"PRIx64"\n",
> >                     cp_seg_blk);
> > -   if (dev_write_block(sum, cp_seg_blk)) {
> > +   if (dev_write_block(sum, cp_seg_blk, WRITE_LIFE_NONE)) {
> >             MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
> >             goto free_cp_payload;
> >     }
> > @@ -980,7 +980,7 @@ static int f2fs_write_check_point_pack(void)
> >     cp_seg_blk++;
> >     DBG(1, "\tWriting Segment summary for COLD_NODE, at offset 
> > 0x%08"PRIx64"\n",
> >                     cp_seg_blk);
> > -   if (dev_write_block(sum, cp_seg_blk)) {
> > +   if (dev_write_block(sum, cp_seg_blk, WRITE_LIFE_NONE)) {
> >             MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
> >             goto free_cp_payload;
> >     }
> > @@ -988,7 +988,7 @@ static int f2fs_write_check_point_pack(void)
> >     /* cp page2 */
> >     cp_seg_blk++;
> >     DBG(1, "\tWriting cp page2, at offset 0x%08"PRIx64"\n", cp_seg_blk);
> > -   if (dev_write_block(cp, cp_seg_blk)) {
> > +   if (dev_write_block(cp, cp_seg_blk, WRITE_LIFE_NONE)) {
> >             MSG(1, "\tError: While writing the cp to disk!!!\n");
> >             goto free_cp_payload;
> >     }
> > @@ -1011,7 +1011,8 @@ static int f2fs_write_check_point_pack(void)
> >  
> >             for (i = 0; i < nat_bits_blocks; i++) {
> >                     if (dev_write_block(nat_bits + i *
> > -                                           F2FS_BLKSIZE, cp_seg_blk + i)) {
> > +                                           F2FS_BLKSIZE, cp_seg_blk + i,
> > +                                           WRITE_LIFE_NONE)) {
> >                             MSG(1, "\tError: write NAT bits to disk!!!\n");
> >                             goto free_cp_payload;
> >                     }
> > @@ -1029,14 +1030,14 @@ static int f2fs_write_check_point_pack(void)
> >     cp_seg_blk = get_sb(segment0_blkaddr) + c.blks_per_seg;
> >     DBG(1, "\tWriting cp page 1 of checkpoint pack 2, at offset 
> > 0x%08"PRIx64"\n",
> >                             cp_seg_blk);
> > -   if (dev_write_block(cp, cp_seg_blk)) {
> > +   if (dev_write_block(cp, cp_seg_blk, WRITE_LIFE_NONE)) {
> >             MSG(1, "\tError: While writing the cp to disk!!!\n");
> >             goto free_cp_payload;
> >     }
> >  
> >     for (i = 0; i < get_sb(cp_payload); i++) {
> >             cp_seg_blk++;
> > -           if (dev_fill_block(cp_payload, cp_seg_blk)) {
> > +           if (dev_fill_block(cp_payload, cp_seg_blk, WRITE_LIFE_NONE)) {
> >                     MSG(1, "\tError: While zeroing out the sit bitmap area "
> >                                     "on disk!!!\n");
> >                     goto free_cp_payload;
> > @@ -1048,7 +1049,7 @@ static int f2fs_write_check_point_pack(void)
> >                                     get_sb(cp_payload) - 1);
> >     DBG(1, "\tWriting cp page 2 of checkpoint pack 2, at offset 
> > 0x%08"PRIx64"\n",
> >                             cp_seg_blk);
> > -   if (dev_write_block(cp, cp_seg_blk)) {
> > +   if (dev_write_block(cp, cp_seg_blk, WRITE_LIFE_NONE)) {
> >             MSG(1, "\tError: While writing the cp to disk!!!\n");
> >             goto free_cp_payload;
> >     }
> > @@ -1082,7 +1083,7 @@ static int f2fs_write_super_block(void)
> >     memcpy(zero_buff + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
> >     DBG(1, "\tWriting super block, at offset 0x%08x\n", 0);
> >     for (index = 0; index < 2; index++) {
> > -           if (dev_write_block(zero_buff, index)) {
> > +           if (dev_write_block(zero_buff, index, WRITE_LIFE_NONE)) {
> >                     MSG(1, "\tError: While while writing super_blk "
> >                                     "on disk!!! index : %d\n", index);
> >                     free(zero_buff);
> > @@ -1135,7 +1136,8 @@ static int f2fs_discard_obsolete_dnode(void)
> >             memset(raw_node, 0, F2FS_BLKSIZE);
> >  
> >             DBG(1, "\tDiscard dnode, at offset 0x%08"PRIx64"\n", offset);
> > -           if (dev_write_block(raw_node, offset)) {
> > +           if (dev_write_block(raw_node, offset,
> > +                               f2fs_io_type_to_rw_hint(CURSEG_WARM_NODE))) 
> > {
> >                     MSG(1, "\tError: While discarding direct node!!!\n");
> >                     free(raw_node);
> >                     return -1;
> > @@ -1256,7 +1258,8 @@ static block_t f2fs_add_default_dentry_root(void)
> >     data_blkaddr = alloc_next_free_block(CURSEG_HOT_DATA);
> >  
> >     DBG(1, "\tWriting default dentry root, at offset 0x%x\n", data_blkaddr);
> > -   if (dev_write_block(dent_blk, data_blkaddr)) {
> > +   if (dev_write_block(dent_blk, data_blkaddr,
> > +                       f2fs_io_type_to_rw_hint(CURSEG_HOT_DATA))) {
> >             MSG(1, "\tError: While writing the dentry_blk to disk!!!\n");
> >             free(dent_blk);
> >             return 0;
> > @@ -1301,7 +1304,8 @@ static int f2fs_write_root_inode(void)
> >     F2FS_NODE_FOOTER(raw_node)->next_blkaddr = cpu_to_le32(node_blkaddr + 
> > 1);
> >  
> >     DBG(1, "\tWriting root inode (hot node), offset 0x%x\n", node_blkaddr);
> > -   if (write_inode(raw_node, node_blkaddr) < 0) {
> > +   if (write_inode(raw_node, node_blkaddr,
> > +                   f2fs_io_type_to_rw_hint(CURSEG_HOT_NODE)) < 0) {
> >             MSG(1, "\tError: While writing the raw_node to disk!!!\n");
> >             free(raw_node);
> >             return -1;
> > @@ -1377,7 +1381,8 @@ static int f2fs_write_default_quota(int qtype, __le32 
> > raw_id)
> >     for (i = 0; i < QUOTA_DATA; i++) {
> >             blkaddr = alloc_next_free_block(CURSEG_HOT_DATA);
> >  
> > -           if (dev_write_block(filebuf + i * F2FS_BLKSIZE, blkaddr)) {
> > +           if (dev_write_block(filebuf + i * F2FS_BLKSIZE, blkaddr,
> > +                               f2fs_io_type_to_rw_hint(CURSEG_HOT_DATA))) {
> >                     MSG(1, "\tError: While writing the quota_blk to 
> > disk!!!\n");
> >                     free(filebuf);
> >                     return 0;
> > @@ -1439,7 +1444,8 @@ static int f2fs_write_qf_inode(int qtype)
> >                                     cpu_to_le32(data_blkaddr + i);
> >  
> >     DBG(1, "\tWriting quota inode (hot node), offset 0x%x\n", node_blkaddr);
> > -   if (write_inode(raw_node, node_blkaddr) < 0) {
> > +   if (write_inode(raw_node, node_blkaddr,
> > +                   f2fs_io_type_to_rw_hint(CURSEG_HOT_NODE)) < 0) {
> >             MSG(1, "\tError: While writing the raw_node to disk!!!\n");
> >             free(raw_node);
> >             return -1;
> > @@ -1476,7 +1482,7 @@ static int f2fs_update_nat_default(void)
> >  
> >     DBG(1, "\tWriting nat root, at offset 0x%08"PRIx64"\n",
> >                                     nat_seg_blk_offset);
> > -   if (dev_write_block(nat_blk, nat_seg_blk_offset)) {
> > +   if (dev_write_block(nat_blk, nat_seg_blk_offset, WRITE_LIFE_NONE)) {
> >             MSG(1, "\tError: While writing the nat_blk set0 to disk!\n");
> >             free(nat_blk);
> >             return -1;
> > @@ -1516,7 +1522,8 @@ static block_t f2fs_add_default_dentry_lpf(void)
> >  
> >     DBG(1, "\tWriting default dentry lost+found, at offset 0x%x\n",
> >                                                     data_blkaddr);
> > -   if (dev_write_block(dent_blk, data_blkaddr)) {
> > +   if (dev_write_block(dent_blk, data_blkaddr,
> > +                       f2fs_io_type_to_rw_hint(CURSEG_HOT_DATA))) {
> >             MSG(1, "\tError While writing the dentry_blk to disk!!!\n");
> >             free(dent_blk);
> >             return 0;
> > @@ -1563,7 +1570,8 @@ static int f2fs_write_lpf_inode(void)
> >  
> >     DBG(1, "\tWriting lost+found inode (hot node), offset 0x%x\n",
> >                                                             node_blkaddr);
> > -   if (write_inode(raw_node, node_blkaddr) < 0) {
> > +   if (write_inode(raw_node, node_blkaddr,
> > +                   f2fs_io_type_to_rw_hint(CURSEG_HOT_NODE)) < 0) {
> >             MSG(1, "\tError: While writing the raw_node to disk!!!\n");
> >             err = -1;
> >             goto exit;
> > diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
> > index c98e73c..d9cdd61 100644
> > --- a/mkfs/f2fs_format_main.c
> > +++ b/mkfs/f2fs_format_main.c
> > @@ -56,6 +56,7 @@ static void mkfs_usage()
> >     MSG(0, "  -E [hot file ext list] e.g. \"db\"\n");
> >     MSG(0, "  -f force overwrite of the existing filesystem\n");
> >     MSG(0, "  -g add default options\n");
> > +   MSG(0, "  -H support write hint\n");
> >     MSG(0, "  -i extended node bitmap, node ratio is 20%% by default\n");
> >     MSG(0, "  -l label\n");
> >     MSG(0, "  -U uuid\n");
> > @@ -173,7 +174,7 @@ static void add_default_options(void)
> >  
> >  static void f2fs_parse_options(int argc, char *argv[])
> >  {
> > -   static const char *option_string = 
> > "qa:b:c:C:d:e:E:g:hil:mo:O:rR:s:S:z:t:T:U:Vfw:Z:";
> > +   static const char *option_string = 
> > "qa:b:c:C:d:e:E:g:hHil:mo:O:rR:s:S:z:t:T:U:Vfw:Z:";
> >     static const struct option long_opts[] = {
> >             { .name = "help", .has_arg = 0, .flag = NULL, .val = 'h' },
> >             { .name = NULL, .has_arg = 0, .flag = NULL, .val = 0 }
> > @@ -228,6 +229,10 @@ static void f2fs_parse_options(int argc, char *argv[])
> >             case 'h':
> >                     mkfs_usage();
> >                     break;
> > +           case 'H':
> > +                   c.need_whint = true;
> > +                   c.whint = WRITE_LIFE_NOT_SET;
> > +                   break;
> >             case 'i':
> >                     c.large_nat_bitmap = 1;
> >                     break;
> > @@ -475,7 +480,7 @@ int main(int argc, char *argv[])
> >             }
> >             /* wipe out other FS magics mostly first 4MB space */
> >             for (i = 0; i < 1024; i++)
> > -                   if (dev_fill_block(zero_buf, i))
> > +                   if (dev_fill_block(zero_buf, i, WRITE_LIFE_NONE))
> >                             break;
> >             free(zero_buf);
> >             if (i != 1024) {
> > -- 
> > 2.25.1
> 
> 
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to