1. 06 4月, 2019 1 次提交
    • D
      f2fs: Fix use of number of devices · 0916878d
      Damien Le Moal 提交于
      For a single device mount using a zoned block device, the zone
      information for the device is stored in the sbi->devs single entry
      array and sbi->s_ndevs is set to 1. This differs from a single device
      mount using a regular block device which does not allocate sbi->devs
      and sets sbi->s_ndevs to 0.
      
      However, sbi->s_devs == 0 condition is used throughout the code to
      differentiate a single device mount from a multi-device mount where
      sbi->s_ndevs is always larger than 1. This results in problems with
      single zoned block device volumes as these are treated as multi-device
      mounts but do not have the start_blk and end_blk information set. One
      of the problem observed is skipping of zone discard issuing resulting in
      write commands being issued to full zones or unaligned to a zone write
      pointer.
      
      Fix this problem by simply treating the cases sbi->s_ndevs == 0 (single
      regular block device mount) and sbi->s_ndevs == 1 (single zoned block
      device mount) in the same manner. This is done by introducing the
      helper function f2fs_is_multi_device() and using this helper in place
      of direct tests of sbi->s_ndevs value, improving code readability.
      
      Fixes: 7bb3a371 ("f2fs: Fix zoned block device support")
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NDamien Le Moal <damien.lemoal@wdc.com>
      Reviewed-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      0916878d
  2. 13 3月, 2019 5 次提交
  3. 06 3月, 2019 1 次提交
    • C
      f2fs: fix potential data inconsistence of checkpoint · c42d28ce
      Chao Yu 提交于
      Previously, we changed lock from cp_rwsem to node_change, it solved
      the deadlock issue which was caused by below race condition:
      
      Thread A			Thread B
      - f2fs_setattr
       - f2fs_lock_op  -- read_lock
       - dquot_transfer
        - __dquot_transfer
         - dquot_acquire
          - commit_dqblk
           - f2fs_quota_write
            - f2fs_write_begin
             - f2fs_write_failed
      				- write_checkpoint
      				 - block_operations
      				  - f2fs_lock_all  -- write_lock
              - f2fs_truncate_blocks
               - f2fs_lock_op  -- read_lock
      
      But it breaks the sematics of cp_rwsem, in other callers like:
      - f2fs_file_write_iter -> f2fs_write_begin -> f2fs_write_failed
      - f2fs_direct_IO -> f2fs_write_failed
      
      We allow to truncate dnode w/o cp_rwsem held, result in incorrect sit
      bitmap update, which can cause further data corruption.
      
      So this patch reverts previous fix implementation, and try to fix
      deadlock by skipping calling f2fs_truncate_blocks() in f2fs_write_failed()
      only for quota file, and keep the preallocated data/node in the tail of
      quota file, we can expecte that the preallocated space can be used to
      store quota info latter soon.
      
      Fixes: af033b2a ("f2fs: guarantee journalled quota data by checkpoint")
      Signed-off-by: NGao Xiang <gaoxiang25@huawei.com>
      Signed-off-by: NSheng Yong <shengyong1@huawei.com>
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      c42d28ce
  4. 15 2月, 2019 1 次提交
  5. 24 1月, 2019 1 次提交
  6. 09 1月, 2019 1 次提交
  7. 29 12月, 2018 1 次提交
  8. 27 12月, 2018 2 次提交
    • C
      f2fs: check PageWriteback flag for ordered case · bae0ee7a
      Chao Yu 提交于
      For all ordered cases in f2fs_wait_on_page_writeback(), we need to
      check PageWriteback status, so let's clean up to relocate the check
      into f2fs_wait_on_page_writeback().
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      bae0ee7a
    • J
      f2fs: use kvmalloc, if kmalloc is failed · 5222595d
      Jaegeuk Kim 提交于
      One report says memalloc failure during mount.
      
       (unwind_backtrace) from [<c010cd4c>] (show_stack+0x10/0x14)
       (show_stack) from [<c049c6b8>] (dump_stack+0x8c/0xa0)
       (dump_stack) from [<c024fcf0>] (warn_alloc+0xc4/0x160)
       (warn_alloc) from [<c0250218>] (__alloc_pages_nodemask+0x3f4/0x10d0)
       (__alloc_pages_nodemask) from [<c0270450>] (kmalloc_order_trace+0x2c/0x120)
       (kmalloc_order_trace) from [<c03fa748>] (build_node_manager+0x35c/0x688)
       (build_node_manager) from [<c03de494>] (f2fs_fill_super+0xf0c/0x16cc)
       (f2fs_fill_super) from [<c02a5864>] (mount_bdev+0x15c/0x188)
       (mount_bdev) from [<c03da624>] (f2fs_mount+0x18/0x20)
       (f2fs_mount) from [<c02a68b8>] (mount_fs+0x158/0x19c)
       (mount_fs) from [<c02c3c9c>] (vfs_kern_mount+0x78/0x134)
       (vfs_kern_mount) from [<c02c76ac>] (do_mount+0x474/0xca4)
       (do_mount) from [<c02c8264>] (SyS_mount+0x94/0xbc)
       (SyS_mount) from [<c0108180>] (ret_fast_syscall+0x0/0x48)
      Reviewed-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      5222595d
  9. 14 12月, 2018 1 次提交
  10. 27 11月, 2018 6 次提交
    • J
      f2fs: fix m_may_create to make OPU DIO write correctly · f4f0b677
      Jia Zhu 提交于
      Previously, we added a parameter @map.m_may_create to trigger OPU
      allocation and call f2fs_balance_fs() correctly.
      
      But in get_more_blocks(), @create has been overwritten by below code.
      So the function f2fs_map_blocks() will not allocate new block address
      but directly go out. Meanwile,there are several functions calling
      f2fs_map_blocks() directly and @map.m_may_create not initialized.
      CODE:
      create = dio->op == REQ_OP_WRITE;
      	if (dio->flags & DIO_SKIP_HOLES) {
      		if (fs_startblk <= ((i_size_read(dio->inode) - 1) >>
      						i_blkbits))
      			create = 0;
      	}
      
      This patch fixes it.
      Signed-off-by: NJia Zhu <zhujia13@huawei.com>
      Reviewed-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      f4f0b677
    • J
      f2fs: fix to update new block address correctly for OPU · 73c0a927
      Jia Zhu 提交于
      Previously, we allocated a new block address for OPU mode in direct_IO.
      
      But the new address couldn't be assigned to @map->m_pblk correctly.
      
      This patch fix it.
      
      Cc: <stable@vger.kernel.org>
      Fixes: 511f52d02f05 ("f2fs: allow out-place-update for direct IO in LFS mode")
      Signed-off-by: NJia Zhu <zhujia13@huawei.com>
      Reviewed-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      73c0a927
    • S
      f2fs: fix race between write_checkpoint and write_begin · 2866fb16
      Sheng Yong 提交于
      The following race could lead to inconsistent SIT bitmap:
      
      Task A                          Task B
      ======                          ======
      f2fs_write_checkpoint
        block_operations
          f2fs_lock_all
            down_write(node_change)
            down_write(node_write)
            ... sync ...
            up_write(node_change)
                                      f2fs_file_write_iter
                                        set_inode_flag(FI_NO_PREALLOC)
                                        ......
                                        f2fs_write_begin(index=0, has inline data)
                                          prepare_write_begin
                                            __do_map_lock(AIO) => down_read(node_change)
                                            f2fs_convert_inline_page => update SIT
                                            __do_map_lock(AIO) => up_read(node_change)
        f2fs_flush_sit_entries <= inconsistent SIT
        finish write checkpoint
        sudden-power-off
      
      If SPO occurs after checkpoint is finished, SIT bitmap will be set
      incorrectly.
      Signed-off-by: NSheng Yong <shengyong1@huawei.com>
      Reviewed-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      2866fb16
    • Y
      f2fs: only flush the single temp bio cache which owns the target page · 1e771e83
      Yunlong Song 提交于
      Previously, when f2fs finds which temp bio cache owns the target page,
      it will flush all the three temp bio caches, but we only need to flush
      one single bio cache indeed, which can help to keep bio merged.
      Signed-off-by: NYunlong Song <yunlong.song@huawei.com>
      Reviewed-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      1e771e83
    • C
      f2fs: fix out-place-update DIO write · f9d6d059
      Chao Yu 提交于
      In get_more_blocks(), we may override @create as below code:
      
      	create = dio->op == REQ_OP_WRITE;
      	if (dio->flags & DIO_SKIP_HOLES) {
      		if (fs_startblk <= ((i_size_read(dio->inode) - 1) >>
      						i_blkbits))
      			create = 0;
      	}
      
      But in f2fs_map_blocks(), we only trigger f2fs_balance_fs() if @create
      is 1, so in LFS mode, dio overwrite under LFS mode can easily run out
      of free segments, result in below panic.
      
       Call Trace:
        allocate_segment_by_default+0xa8/0x270 [f2fs]
        f2fs_allocate_data_block+0x1ea/0x5c0 [f2fs]
        __allocate_data_block+0x306/0x480 [f2fs]
        f2fs_map_blocks+0x6f6/0x920 [f2fs]
        __get_data_block+0x4f/0xb0 [f2fs]
        get_data_block_dio_write+0x50/0x60 [f2fs]
        do_blockdev_direct_IO+0xcd5/0x21e0
        __blockdev_direct_IO+0x3a/0x3c
        f2fs_direct_IO+0x1ff/0x4a0 [f2fs]
        generic_file_direct_write+0xd9/0x160
        __generic_file_write_iter+0xbb/0x1e0
        f2fs_file_write_iter+0xaf/0x220 [f2fs]
        __vfs_write+0xd0/0x130
        vfs_write+0xb2/0x1b0
        SyS_pwrite64+0x69/0xa0
        ? vtime_user_exit+0x29/0x70
        do_syscall_64+0x6e/0x160
        entry_SYSCALL64_slow_path+0x25/0x25
       RIP: new_curseg+0x36f/0x380 [f2fs] RSP: ffffac570393f7a8
      
      So this patch introduces a parameter map.m_may_create to indicate that
      f2fs_map_blocks() is called from write or read path, which can give the
      right hint to let f2fs_map_blocks() trigger OPU allocation and call
      f2fs_balanc_fs() correctly.
      
      BTW, it disables physical address preallocation for direct IO in
      f2fs_preallocate_blocks, which is redundant to OPU allocation of
      f2fs_map_blocks.
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      f9d6d059
    • C
      f2fs: add to account direct IO · 02b16d0a
      Chao Yu 提交于
      This patch adds f2fs_dio_submit_bio() to hook submit_io/end_io functions
      in direct IO path, in order to account DIO.
      
      Later, we will add this count into is_idle() to let background GC/Discard
      thread be aware of DIO.
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      02b16d0a
  11. 23 10月, 2018 7 次提交
    • C
      f2fs: guarantee journalled quota data by checkpoint · af033b2a
      Chao Yu 提交于
      For journalled quota mode, let checkpoint to flush dquot dirty data
      and quota file data to guarntee persistence of all quota sysfile in
      last checkpoint, by this way, we can avoid corrupting quota sysfile
      when encountering SPO.
      
      The implementation is as below:
      
      1. add a global state SBI_QUOTA_NEED_FLUSH to indicate that there is
      cached dquot metadata changes in quota subsystem, and later checkpoint
      should:
       a) flush dquot metadata into quota file.
       b) flush quota file to storage to keep file usage be consistent.
      
      2. add a global state SBI_QUOTA_NEED_REPAIR to indicate that quota
      operation failed due to -EIO or -ENOSPC, so later,
       a) checkpoint will skip syncing dquot metadata.
       b) CP_QUOTA_NEED_FSCK_FLAG will be set in last cp pack to give a
          hint for fsck repairing.
      
      3. add a global state SBI_QUOTA_SKIP_FLUSH, in checkpoint, if quota
      data updating is very heavy, it may cause hungtask in block_operation().
      To avoid this, if our retry time exceed threshold, let's just skip
      flushing and retry in next checkpoint().
      Signed-off-by: NWeichao Guo <guoweichao@huawei.com>
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      [Jaegeuk Kim: avoid warnings and set fsck flag]
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      af033b2a
    • S
      f2fs: fix data corruption issue with hardware encryption · 1e78e8bd
      Sahitya Tummala 提交于
      Direct IO can be used in case of hardware encryption. The following
      scenario results into data corruption issue in this path -
      
      Thread A -                          Thread B-
      -> write file#1 in direct IO
                                          -> GC gets kicked in
                                          -> GC submitted bio on meta mapping
      				       for file#1, but pending completion
      -> write file#1 again with new data
         in direct IO
                                          -> GC bio gets completed now
                                          -> GC writes old data to the new
                                             location and thus file#1 is
      				       corrupted.
      
      Fix this by submitting and waiting for pending io on meta mapping
      for direct IO case in f2fs_map_blocks().
      Signed-off-by: NSahitya Tummala <stummala@codeaurora.org>
      Reviewed-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      1e78e8bd
    • C
      f2fs: fix to spread clear_cold_data() · 2baf0781
      Chao Yu 提交于
      We need to drop PG_checked flag on page as well when we clear PG_uptodate
      flag, in order to avoid treating the page as GCing one later.
      Signed-off-by: NWeichao Guo <guoweichao@huawei.com>
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      2baf0781
    • J
      Revert "f2fs: fix to clear PG_checked flag in set_page_dirty()" · 164a63fa
      Jaegeuk Kim 提交于
      This reverts commit 66110abc.
      
      If we clear the cold data flag out of the writeback flow, we can miscount
      -1 by end_io, which incurs a deadlock caused by all I/Os being blocked during
      heavy GC.
      
      Balancing F2FS Async:
       - IO (CP:    1, Data:   -1, Flush: (   0    0    1), Discard: (   ...
      
      GC thread:                              IRQ
      - move_data_page()
       - set_page_dirty()
        - clear_cold_data()
                                              - f2fs_write_end_io()
                                               - type = WB_DATA_TYPE(page);
                                                 here, we get wrong type
                                               - dec_page_count(sbi, type);
       - f2fs_wait_on_page_writeback()
      
      Cc: <stable@vger.kernel.org>
      Reported-and-Tested-by: NPark Ju Hyung <qkrwngud825@gmail.com>
      Reviewed-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      164a63fa
    • J
      f2fs: account read IOs and use IO counts for is_idle · 5f9abab4
      Jaegeuk Kim 提交于
      This patch adds issued read IO counts which is under block layer.
      
      Chao modified a bit, since:
      
      Below race can cause reversed reference on F2FS_RD_DATA, there is
      the same issue in f2fs_submit_page_bio(), fix them by relocate
      __submit_bio() and inc_page_count.
      
      Thread A			Thread B
      - f2fs_write_begin
       - f2fs_submit_page_read
       - __submit_bio
      				- f2fs_read_end_io
      				 - __read_end_io
      				 - dec_page_count(, F2FS_RD_DATA)
       - inc_page_count(, F2FS_RD_DATA)
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      5f9abab4
    • C
      f2fs: fix to account IO correctly for cgroup writeback · 78efac53
      Chao Yu 提交于
      Now, we have supported cgroup writeback, it depends on correctly IO
      account of specified filesystem.
      
      But in commit d1b3e72d ("f2fs: submit bio of in-place-update pages"),
      we split write paths from f2fs_submit_page_mbio() to two:
      - f2fs_submit_page_bio() for IPU path
      - f2fs_submit_page_bio() for OPU path
      
      But still we account write IO only in f2fs_submit_page_mbio(), result in
      incorrect IO account, fix it by adding missing IO account in IPU path.
      
      Fixes: d1b3e72d ("f2fs: submit bio of in-place-update pages")
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      78efac53
    • C
      f2fs: fix to account IO correctly · 4c58ed07
      Chao Yu 提交于
      Below race can cause reversed reference on dirty count, fix it by
      relocating __submit_bio() and inc_page_count().
      
      Thread A				Thread B
      - f2fs_inplace_write_data
       - f2fs_submit_page_bio
        - __submit_bio
      					- f2fs_write_end_io
      					 - dec_page_count
        - inc_page_count
      
      Cc: <stable@vger.kernel.org>
      Fixes: d1b3e72d ("f2fs: submit bio of in-place-update pages")
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      4c58ed07
  12. 21 10月, 2018 2 次提交
  13. 17 10月, 2018 1 次提交
    • D
      f2fs: checkpoint disabling · 4354994f
      Daniel Rosenberg 提交于
      Note that, it requires "f2fs: return correct errno in f2fs_gc".
      
      This adds a lightweight non-persistent snapshotting scheme to f2fs.
      
      To use, mount with the option checkpoint=disable, and to return to
      normal operation, remount with checkpoint=enable. If the filesystem
      is shut down before remounting with checkpoint=enable, it will revert
      back to its apparent state when it was first mounted with
      checkpoint=disable. This is useful for situations where you wish to be
      able to roll back the state of the disk in case of some critical
      failure.
      Signed-off-by: NDaniel Rosenberg <drosen@google.com>
      [Jaegeuk Kim: use SB_RDONLY instead of MS_RDONLY]
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      4354994f
  14. 03 10月, 2018 1 次提交
    • J
      f2fs: clear PageError on the read path · fb7d70db
      Jaegeuk Kim 提交于
      When running fault injection test, I hit somewhat wrong behavior in f2fs_gc ->
      gc_data_segment():
      
      0. fault injection generated some PageError'ed pages
      
      1. gc_data_segment
       -> f2fs_get_read_data_page(REQ_RAHEAD)
      
      2. move_data_page
       -> f2fs_get_lock_data_page()
        -> f2f_get_read_data_page()
         -> f2fs_submit_page_read()
          -> submit_bio(READ)
        -> return EIO due to PageError
        -> fail to move data
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      fb7d70db
  15. 01 10月, 2018 3 次提交
    • C
      f2fs: allow out-place-update for direct IO in LFS mode · f847c699
      Chao Yu 提交于
      Normally, DIO uses in-pllace-update, but in LFS mode, f2fs doesn't
      allow triggering any in-place-update writes, so we fallback direct
      write to buffered write, result in bad performance of large size
      write.
      
      This patch adds to support triggering out-place-update for direct IO
      to enhance its performance.
      
      Note that it needs to exclude direct read IO during direct write,
      since new data writing to new block address will no be valid until
      write finished.
      
      storage: zram
      
      time xfs_io -f -d /mnt/f2fs/file -c "pwrite 0 1073741824" -c "fsync"
      
      Before:
      real	0m13.061s
      user	0m0.327s
      sys	0m12.486s
      
      After:
      real	0m6.448s
      user	0m0.228s
      sys	0m6.212s
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      f847c699
    • C
      f2fs: refactor ->page_mkwrite() flow · 39a86958
      Chao Yu 提交于
      Thread A				Thread B
      - f2fs_vm_page_mkwrite
      					- f2fs_setattr
      					 - down_write(i_mmap_sem)
      					 - truncate_setsize
      					 - f2fs_truncate
      					 - up_write(i_mmap_sem)
       - f2fs_reserve_block
       reserve NEW_ADDR
       - skip dirty page due to truncation
      
      1. we don't need to rserve new block address for a truncated page.
      2. dn.data_blkaddr is used out of node page lock coverage.
      
      Refactor ->page_mkwrite() flow to fix above issues:
      - use __do_map_lock() to avoid racing checkpoint()
      - lock data page in prior to dnode page
      - cover f2fs_reserve_block with i_mmap_sem lock
      - wait page writeback before zeroing page
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      39a86958
    • C
      Revert: "f2fs: check last page index in cached bio to decide submission" · bab475c5
      Chao Yu 提交于
      There is one case that we can leave bio in f2fs, result in hanging
      page writeback waiter.
      
      Thread A				Thread B
      - f2fs_write_cache_pages
       - f2fs_submit_page_write
       page #0 cached in bio #0 of cold log
       - f2fs_submit_page_write
       page #1 cached in bio #1 of warm log
      					- f2fs_write_cache_pages
      					 - f2fs_submit_page_write
      					 bio is full, submit bio #1 contain page #1
       - f2fs_submit_merged_write_cond(, page #1)
       fail to submit bio #0 due to page #1 is not in any cached bios.
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      bab475c5
  16. 27 9月, 2018 1 次提交
  17. 13 9月, 2018 2 次提交
  18. 08 9月, 2018 1 次提交
  19. 06 9月, 2018 1 次提交
  20. 21 8月, 2018 1 次提交
    • C
      f2fs: readahead encrypted block during GC · 6aa58d8a
      Chao Yu 提交于
      During GC, for each encrypted block, we will read block synchronously
      into meta page, and then submit it into current cold data log area.
      
      So this block read model with 4k granularity can make poor performance,
      like migrating non-encrypted block, let's readahead encrypted block
      as well to improve migration performance.
      
      To implement this, we choose meta page that its index is old block
      address of the encrypted block, and readahead ciphertext into this
      page, later, if readaheaded page is still updated, we will load its
      data into target meta page, and submit the write IO.
      
      Note that for OPU, truncation, deletion, we need to invalid meta
      page after we invalid old block address, to make sure we won't load
      invalid data from target meta page during encrypted block migration.
      
      for ((i = 0; i < 1000; i++))
      do {
              xfs_io -f /mnt/f2fs/dir/$i -c "pwrite 0 128k" -c "fsync";
      } done
      
      for ((i = 0; i < 1000; i+=2))
      do {
              rm /mnt/f2fs/dir/$i;
      } done
      
      ret = ioctl(fd, F2FS_IOC_GARBAGE_COLLECT, 0);
      
      Before:
                    gc-6549  [001] d..1 214682.212797: block_rq_insert: 8,32 RA 32768 () 786400 + 64 [gc]
                    gc-6549  [001] d..1 214682.212802: block_unplug: [gc] 1
                    gc-6549  [001] .... 214682.213892: block_bio_queue: 8,32 R 67494144 + 8 [gc]
                    gc-6549  [001] .... 214682.213899: block_getrq: 8,32 R 67494144 + 8 [gc]
                    gc-6549  [001] .... 214682.213902: block_plug: [gc]
                    gc-6549  [001] d..1 214682.213905: block_rq_insert: 8,32 R 4096 () 67494144 + 8 [gc]
                    gc-6549  [001] d..1 214682.213908: block_unplug: [gc] 1
                    gc-6549  [001] .... 214682.226405: block_bio_queue: 8,32 R 67494152 + 8 [gc]
                    gc-6549  [001] .... 214682.226412: block_getrq: 8,32 R 67494152 + 8 [gc]
                    gc-6549  [001] .... 214682.226414: block_plug: [gc]
                    gc-6549  [001] d..1 214682.226417: block_rq_insert: 8,32 R 4096 () 67494152 + 8 [gc]
                    gc-6549  [001] d..1 214682.226420: block_unplug: [gc] 1
                    gc-6549  [001] .... 214682.226904: block_bio_queue: 8,32 R 67494160 + 8 [gc]
                    gc-6549  [001] .... 214682.226910: block_getrq: 8,32 R 67494160 + 8 [gc]
                    gc-6549  [001] .... 214682.226911: block_plug: [gc]
                    gc-6549  [001] d..1 214682.226914: block_rq_insert: 8,32 R 4096 () 67494160 + 8 [gc]
                    gc-6549  [001] d..1 214682.226916: block_unplug: [gc] 1
      
      After:
                    gc-5678  [003] .... 214327.025906: block_bio_queue: 8,32 R 67493824 + 8 [gc]
                    gc-5678  [003] .... 214327.025908: block_bio_backmerge: 8,32 R 67493824 + 8 [gc]
                    gc-5678  [003] .... 214327.025915: block_bio_queue: 8,32 R 67493832 + 8 [gc]
                    gc-5678  [003] .... 214327.025917: block_bio_backmerge: 8,32 R 67493832 + 8 [gc]
                    gc-5678  [003] .... 214327.025923: block_bio_queue: 8,32 R 67493840 + 8 [gc]
                    gc-5678  [003] .... 214327.025925: block_bio_backmerge: 8,32 R 67493840 + 8 [gc]
                    gc-5678  [003] .... 214327.025932: block_bio_queue: 8,32 R 67493848 + 8 [gc]
                    gc-5678  [003] .... 214327.025934: block_bio_backmerge: 8,32 R 67493848 + 8 [gc]
                    gc-5678  [003] .... 214327.025941: block_bio_queue: 8,32 R 67493856 + 8 [gc]
                    gc-5678  [003] .... 214327.025943: block_bio_backmerge: 8,32 R 67493856 + 8 [gc]
                    gc-5678  [003] .... 214327.025953: block_bio_queue: 8,32 R 67493864 + 8 [gc]
                    gc-5678  [003] .... 214327.025955: block_bio_backmerge: 8,32 R 67493864 + 8 [gc]
                    gc-5678  [003] .... 214327.025962: block_bio_queue: 8,32 R 67493872 + 8 [gc]
                    gc-5678  [003] .... 214327.025964: block_bio_backmerge: 8,32 R 67493872 + 8 [gc]
                    gc-5678  [003] .... 214327.025970: block_bio_queue: 8,32 R 67493880 + 8 [gc]
                    gc-5678  [003] .... 214327.025972: block_bio_backmerge: 8,32 R 67493880 + 8 [gc]
                    gc-5678  [003] .... 214327.026000: block_bio_queue: 8,32 WS 34123776 + 2048 [gc]
                    gc-5678  [003] .... 214327.026019: block_getrq: 8,32 WS 34123776 + 2048 [gc]
                    gc-5678  [003] d..1 214327.026021: block_rq_insert: 8,32 R 131072 () 67493632 + 256 [gc]
                    gc-5678  [003] d..1 214327.026023: block_unplug: [gc] 1
                    gc-5678  [003] d..1 214327.026026: block_rq_issue: 8,32 R 131072 () 67493632 + 256 [gc]
                    gc-5678  [003] .... 214327.026046: block_plug: [gc]
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      6aa58d8a