1. 10 May, 2024 5 commits
  2. 09 May, 2024 5 commits
  3. 29 Apr, 2024 4 commits
  4. 25 Apr, 2024 3 commits
  5. 19 Apr, 2024 7 commits
  6. 14 Apr, 2024 2 commits
  7. 12 Apr, 2024 8 commits
  8. 09 Apr, 2024 1 commit
  9. 02 Apr, 2024 1 commit
  10. 29 Mar, 2024 4 commits
    • Yunlei He's avatar
      f2fs: remove clear SB_INLINECRYPT flag in default_options · ac5eecf4
      Yunlei He authored
      In f2fs_remount, SB_INLINECRYPT flag will be clear and re-set.
      If create new file or open file during this gap, these files
      will not use inlinecrypt. Worse case, it may lead to data
      corruption if wrappedkey_v0 is enable.
      
      Thread A:                               Thread B:
      
      -f2fs_remount				-f2fs_file_open or f2fs_new_inode
        -default_options
      	<- clear SB_INLINECRYPT flag
      
                                                -fscrypt_select_encryption_impl
      
        -parse_options
      	<- set SB_INLINECRYPT again
      Signed-off-by: default avatarYunlei He <heyunlei@oppo.com>
      Reviewed-by: default avatarChao Yu <chao@kernel.org>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
      ac5eecf4
    • Chao Yu's avatar
      f2fs: fix to wait on page writeback in __clone_blkaddrs() · d3876e34
      Chao Yu authored
      In below race condition, dst page may become writeback status
      in __clone_blkaddrs(), it needs to wait writeback before update,
      fix it.
      
      Thread A				GC Thread
      - f2fs_move_file_range
        - filemap_write_and_wait_range(dst)
      					- gc_data_segment
      					 - f2fs_down_write(dst)
      					 - move_data_page
      					  - set_page_writeback(dst_page)
      					  - f2fs_submit_page_write
      					 - f2fs_up_write(dst)
        - f2fs_down_write(dst)
        - __exchange_data_block
         - __clone_blkaddrs
          - f2fs_get_new_data_page
          - memcpy_page
      
      Fixes: 0a2aa8fb ("f2fs: refactor __exchange_data_block for speed up")
      Signed-off-by: default avatarChao Yu <chao@kernel.org>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
      d3876e34
    • Chao Yu's avatar
      f2fs: support to map continuous holes or preallocated address · 9f0f6bf4
      Chao Yu authored
      This patch supports to map continuous holes or preallocated addresses
      to improve performace of lookuping mapping info during read DIO.
      
      [testcase 1]
      xfs_io -f /mnt/f2fs/hole -c "truncate 1m" -c "fsync"
      xfs_io -d /mnt/f2fs/hole -c "pread -b 1m 0 1m"
      
      [before]
      f2fs_direct_IO_enter: dev = (253,16), ino = 6 pos = 0 len = 1048576 ki_flags = 20000 ki_ioprio = 0 rw = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 0, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 1, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 2, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 3, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 4, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 5, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 6, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 7, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 8, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 9, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 10, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 11, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 12, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 13, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 14, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 15, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 16, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      ......
      f2fs_direct_IO_exit: dev = (253,16), ino = 6 pos = 0 len = 1048576 rw = 0 ret = 1048576
      
      [after]
      f2fs_direct_IO_enter: dev = (253,16), ino = 6 pos = 0 len = 1048576 ki_flags = 20000 ki_ioprio = 0 rw = 0
      f2fs_map_blocks: dev = (253,16), ino = 6, file offset = 0, start blkaddr = 0x0, len = 0x100, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_direct_IO_exit: dev = (253,16), ino = 6 pos = 0 len = 1048576 rw = 0 ret = 1048576
      
      [testcase 2]
      xfs_io -f /mnt/f2fs/preallocated -c "falloc 0 1m" -c "fsync"
      xfs_io -d /mnt/f2fs/preallocated -c "pread -b 1m 0 1m"
      
      [before]
      f2fs_direct_IO_enter: dev = (253,16), ino = 11 pos = 0 len = 1048576 ki_flags = 20000 ki_ioprio = 0 rw = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 0, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 1, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 2, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 3, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 4, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 5, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 6, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 7, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 8, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 9, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 10, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 11, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 12, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 13, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 14, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 15, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 16, start blkaddr = 0x0, len = 0x0, flags = 0, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      ......
      f2fs_direct_IO_exit: dev = (253,16), ino = 11 pos = 0 len = 1048576 rw = 0 ret = 1048576
      
      [after]
      f2fs_direct_IO_enter: dev = (253,16), ino = 11 pos = 0 len = 1048576 ki_flags = 20000 ki_ioprio = 0 rw = 0
      f2fs_map_blocks: dev = (253,16), ino = 11, file offset = 0, start blkaddr = 0xffffffff, len = 0x100, flags = 4, seg_type = 1, may_create = 0, multidevice = 0, flag = 3, err = 0
      f2fs_direct_IO_exit: dev = (253,16), ino = 11 pos = 0 len = 1048576 rw = 0 ret = 1048576
      Signed-off-by: default avatarChao Yu <chao@kernel.org>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
      9f0f6bf4
    • Chao Yu's avatar
      f2fs: multidev: fix to recognize valid zero block address · 33e62cd7
      Chao Yu authored
      As reported by Yi Zhang in mailing list [1], kernel warning was catched
      during zbd/010 test as below:
      
      ./check zbd/010
      zbd/010 (test gap zone support with F2FS)                    [failed]
          runtime    ...  3.752s
          something found in dmesg:
          [ 4378.146781] run blktests zbd/010 at 2024-02-18 11:31:13
          [ 4378.192349] null_blk: module loaded
          [ 4378.209860] null_blk: disk nullb0 created
          [ 4378.413285] scsi_debug:sdebug_driver_probe: scsi_debug: trim
      poll_queues to 0. poll_q/nr_hw = (0/1)
          [ 4378.422334] scsi host15: scsi_debug: version 0191 [20210520]
                           dev_size_mb=1024, opts=0x0, submit_queues=1, statistics=0
          [ 4378.434922] scsi 15:0:0:0: Direct-Access-ZBC Linux
      scsi_debug       0191 PQ: 0 ANSI: 7
          [ 4378.443343] scsi 15:0:0:0: Power-on or device reset occurred
          [ 4378.449371] sd 15:0:0:0: Attached scsi generic sg5 type 20
          [ 4378.449418] sd 15:0:0:0: [sdf] Host-managed zoned block device
          ...
          (See '/mnt/tests/gitlab.com/api/v4/projects/19168116/repository/archive.zip/storage/blktests/blk/blktests/results/nodev/zbd/010.dmesg'
      
      WARNING: CPU: 22 PID: 44011 at fs/iomap/iter.c:51
      CPU: 22 PID: 44011 Comm: fio Not tainted 6.8.0-rc3+ #1
      RIP: 0010:iomap_iter+0x32b/0x350
      Call Trace:
       <TASK>
       __iomap_dio_rw+0x1df/0x830
       f2fs_file_read_iter+0x156/0x3d0 [f2fs]
       aio_read+0x138/0x210
       io_submit_one+0x188/0x8c0
       __x64_sys_io_submit+0x8c/0x1a0
       do_syscall_64+0x86/0x170
       entry_SYSCALL_64_after_hwframe+0x6e/0x76
      
      Shinichiro Kawasaki helps to analyse this issue and proposes a potential
      fixing patch in [2].
      
      Quoted from reply of Shinichiro Kawasaki:
      
      "I confirmed that the trigger commit is dbf8e63f as Yi reported. I took a
      look in the commit, but it looks fine to me. So I thought the cause is not
      in the commit diff.
      
      I found the WARN is printed when the f2fs is set up with multiple devices,
      and read requests are mapped to the very first block of the second device in the
      direct read path. In this case, f2fs_map_blocks() and f2fs_map_blocks_cached()
      modify map->m_pblk as the physical block address from each block device. It
      becomes zero when it is mapped to the first block of the device. However,
      f2fs_iomap_begin() assumes that map->m_pblk is the physical block address of the
      whole f2fs, across the all block devices. It compares map->m_pblk against
      NULL_ADDR == 0, then go into the unexpected branch and sets the invalid
      iomap->length. The WARN catches the invalid iomap->length.
      
      This WARN is printed even for non-zoned block devices, by following steps.
      
       - Create two (non-zoned) null_blk devices memory backed with 128MB size each:
         nullb0 and nullb1.
       # mkfs.f2fs /dev/nullb0 -c /dev/nullb1
       # mount -t f2fs /dev/nullb0 "${mount_dir}"
       # dd if=/dev/zero of="${mount_dir}/test.dat" bs=1M count=192
       # dd if="${mount_dir}/test.dat" of=/dev/null bs=1M count=192 iflag=direct
      
      ..."
      
      So, the root cause of this issue is: when multi-devices feature is on,
      f2fs_map_blocks() may return zero blkaddr in non-primary device, which is
      a verified valid block address, however, f2fs_iomap_begin() treats it as
      an invalid block address, and then it triggers the warning in iomap
      framework code.
      
      Finally, as discussed, we decide to use a more simple and direct way that
      checking (map.m_flags & F2FS_MAP_MAPPED) condition instead of
      (map.m_pblk != NULL_ADDR) to fix this issue.
      
      Thanks a lot for the effort of Yi Zhang and Shinichiro Kawasaki on this
      issue.
      
      [1] https://lore.kernel.org/linux-f2fs-devel/CAHj4cs-kfojYC9i0G73PRkYzcxCTex=-vugRFeP40g_URGvnfQ@mail.gmail.com/
      [2] https://lore.kernel.org/linux-f2fs-devel/gngdj77k4picagsfdtiaa7gpgnup6fsgwzsltx6milmhegmjff@iax2n4wvrqye/Reported-by: default avatarYi Zhang <yi.zhang@redhat.com>
      Closes: https://lore.kernel.org/linux-f2fs-devel/CAHj4cs-kfojYC9i0G73PRkYzcxCTex=-vugRFeP40g_URGvnfQ@mail.gmail.com/Tested-by: default avatarShin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
      Tested-by: default avatarYi Zhang <yi.zhang@redhat.com>
      Fixes: 1517c1a7 ("f2fs: implement iomap operations")
      Fixes: 8d3c1fa3 ("f2fs: don't rely on F2FS_MAP_* in f2fs_iomap_begin")
      Signed-off-by: default avatarChao Yu <chao@kernel.org>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
      33e62cd7