1. 20 4月, 2019 1 次提交
    • C
      f2fs: fix to avoid NULL pointer dereference on se->discard_map · f9368366
      Chao Yu 提交于
      [ Upstream commit 7d20c8abb2edcf962ca857d51f4d0f9cd4b19053 ]
      
      https://bugzilla.kernel.org/show_bug.cgi?id=200951
      
      These is a NULL pointer dereference issue reported in bugzilla:
      
      Hi,
      in the setup there is a SATA SSD connected to a SATA-to-USB bridge.
      
      The disc is "Samsung SSD 850 PRO 256G" which supports TRIM.
      There are four partitions:
       sda1: FAT  /boot
       sda2: F2FS /
       sda3: F2FS /home
       sda4: F2FS
      
      The bridge is ASMT1153e which uses the "uas" driver.
      There is no TRIM pass-through, so, when mounting it reports:
       mounting with "discard" option, but the device does not support discard
      
      The USB host is USB3.0 and UASP capable. It is the one on RK3399.
      
      Given this everything works fine, except there is no TRIM support.
      
      In order to enable TRIM a new UDEV rule is added [1]:
       /etc/udev/rules.d/10-sata-bridge-trim.rules:
       ACTION=="add|change", ATTRS{idVendor}=="174c", ATTRS{idProduct}=="55aa", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"
      After reboot any F2FS write hangs forever and dmesg reports:
       Unable to handle kernel NULL pointer dereference
      
      Also tested on a x86_64 system: works fine even with TRIM enabled.
       same disc
       same bridge
       different usb host controller
       different cpu architecture
       not root filesystem
      
      Regards,
        Vicenç.
      
      [1] Post #5 in https://bbs.archlinux.org/viewtopic.php?id=236280
      
       Unable to handle kernel NULL pointer dereference at virtual address 000000000000003e
       Mem abort info:
         ESR = 0x96000004
         Exception class = DABT (current EL), IL = 32 bits
         SET = 0, FnV = 0
         EA = 0, S1PTW = 0
       Data abort info:
         ISV = 0, ISS = 0x00000004
         CM = 0, WnR = 0
       user pgtable: 4k pages, 48-bit VAs, pgdp = 00000000626e3122
       [000000000000003e] pgd=0000000000000000
       Internal error: Oops: 96000004 [#1] SMP
       Modules linked in: overlay snd_soc_hdmi_codec rc_cec dw_hdmi_i2s_audio dw_hdmi_cec snd_soc_simple_card snd_soc_simple_card_utils snd_soc_rockchip_i2s rockchip_rga snd_soc_rockchip_pcm rockchipdrm videobuf2_dma_sg v4l2_mem2mem rtc_rk808 videobuf2_memops analogix_dp videobuf2_v4l2 videobuf2_common dw_hdmi dw_wdt cec rc_core videodev drm_kms_helper media drm rockchip_thermal rockchip_saradc realtek drm_panel_orientation_quirks syscopyarea sysfillrect sysimgblt fb_sys_fops dwmac_rk stmmac_platform stmmac pwm_bl squashfs loop crypto_user gpio_keys hid_kensington
       CPU: 5 PID: 957 Comm: nvim Not tainted 4.19.0-rc1-1-ARCH #1
       Hardware name: Sapphire-RK3399 Board (DT)
       pstate: 00000005 (nzcv daif -PAN -UAO)
       pc : update_sit_entry+0x304/0x4b0
       lr : update_sit_entry+0x108/0x4b0
       sp : ffff00000ca13bd0
       x29: ffff00000ca13bd0 x28: 000000000000003e
       x27: 0000000000000020 x26: 0000000000080000
       x25: 0000000000000048 x24: ffff8000ebb85cf8
       x23: 0000000000000253 x22: 00000000ffffffff
       x21: 00000000000535f2 x20: 00000000ffffffdf
       x19: ffff8000eb9e6800 x18: ffff8000eb9e6be8
       x17: 0000000007ce6926 x16: 000000001c83ffa8
       x15: 0000000000000000 x14: ffff8000f602df90
       x13: 0000000000000006 x12: 0000000000000040
       x11: 0000000000000228 x10: 0000000000000000
       x9 : 0000000000000000 x8 : 0000000000000000
       x7 : 00000000000535f2 x6 : ffff8000ebff3440
       x5 : ffff8000ebff3440 x4 : ffff8000ebe3a6c8
       x3 : 00000000ffffffff x2 : 0000000000000020
       x1 : 0000000000000000 x0 : ffff8000eb9e5800
       Process nvim (pid: 957, stack limit = 0x0000000063a78320)
       Call trace:
        update_sit_entry+0x304/0x4b0
        f2fs_invalidate_blocks+0x98/0x140
        truncate_node+0x90/0x400
        f2fs_remove_inode_page+0xe8/0x340
        f2fs_evict_inode+0x2b0/0x408
        evict+0xe0/0x1e0
        iput+0x160/0x260
        do_unlinkat+0x214/0x298
        __arm64_sys_unlinkat+0x3c/0x68
        el0_svc_handler+0x94/0x118
        el0_svc+0x8/0xc
       Code: f9400800 b9488400 36080140 f9400f01 (387c4820)
       ---[ end trace a0f21a307118c477 ]---
      
      The reason is it is possible to enable discard flag on block queue via
      UDEV, but during mount, f2fs will initialize se->discard_map only if
      this flag is set, once the flag is set after mount, f2fs may dereference
      NULL pointer on se->discard_map.
      
      So this patch does below changes to fix this issue:
      - initialize and update se->discard_map all the time.
      - don't clear DISCARD option if device has no QUEUE_FLAG_DISCARD flag
      during mount.
      - don't issue small discard on zoned block device.
      - introduce some functions to enhance the readability.
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Tested-by: NVicente Bergas <vicencb@gmail.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      f9368366
  2. 29 7月, 2018 1 次提交
  3. 01 6月, 2018 1 次提交
    • C
      f2fs: avoid stucking GC due to atomic write · 2ef79ecb
      Chao Yu 提交于
      f2fs doesn't allow abuse on atomic write class interface, so except
      limiting in-mem pages' total memory usage capacity, we need to limit
      atomic-write usage as well when filesystem is seriously fragmented,
      otherwise we may run into infinite loop during foreground GC because
      target blocks in victim segment are belong to atomic opened file for
      long time.
      
      Now, we will detect failure due to atomic write in foreground GC, if
      the count exceeds threshold, we will drop all atomic written data in
      cache, by this, I expect it can keep our system running safely to
      prevent Dos attack.
      
      In addition, his patch adds to show GC skip information in debugfs,
      now it just shows count of skipped caused by atomic write.
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      2ef79ecb
  4. 03 1月, 2018 3 次提交
  5. 14 11月, 2017 1 次提交
  6. 06 11月, 2017 1 次提交
  7. 11 10月, 2017 3 次提交
  8. 04 5月, 2017 1 次提交
  9. 20 4月, 2017 1 次提交
  10. 11 4月, 2017 2 次提交
  11. 06 4月, 2017 2 次提交
  12. 25 3月, 2017 1 次提交
  13. 22 3月, 2017 1 次提交
  14. 20 3月, 2017 1 次提交
  15. 28 2月, 2017 2 次提交
    • C
      f2fs: introduce free nid bitmap · 4ac91242
      Chao Yu 提交于
      In scenario of intensively node allocation, free nids will be ran out
      soon, then it needs to stop to load free nids by traversing NAT blocks,
      in worse case, if NAT blocks does not be cached in memory, it generates
      IOs which slows down our foreground operations.
      
      In order to speed up node allocation, in this patch we introduce a new
      free_nid_bitmap array, so there is an bitmap table for each NAT block,
      Once the NAT block is loaded, related bitmap cache will be switched on,
      and bitmap will be set during traversing nat entries in NAT block, later
      we can query and update nid usage status in memory completely.
      
      With such implementation, I expect performance of node allocation can be
      improved in the long-term after filesystem image is mounted.
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      4ac91242
    • J
      f2fs: add bitmaps for empty or full NAT blocks · 22ad0b6a
      Jaegeuk Kim 提交于
      This patches adds bitmaps to represent empty or full NAT blocks containing
      free nid entries.
      
      If we can find valid crc|cp_ver in the last block of checkpoint pack, we'll
      use these bitmaps when building free nids. In order to avoid checkpointing
      burden, up-to-date bitmaps will be flushed only during umount time. So,
      normally we can get this gain, but when power-cut happens, we rely on fsck.f2fs
      which recovers this bitmap again.
      
      After this patch, we build free nids from nid #0 at mount time to make more
      full NAT blocks, but in runtime, we check empty NAT blocks to load free nids
      without loading any NAT pages from disk.
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      22ad0b6a
  16. 23 2月, 2017 5 次提交
  17. 29 1月, 2017 1 次提交
  18. 26 11月, 2016 2 次提交
    • N
      f2fs: set ->owner for debugfs status file's file_operations · 05e6ea26
      Nicolai Stange 提交于
      The struct file_operations instance serving the f2fs/status debugfs file
      lacks an initialization of its ->owner.
      
      This means that although that file might have been opened, the f2fs module
      can still get removed. Any further operation on that opened file, releasing
      included,  will cause accesses to unmapped memory.
      
      Indeed, Mike Marshall reported the following:
      
        BUG: unable to handle kernel paging request at ffffffffa0307430
        IP: [<ffffffff8132a224>] full_proxy_release+0x24/0x90
        <...>
        Call Trace:
         [] __fput+0xdf/0x1d0
         [] ____fput+0xe/0x10
         [] task_work_run+0x8e/0xc0
         [] do_exit+0x2ae/0xae0
         [] ? __audit_syscall_entry+0xae/0x100
         [] ? syscall_trace_enter+0x1ca/0x310
         [] do_group_exit+0x44/0xc0
         [] SyS_exit_group+0x14/0x20
         [] do_syscall_64+0x61/0x150
         [] entry_SYSCALL64_slow_path+0x25/0x25
        <...>
        ---[ end trace f22ae883fa3ea6b8 ]---
        Fixing recursive fault but reboot is needed!
      
      Fix this by initializing the f2fs/status file_operations' ->owner with
      THIS_MODULE.
      
      This will allow debugfs to grab a reference to the f2fs module upon any
      open on that file, thus preventing it from getting removed.
      
      Fixes: 902829aa ("f2fs: move proc files to debugfs")
      Reported-by: NMike Marshall <hubcap@omnibond.com>
      Reported-by: NMartin Brandenburg <martin@omnibond.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: NNicolai Stange <nicstange@gmail.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      05e6ea26
    • C
      f2fs: don't wait writeback for datas during checkpoint · 36951b38
      Chao Yu 提交于
      Normally, while committing checkpoint, we will wait on all pages to be
      writebacked no matter the page is data or metadata, so in scenario where
      there are lots of data IO being submitted with metadata, we may suffer
      long latency for waiting writeback during checkpoint.
      
      Indeed, we only care about persistence for pages with metadata, but not
      pages with data, as file system consistent are only related to metadate,
      so in order to avoid encountering long latency in above scenario, let's
      recognize and reference metadata in submitted IOs, wait writeback only
      for metadatas.
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      36951b38
  19. 24 11月, 2016 2 次提交
    • J
      f2fs: remove percpu_count due to performance regression · 35782b23
      Jaegeuk Kim 提交于
      This patch removes percpu_count usage due to performance regression in iozone.
      
      Fixes: 523be8a6 ("f2fs: use percpu_counter for page counters")
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      35782b23
    • C
      f2fs: split free nid list · b8559dc2
      Chao Yu 提交于
      During free nid allocation, in order to do preallocation, we will tag free
      nid entry as allocated one and still leave it in free nid list, for other
      allocators who want to grab free nids, it needs to traverse the free nid
      list for lookup. It becomes overhead in scenario of allocating free nid
      intensively by multithreads.
      
      This patch splits free nid list to two list: {free,alloc}_nid_list, to
      keep free nids and preallocated free nids separately, after that, traverse
      latency will be gone, besides split nid_cnt for separate statistic.
      
      Additionally, introduce __insert_nid_to_list and __remove_nid_from_list for
      cleanup.
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      [Jaegeuk Kim: modify f2fs_bug_on to avoid needless branches]
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      b8559dc2
  20. 23 9月, 2016 1 次提交
  21. 30 8月, 2016 1 次提交
  22. 25 8月, 2016 1 次提交
  23. 03 6月, 2016 1 次提交
  24. 19 5月, 2016 2 次提交
  25. 12 5月, 2016 1 次提交
  26. 15 4月, 2016 1 次提交