13 Oct, 2018

1 commit

  • commit d3f07c049dab1a3f1740f476afd3d5e5b738c21c upstream.

    syzbot found the following crash on:

    HEAD commit: d9bd94c0bcaa Add linux-next specific files for 20180801
    git tree: linux-next
    console output: https://syzkaller.appspot.com/x/log.txt?x=1001189c400000
    kernel config: https://syzkaller.appspot.com/x/.config?x=cc8964ea4d04518c
    dashboard link: https://syzkaller.appspot.com/bug?extid=c966a82db0b14aa37e81
    compiler: gcc (GCC) 8.0.1 20180413 (experimental)

    Unfortunately, I don't have any reproducer for this crash yet.

    IMPORTANT: if you fix the bug, please add the following tag to the commit:
    Reported-by: syzbot+c966a82db0b14aa37e81@syzkaller.appspotmail.com

    loop7: rw=12288, want=8200, limit=20
    netlink: 65342 bytes leftover after parsing attributes in process `syz-executor4'.
    openvswitch: netlink: Message has 8 unknown bytes.
    kasan: CONFIG_KASAN_INLINE enabled
    kasan: GPF could be caused by NULL-ptr deref or user memory access
    general protection fault: 0000 [#1] SMP KASAN
    CPU: 1 PID: 7615 Comm: syz-executor7 Not tainted 4.18.0-rc7-next-20180801+ #29
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:__read_once_size include/linux/compiler.h:188 [inline]
    RIP: 0010:compound_head include/linux/page-flags.h:142 [inline]
    RIP: 0010:PageLocked include/linux/page-flags.h:272 [inline]
    RIP: 0010:f2fs_put_page fs/f2fs/f2fs.h:2011 [inline]
    RIP: 0010:validate_checkpoint+0x66d/0xec0 fs/f2fs/checkpoint.c:835
    Code: e8 58 05 7f fe 4c 8d 6b 80 4d 8d 74 24 08 48 b8 00 00 00 00 00 fc ff df 4c 89 ea 48 c1 ea 03 c6 04 02 00 4c 89 f2 48 c1 ea 03 3c 02 00 0f 85 f4 06 00 00 4c 89 ea 4d 8b 7c 24 08 48 b8 00 00
    RSP: 0018:ffff8801937cebe8 EFLAGS: 00010246
    RAX: dffffc0000000000 RBX: ffff8801937cef30 RCX: ffffc90006035000
    RDX: 0000000000000000 RSI: ffffffff82fd9658 RDI: 0000000000000005
    RBP: ffff8801937cef58 R08: ffff8801ab254700 R09: fffff94000d9e026
    R10: fffff94000d9e026 R11: ffffea0006cf0137 R12: fffffffffffffffb
    R13: ffff8801937ceeb0 R14: 0000000000000003 R15: ffff880193419b40
    FS: 00007f36a61d5700(0000) GS:ffff8801db100000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fc04ff93000 CR3: 00000001d0562000 CR4: 00000000001426e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    f2fs_get_valid_checkpoint+0x436/0x1ec0 fs/f2fs/checkpoint.c:860
    f2fs_fill_super+0x2d42/0x8110 fs/f2fs/super.c:2883
    mount_bdev+0x314/0x3e0 fs/super.c:1344
    f2fs_mount+0x3c/0x50 fs/f2fs/super.c:3133
    legacy_get_tree+0x131/0x460 fs/fs_context.c:729
    vfs_get_tree+0x1cb/0x5c0 fs/super.c:1743
    do_new_mount fs/namespace.c:2603 [inline]
    do_mount+0x6f2/0x1e20 fs/namespace.c:2927
    ksys_mount+0x12d/0x140 fs/namespace.c:3143
    __do_sys_mount fs/namespace.c:3157 [inline]
    __se_sys_mount fs/namespace.c:3154 [inline]
    __x64_sys_mount+0xbe/0x150 fs/namespace.c:3154
    do_syscall_64+0x1b9/0x820 arch/x86/entry/common.c:290
    entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x45943a
    Code: b8 a6 00 00 00 0f 05 48 3d 01 f0 ff ff 0f 83 bd 8a fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 0f 83 9a 8a fb ff c3 66 0f 1f 84 00 00 00 00 00
    RSP: 002b:00007f36a61d4a88 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    RAX: ffffffffffffffda RBX: 00007f36a61d4b30 RCX: 000000000045943a
    RDX: 00007f36a61d4ad0 RSI: 0000000020000100 RDI: 00007f36a61d4af0
    RBP: 0000000020000100 R08: 00007f36a61d4b30 R09: 00007f36a61d4ad0
    R10: 0000000000000000 R11: 0000000000000206 R12: 0000000000000013
    R13: 0000000000000000 R14: 00000000004c8ea0 R15: 0000000000000000
    Modules linked in:
    Dumping ftrace buffer:
    (ftrace buffer empty)
    ---[ end trace bd8550c129352286 ]---
    RIP: 0010:__read_once_size include/linux/compiler.h:188 [inline]
    RIP: 0010:compound_head include/linux/page-flags.h:142 [inline]
    RIP: 0010:PageLocked include/linux/page-flags.h:272 [inline]
    RIP: 0010:f2fs_put_page fs/f2fs/f2fs.h:2011 [inline]
    RIP: 0010:validate_checkpoint+0x66d/0xec0 fs/f2fs/checkpoint.c:835
    Code: e8 58 05 7f fe 4c 8d 6b 80 4d 8d 74 24 08 48 b8 00 00 00 00 00 fc ff df 4c 89 ea 48 c1 ea 03 c6 04 02 00 4c 89 f2 48 c1 ea 03 3c 02 00 0f 85 f4 06 00 00 4c 89 ea 4d 8b 7c 24 08 48 b8 00 00
    RSP: 0018:ffff8801937cebe8 EFLAGS: 00010246
    RAX: dffffc0000000000 RBX: ffff8801937cef30 RCX: ffffc90006035000
    RDX: 0000000000000000 RSI: ffffffff82fd9658 RDI: 0000000000000005
    netlink: 65342 bytes leftover after parsing attributes in process `syz-executor4'.
    RBP: ffff8801937cef58 R08: ffff8801ab254700 R09: fffff94000d9e026
    openvswitch: netlink: Message has 8 unknown bytes.
    R10: fffff94000d9e026 R11: ffffea0006cf0137 R12: fffffffffffffffb
    R13: ffff8801937ceeb0 R14: 0000000000000003 R15: ffff880193419b40
    FS: 00007f36a61d5700(0000) GS:ffff8801db100000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fc04ff93000 CR3: 00000001d0562000 CR4: 00000000001426e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400

    In validate_checkpoint(), if we failed to call get_checkpoint_version(), we
    will pass returned invalid page pointer into f2fs_put_page, cause accessing
    invalid memory, this patch tries to handle error path correctly to fix this
    issue.

    Signed-off-by: Chao Yu
    Signed-off-by: Greg Kroah-Hartman

    Signed-off-by: Jaegeuk Kim

    Chao Yu
     

20 Sep, 2018

9 commits

  • [ Upstream commit c77ec61ca0a49544ca81881cc5d5529858f7e196 ]

    This patch adds to do sanity check with {sit,nat}_ver_bitmap_bytesize
    during mount, in order to avoid accessing across cache boundary with
    this abnormal bitmap size.

    - Overview
    buffer overrun in build_sit_info() when mounting a crafted f2fs image

    - Reproduce

    - Kernel message
    [ 548.580867] F2FS-fs (loop0): Invalid log blocks per segment (8201)

    [ 548.580877] F2FS-fs (loop0): Can't find valid F2FS filesystem in 1th superblock
    [ 548.584979] ==================================================================
    [ 548.586568] BUG: KASAN: use-after-free in kmemdup+0x36/0x50
    [ 548.587715] Read of size 64 at addr ffff8801e9c265ff by task mount/1295

    [ 548.589428] CPU: 1 PID: 1295 Comm: mount Not tainted 4.18.0-rc1+ #4
    [ 548.589432] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 548.589438] Call Trace:
    [ 548.589474] dump_stack+0x7b/0xb5
    [ 548.589487] print_address_description+0x70/0x290
    [ 548.589492] kasan_report+0x291/0x390
    [ 548.589496] ? kmemdup+0x36/0x50
    [ 548.589509] check_memory_region+0x139/0x190
    [ 548.589514] memcpy+0x23/0x50
    [ 548.589518] kmemdup+0x36/0x50
    [ 548.589545] f2fs_build_segment_manager+0x8fa/0x3410
    [ 548.589551] ? __asan_loadN+0xf/0x20
    [ 548.589560] ? f2fs_sanity_check_ckpt+0x1be/0x240
    [ 548.589566] ? f2fs_flush_sit_entries+0x10c0/0x10c0
    [ 548.589587] ? __put_user_ns+0x40/0x40
    [ 548.589604] ? find_next_bit+0x57/0x90
    [ 548.589610] f2fs_fill_super+0x194b/0x2b40
    [ 548.589617] ? f2fs_commit_super+0x1b0/0x1b0
    [ 548.589637] ? set_blocksize+0x90/0x140
    [ 548.589651] mount_bdev+0x1c5/0x210
    [ 548.589655] ? f2fs_commit_super+0x1b0/0x1b0
    [ 548.589667] f2fs_mount+0x15/0x20
    [ 548.589672] mount_fs+0x60/0x1a0
    [ 548.589683] ? alloc_vfsmnt+0x309/0x360
    [ 548.589688] vfs_kern_mount+0x6b/0x1a0
    [ 548.589699] do_mount+0x34a/0x18c0
    [ 548.589710] ? lockref_put_or_lock+0xcf/0x160
    [ 548.589716] ? copy_mount_string+0x20/0x20
    [ 548.589728] ? memcg_kmem_put_cache+0x1b/0xa0
    [ 548.589734] ? kasan_check_write+0x14/0x20
    [ 548.589740] ? _copy_from_user+0x6a/0x90
    [ 548.589744] ? memdup_user+0x42/0x60
    [ 548.589750] ksys_mount+0x83/0xd0
    [ 548.589755] __x64_sys_mount+0x67/0x80
    [ 548.589781] do_syscall_64+0x78/0x170
    [ 548.589797] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 548.589820] RIP: 0033:0x7f76fc331b9a
    [ 548.589821] Code: 48 8b 0d 01 c3 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d ce c2 2b 00 f7 d8 64 89 01 48
    [ 548.589880] RSP: 002b:00007ffd4f0a0e48 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    [ 548.589890] RAX: ffffffffffffffda RBX: 000000000146c030 RCX: 00007f76fc331b9a
    [ 548.589892] RDX: 000000000146c210 RSI: 000000000146df30 RDI: 0000000001474ec0
    [ 548.589895] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000013
    [ 548.589897] R10: 00000000c0ed0000 R11: 0000000000000206 R12: 0000000001474ec0
    [ 548.589900] R13: 000000000146c210 R14: 0000000000000000 R15: 0000000000000003

    [ 548.590242] The buggy address belongs to the page:
    [ 548.591243] page:ffffea0007a70980 count:0 mapcount:0 mapping:0000000000000000 index:0x0
    [ 548.592886] flags: 0x2ffff0000000000()
    [ 548.593665] raw: 02ffff0000000000 dead000000000100 dead000000000200 0000000000000000
    [ 548.595258] raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
    [ 548.603713] page dumped because: kasan: bad access detected

    [ 548.605203] Memory state around the buggy address:
    [ 548.606198] ffff8801e9c26480: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.607676] ffff8801e9c26500: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.609157] >ffff8801e9c26580: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.610629] ^
    [ 548.612088] ffff8801e9c26600: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.613674] ffff8801e9c26680: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.615141] ==================================================================
    [ 548.616613] Disabling lock debugging due to kernel taint
    [ 548.622871] WARNING: CPU: 1 PID: 1295 at mm/page_alloc.c:4065 __alloc_pages_slowpath+0xe4a/0x1420
    [ 548.622878] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd mac_hid i2c_piix4 soundcore ib_iser rdma_cm iw_cm ib_cm ib_core iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx raid1 raid0 multipath linear 8139too crct10dif_pclmul crc32_pclmul qxl drm_kms_helper syscopyarea aesni_intel sysfillrect sysimgblt fb_sys_fops ttm drm aes_x86_64 crypto_simd cryptd 8139cp glue_helper mii pata_acpi floppy
    [ 548.623217] CPU: 1 PID: 1295 Comm: mount Tainted: G B 4.18.0-rc1+ #4
    [ 548.623219] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 548.623226] RIP: 0010:__alloc_pages_slowpath+0xe4a/0x1420
    [ 548.623227] Code: ff ff 01 89 85 c8 fe ff ff e9 91 fc ff ff 41 89 c5 e9 5c fc ff ff 0f 0b 89 f8 25 ff ff f7 ff 89 85 8c fe ff ff e9 d5 f2 ff ff 0b e9 65 f2 ff ff 65 8b 05 38 81 d2 47 f6 c4 01 74 1c 65 48 8b
    [ 548.623281] RSP: 0018:ffff8801f28c7678 EFLAGS: 00010246
    [ 548.623284] RAX: 0000000000000000 RBX: 00000000006040c0 RCX: ffffffffb82f73b7
    [ 548.623287] RDX: 1ffff1003e518eeb RSI: 000000000000000c RDI: 0000000000000000
    [ 548.623290] RBP: ffff8801f28c7880 R08: 0000000000000000 R09: ffffed0047fff2c5
    [ 548.623292] R10: 0000000000000001 R11: ffffed0047fff2c4 R12: ffff8801e88de040
    [ 548.623295] R13: 00000000006040c0 R14: 000000000000000c R15: ffff8801f28c7938
    [ 548.623299] FS: 00007f76fca51840(0000) GS:ffff8801f6f00000(0000) knlGS:0000000000000000
    [ 548.623302] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 548.623304] CR2: 00007f19b9171760 CR3: 00000001ed952000 CR4: 00000000000006e0
    [ 548.623317] Call Trace:
    [ 548.623325] ? kasan_check_read+0x11/0x20
    [ 548.623330] ? __zone_watermark_ok+0x92/0x240
    [ 548.623336] ? get_page_from_freelist+0x1c3/0x1d90
    [ 548.623347] ? _raw_spin_lock_irqsave+0x2a/0x60
    [ 548.623353] ? warn_alloc+0x250/0x250
    [ 548.623358] ? save_stack+0x46/0xd0
    [ 548.623361] ? kasan_kmalloc+0xad/0xe0
    [ 548.623366] ? __isolate_free_page+0x2a0/0x2a0
    [ 548.623370] ? mount_fs+0x60/0x1a0
    [ 548.623374] ? vfs_kern_mount+0x6b/0x1a0
    [ 548.623378] ? do_mount+0x34a/0x18c0
    [ 548.623383] ? ksys_mount+0x83/0xd0
    [ 548.623387] ? __x64_sys_mount+0x67/0x80
    [ 548.623391] ? do_syscall_64+0x78/0x170
    [ 548.623396] ? entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 548.623401] __alloc_pages_nodemask+0x3c5/0x400
    [ 548.623407] ? __alloc_pages_slowpath+0x1420/0x1420
    [ 548.623412] ? __mutex_lock_slowpath+0x20/0x20
    [ 548.623417] ? kvmalloc_node+0x31/0x80
    [ 548.623424] alloc_pages_current+0x75/0x110
    [ 548.623436] kmalloc_order+0x24/0x60
    [ 548.623442] kmalloc_order_trace+0x24/0xb0
    [ 548.623448] __kmalloc_track_caller+0x207/0x220
    [ 548.623455] ? f2fs_build_node_manager+0x399/0xbb0
    [ 548.623460] kmemdup+0x20/0x50
    [ 548.623465] f2fs_build_node_manager+0x399/0xbb0
    [ 548.623470] f2fs_fill_super+0x195e/0x2b40
    [ 548.623477] ? f2fs_commit_super+0x1b0/0x1b0
    [ 548.623481] ? set_blocksize+0x90/0x140
    [ 548.623486] mount_bdev+0x1c5/0x210
    [ 548.623489] ? f2fs_commit_super+0x1b0/0x1b0
    [ 548.623495] f2fs_mount+0x15/0x20
    [ 548.623498] mount_fs+0x60/0x1a0
    [ 548.623503] ? alloc_vfsmnt+0x309/0x360
    [ 548.623508] vfs_kern_mount+0x6b/0x1a0
    [ 548.623513] do_mount+0x34a/0x18c0
    [ 548.623518] ? lockref_put_or_lock+0xcf/0x160
    [ 548.623523] ? copy_mount_string+0x20/0x20
    [ 548.623528] ? memcg_kmem_put_cache+0x1b/0xa0
    [ 548.623533] ? kasan_check_write+0x14/0x20
    [ 548.623537] ? _copy_from_user+0x6a/0x90
    [ 548.623542] ? memdup_user+0x42/0x60
    [ 548.623547] ksys_mount+0x83/0xd0
    [ 548.623552] __x64_sys_mount+0x67/0x80
    [ 548.623557] do_syscall_64+0x78/0x170
    [ 548.623562] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 548.623566] RIP: 0033:0x7f76fc331b9a
    [ 548.623567] Code: 48 8b 0d 01 c3 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d ce c2 2b 00 f7 d8 64 89 01 48
    [ 548.623632] RSP: 002b:00007ffd4f0a0e48 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    [ 548.623636] RAX: ffffffffffffffda RBX: 000000000146c030 RCX: 00007f76fc331b9a
    [ 548.623639] RDX: 000000000146c210 RSI: 000000000146df30 RDI: 0000000001474ec0
    [ 548.623641] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000013
    [ 548.623643] R10: 00000000c0ed0000 R11: 0000000000000206 R12: 0000000001474ec0
    [ 548.623646] R13: 000000000146c210 R14: 0000000000000000 R15: 0000000000000003
    [ 548.623650] ---[ end trace 4ce02f25ff7d3df5 ]---
    [ 548.623656] F2FS-fs (loop0): Failed to initialize F2FS node manager
    [ 548.627936] F2FS-fs (loop0): Invalid log blocks per segment (8201)

    [ 548.627940] F2FS-fs (loop0): Can't find valid F2FS filesystem in 1th superblock
    [ 548.635835] F2FS-fs (loop0): Failed to initialize F2FS node manager

    - Location
    https://elixir.bootlin.com/linux/v4.18-rc1/source/fs/f2fs/segment.c#L3578

    sit_i->sit_bitmap = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL);

    Buffer overrun happens when doing memcpy. I suspect there is missing (inconsistent) checks on bitmap_size.

    Reported by Wen Xu (wen.xu@gatech.edu) from SSLab, Gatech.

    Reported-by: Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 2a96d8ad94ce57cb0072f7a660b1039720c47716 ]

    "ret" can be uninitialized on the success path when "in ==
    F2FS_GOING_DOWN_FULLSYNC".

    Fixes: 60b2b4ee2bc0 ("f2fs: Fix deadlock in shutdown ioctl")
    Signed-off-by: Dan Carpenter
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Dan Carpenter
     
  • [ Upstream commit 6aead1617b3adf2b7e2c56f0f13e4e0ee42ebb4a ]

    In error path of f2fs_move_rehashed_dirents, inode page could be writeback
    state, so we should wait on inode page writeback before updating it.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 4dbe38dc386910c668c75ae616b99b823b59f3eb ]

    As Wen Xu reported in bugzilla, after image was injected with random data
    by fuzzing, inline inode would contain invalid reserved blkaddr, then
    during inline conversion, we will encounter illegal memory accessing
    reported by KASAN, the root cause of this is when writing out converted
    inline page, we will use invalid reserved blkaddr to update sit bitmap,
    result in accessing memory beyond sit bitmap boundary.

    In order to fix this issue, let's do sanity check with reserved block
    address of inline inode to avoid above condition.

    https://bugzilla.kernel.org/show_bug.cgi?id=200179

    [ 1428.846352] BUG: KASAN: use-after-free in update_sit_entry+0x80/0x7f0
    [ 1428.846618] Read of size 4 at addr ffff880194483540 by task a.out/2741

    [ 1428.846855] CPU: 0 PID: 2741 Comm: a.out Tainted: G W 4.17.0+ #1
    [ 1428.846858] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 1428.846860] Call Trace:
    [ 1428.846868] dump_stack+0x71/0xab
    [ 1428.846875] print_address_description+0x6b/0x290
    [ 1428.846881] kasan_report+0x28e/0x390
    [ 1428.846888] ? update_sit_entry+0x80/0x7f0
    [ 1428.846898] update_sit_entry+0x80/0x7f0
    [ 1428.846906] f2fs_allocate_data_block+0x6db/0xc70
    [ 1428.846914] ? f2fs_get_node_info+0x14f/0x590
    [ 1428.846920] do_write_page+0xc8/0x150
    [ 1428.846928] f2fs_outplace_write_data+0xfe/0x210
    [ 1428.846935] ? f2fs_do_write_node_page+0x170/0x170
    [ 1428.846941] ? radix_tree_tag_clear+0xff/0x130
    [ 1428.846946] ? __mod_node_page_state+0x22/0xa0
    [ 1428.846951] ? inc_zone_page_state+0x54/0x100
    [ 1428.846956] ? __test_set_page_writeback+0x336/0x5d0
    [ 1428.846964] f2fs_convert_inline_page+0x407/0x6d0
    [ 1428.846971] ? f2fs_read_inline_data+0x3b0/0x3b0
    [ 1428.846978] ? __get_node_page+0x335/0x6b0
    [ 1428.846987] f2fs_convert_inline_inode+0x41b/0x500
    [ 1428.846994] ? f2fs_convert_inline_page+0x6d0/0x6d0
    [ 1428.847000] ? kasan_unpoison_shadow+0x31/0x40
    [ 1428.847005] ? kasan_kmalloc+0xa6/0xd0
    [ 1428.847024] f2fs_file_mmap+0x79/0xc0
    [ 1428.847029] mmap_region+0x58b/0x880
    [ 1428.847037] ? arch_get_unmapped_area+0x370/0x370
    [ 1428.847042] do_mmap+0x55b/0x7a0
    [ 1428.847048] vm_mmap_pgoff+0x16f/0x1c0
    [ 1428.847055] ? vma_is_stack_for_current+0x50/0x50
    [ 1428.847062] ? __fsnotify_update_child_dentry_flags.part.1+0x160/0x160
    [ 1428.847068] ? do_sys_open+0x206/0x2a0
    [ 1428.847073] ? __fget+0xb4/0x100
    [ 1428.847079] ksys_mmap_pgoff+0x278/0x360
    [ 1428.847085] ? find_mergeable_anon_vma+0x50/0x50
    [ 1428.847091] do_syscall_64+0x73/0x160
    [ 1428.847098] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 1428.847102] RIP: 0033:0x7fb1430766ba
    [ 1428.847103] Code: 89 f5 41 54 49 89 fc 55 53 74 35 49 63 e8 48 63 da 4d 89 f9 49 89 e8 4d 63 d6 48 89 da 4c 89 ee 4c 89 e7 b8 09 00 00 00 0f 05 3d 00 f0 ff ff 77 56 5b 5d 41 5c 41 5d 41 5e 41 5f c3 0f 1f 00
    [ 1428.847162] RSP: 002b:00007ffc651d9388 EFLAGS: 00000246 ORIG_RAX: 0000000000000009
    [ 1428.847167] RAX: ffffffffffffffda RBX: 0000000000000001 RCX: 00007fb1430766ba
    [ 1428.847170] RDX: 0000000000000001 RSI: 0000000000001000 RDI: 0000000000000000
    [ 1428.847173] RBP: 0000000000000003 R08: 0000000000000003 R09: 0000000000000000
    [ 1428.847176] R10: 0000000000008002 R11: 0000000000000246 R12: 0000000000000000
    [ 1428.847179] R13: 0000000000001000 R14: 0000000000008002 R15: 0000000000000000

    [ 1428.847252] Allocated by task 2683:
    [ 1428.847372] kasan_kmalloc+0xa6/0xd0
    [ 1428.847380] kmem_cache_alloc+0xc8/0x1e0
    [ 1428.847385] getname_flags+0x73/0x2b0
    [ 1428.847390] user_path_at_empty+0x1d/0x40
    [ 1428.847395] vfs_statx+0xc1/0x150
    [ 1428.847401] __do_sys_newlstat+0x7e/0xd0
    [ 1428.847405] do_syscall_64+0x73/0x160
    [ 1428.847411] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    [ 1428.847466] Freed by task 2683:
    [ 1428.847566] __kasan_slab_free+0x137/0x190
    [ 1428.847571] kmem_cache_free+0x85/0x1e0
    [ 1428.847575] filename_lookup+0x191/0x280
    [ 1428.847580] vfs_statx+0xc1/0x150
    [ 1428.847585] __do_sys_newlstat+0x7e/0xd0
    [ 1428.847590] do_syscall_64+0x73/0x160
    [ 1428.847596] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    [ 1428.847648] The buggy address belongs to the object at ffff880194483300
    which belongs to the cache names_cache of size 4096
    [ 1428.847946] The buggy address is located 576 bytes inside of
    4096-byte region [ffff880194483300, ffff880194484300)
    [ 1428.848234] The buggy address belongs to the page:
    [ 1428.848366] page:ffffea0006512000 count:1 mapcount:0 mapping:ffff8801f3586380 index:0x0 compound_mapcount: 0
    [ 1428.848606] flags: 0x17fff8000008100(slab|head)
    [ 1428.848737] raw: 017fff8000008100 dead000000000100 dead000000000200 ffff8801f3586380
    [ 1428.848931] raw: 0000000000000000 0000000000070007 00000001ffffffff 0000000000000000
    [ 1428.849122] page dumped because: kasan: bad access detected

    [ 1428.849305] Memory state around the buggy address:
    [ 1428.849436] ffff880194483400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.849620] ffff880194483480: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.849804] >ffff880194483500: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.849985] ^
    [ 1428.850120] ffff880194483580: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.850303] ffff880194483600: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.850498] ==================================================================

    Reported-by: Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 10d255c3540239c7920f52d2eb223756e186af56 ]

    If segment type in SSA and SIT is inconsistent, we will encounter below
    BUG_ON during GC, to avoid this panic, let's just skip doing GC on such
    segment.

    The bug is triggered with image reported in below link:

    https://bugzilla.kernel.org/show_bug.cgi?id=200223

    [ 388.060262] ------------[ cut here ]------------
    [ 388.060268] kernel BUG at /home/y00370721/git/devf2fs/gc.c:989!
    [ 388.061172] invalid opcode: 0000 [#1] SMP
    [ 388.061773] Modules linked in: f2fs(O) bluetooth ecdh_generic xt_tcpudp iptable_filter ip_tables x_tables lp ttm drm_kms_helper drm intel_rapl sb_edac crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcbc aesni_intel fb_sys_fops ppdev aes_x86_64 syscopyarea crypto_simd sysfillrect parport_pc joydev sysimgblt glue_helper parport cryptd i2c_piix4 serio_raw mac_hid btrfs hid_generic usbhid hid raid6_pq psmouse pata_acpi floppy
    [ 388.064247] CPU: 7 PID: 4151 Comm: f2fs_gc-7:0 Tainted: G O 4.13.0-rc1+ #26
    [ 388.065306] Hardware name: Xen HVM domU, BIOS 4.1.2_115-900.260_ 11/06/2015
    [ 388.066058] task: ffff880201583b80 task.stack: ffffc90004d7c000
    [ 388.069948] RIP: 0010:do_garbage_collect+0xcc8/0xcd0 [f2fs]
    [ 388.070766] RSP: 0018:ffffc90004d7fc68 EFLAGS: 00010202
    [ 388.071783] RAX: ffff8801ed227000 RBX: 0000000000000001 RCX: ffffea0007b489c0
    [ 388.072700] RDX: ffff880000000000 RSI: 0000000000000001 RDI: ffffea0007b489c0
    [ 388.073607] RBP: ffffc90004d7fd58 R08: 0000000000000003 R09: ffffea0007b489dc
    [ 388.074619] R10: 0000000000000000 R11: 0052782ab317138d R12: 0000000000000018
    [ 388.075625] R13: 0000000000000018 R14: ffff880211ceb000 R15: ffff880211ceb000
    [ 388.076687] FS: 0000000000000000(0000) GS:ffff880214fc0000(0000) knlGS:0000000000000000
    [ 388.083277] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 388.084536] CR2: 0000000000e18c60 CR3: 00000001ecf2e000 CR4: 00000000001406e0
    [ 388.085748] Call Trace:
    [ 388.086690] ? find_next_bit+0xb/0x10
    [ 388.088091] f2fs_gc+0x1a8/0x9d0 [f2fs]
    [ 388.088888] ? lock_timer_base+0x7d/0xa0
    [ 388.090213] ? try_to_del_timer_sync+0x44/0x60
    [ 388.091698] gc_thread_func+0x342/0x4b0 [f2fs]
    [ 388.092892] ? wait_woken+0x80/0x80
    [ 388.094098] kthread+0x109/0x140
    [ 388.095010] ? f2fs_gc+0x9d0/0x9d0 [f2fs]
    [ 388.096043] ? kthread_park+0x60/0x60
    [ 388.097281] ret_from_fork+0x25/0x30
    [ 388.098401] Code: ff ff 48 83 e8 01 48 89 44 24 58 e9 27 f8 ff ff 48 83 e8 01 e9 78 fc ff ff 48 8d 78 ff e9 17 fb ff ff 48 83 ef 01 e9 4d f4 ff ff 0b 66 0f 1f 44 00 00 0f 1f 44 00 00 55 48 89 e5 41 56 41 55
    [ 388.100864] RIP: do_garbage_collect+0xcc8/0xcd0 [f2fs] RSP: ffffc90004d7fc68
    [ 388.101810] ---[ end trace 81c73d6e6b7da61d ]---

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 4b270a8cc5047682f0a3f3f9af3b498408dbd2bc ]

    In synchronous scenario, like in checkpoint(), we are going to flush
    dirty node pages to device synchronously, we can easily failed
    writebacking node page due to trylock_page() failure, especially in
    condition of intensive lock competition, which can cause long latency
    of checkpoint(). So let's use lock_page() in synchronous scenario to
    avoid this issue.

    Signed-off-by: Yunlei He
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit cb15d1e43db0a6341c1e26ac6a2c74e61b74f1aa ]

    Fix build warnings in f2fs when CONFIG_PROC_FS is not enabled
    by marking the unused functions as __maybe_unused.

    ../fs/f2fs/sysfs.c:519:12: warning: 'segment_info_seq_show' defined but not used [-Wunused-function]
    ../fs/f2fs/sysfs.c:546:12: warning: 'segment_bits_seq_show' defined but not used [-Wunused-function]
    ../fs/f2fs/sysfs.c:570:12: warning: 'iostat_info_seq_show' defined but not used [-Wunused-function]

    Signed-off-by: Randy Dunlap
    Cc: Jaegeuk Kim
    Cc: Chao Yu
    Cc: linux-f2fs-devel@lists.sourceforge.net
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Randy Dunlap
     
  • [ Upstream commit 3611ce9911267cb93d364bd71ddea6821278d11f ]

    For the case when sbi->segs_per_sec > 1, take section:segment = 5 for
    example, if segment 1 is just used and allocate new segment 2, and the
    blocks of segment 1 is invalidated, at this time, the previous code will
    use __set_test_and_free to free the free_secmap and free_sections++,
    this is not correct since it is still a current section, so fix it.

    Signed-off-by: Yunlong Song
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Yunlong Song
     
  • [ Upstream commit 82cf4f132e6d16dca6fc3bd955019246141bc645 ]

    If config CONFIG_F2FS_FAULT_INJECTION is on, for both read or write path
    we will call find_lock_page() to get the page, but for read path, it
    missed to passing FGP_ACCESSED to allocator to active the page in LRU
    list, result in being reclaimed in advance incorrectly, fix it.

    Reported-by: Xianrong Zhou
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     

15 Sep, 2018

1 commit

  • [ Upstream commit 66110abc4c931f879d70e83e1281f891699364bf ]

    PG_checked flag will be set on data page during GC, later, we can
    recognize such page by the flag and migrate page to cold segment.

    But previously, we don't clear this flag when invalidating data page,
    after page redirtying, we will write it into wrong log.

    Let's clear PG_checked flag in set_page_dirty() to avoid this.

    Signed-off-by: Weichao Guo
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     

24 Aug, 2018

2 commits

  • commit 8a29c1260e24e7c9c6ab138aa0017558d8b28208 upstream.

    This patch enhances sanity check for SIT entries.

    syzbot hit the following crash on upstream commit
    83beed7b2b26f232d782127792dd0cd4362fdc41 (Fri Apr 20 17:56:32 2018 +0000)
    Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal
    syzbot dashboard link: https://syzkaller.appspot.com/bug?extid=bf9253040425feb155ad

    syzkaller reproducer: https://syzkaller.appspot.com/x/repro.syz?id=5692130282438656
    Raw console output: https://syzkaller.appspot.com/x/log.txt?id=5095924598571008
    Kernel config: https://syzkaller.appspot.com/x/.config?id=1808800213120130118
    compiler: gcc (GCC) 8.0.1 20180413 (experimental)

    IMPORTANT: if you fix the bug, please add the following tag to the commit:
    Reported-by: syzbot+bf9253040425feb155ad@syzkaller.appspotmail.com
    It will help syzbot understand when the bug is fixed. See footer for details.
    If you forward the report, please keep this part and the footer.

    F2FS-fs (loop0): invalid crc value
    F2FS-fs (loop0): Try to recover 1th superblock, ret: 0
    F2FS-fs (loop0): Mounted with checkpoint version = d
    F2FS-fs (loop0): Bitmap was wrongly cleared, blk:9740
    ------------[ cut here ]------------
    kernel BUG at fs/f2fs/segment.c:1884!
    invalid opcode: 0000 [#1] SMP KASAN
    Dumping ftrace buffer:
    (ftrace buffer empty)
    Modules linked in:
    CPU: 1 PID: 4508 Comm: syz-executor0 Not tainted 4.17.0-rc1+ #10
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:update_sit_entry+0x1215/0x1590 fs/f2fs/segment.c:1882
    RSP: 0018:ffff8801af526708 EFLAGS: 00010282
    RAX: ffffed0035ea4cc0 RBX: ffff8801ad454f90 RCX: 0000000000000000
    RDX: 0000000000000000 RSI: ffffffff82eeb87e RDI: ffffed0035ea4cb6
    RBP: ffff8801af526760 R08: ffff8801ad4a2480 R09: ffffed003b5e4f90
    R10: ffffed003b5e4f90 R11: ffff8801daf27c87 R12: ffff8801adb8d380
    R13: 0000000000000001 R14: 0000000000000008 R15: 00000000ffffffff
    FS: 00000000014af940(0000) GS:ffff8801daf00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f06bc223000 CR3: 00000001adb02000 CR4: 00000000001406e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    allocate_data_block+0x66f/0x2050 fs/f2fs/segment.c:2663
    do_write_page+0x105/0x1b0 fs/f2fs/segment.c:2727
    write_node_page+0x129/0x350 fs/f2fs/segment.c:2770
    __write_node_page+0x7da/0x1370 fs/f2fs/node.c:1398
    sync_node_pages+0x18cf/0x1eb0 fs/f2fs/node.c:1652
    block_operations+0x429/0xa60 fs/f2fs/checkpoint.c:1088
    write_checkpoint+0x3ba/0x5380 fs/f2fs/checkpoint.c:1405
    f2fs_sync_fs+0x2fb/0x6a0 fs/f2fs/super.c:1077
    __sync_filesystem fs/sync.c:39 [inline]
    sync_filesystem+0x265/0x310 fs/sync.c:67
    generic_shutdown_super+0xd7/0x520 fs/super.c:429
    kill_block_super+0xa4/0x100 fs/super.c:1191
    kill_f2fs_super+0x9f/0xd0 fs/f2fs/super.c:3030
    deactivate_locked_super+0x97/0x100 fs/super.c:316
    deactivate_super+0x188/0x1b0 fs/super.c:347
    cleanup_mnt+0xbf/0x160 fs/namespace.c:1174
    __cleanup_mnt+0x16/0x20 fs/namespace.c:1181
    task_work_run+0x1e4/0x290 kernel/task_work.c:113
    tracehook_notify_resume include/linux/tracehook.h:191 [inline]
    exit_to_usermode_loop+0x2bd/0x310 arch/x86/entry/common.c:166
    prepare_exit_to_usermode arch/x86/entry/common.c:196 [inline]
    syscall_return_slowpath arch/x86/entry/common.c:265 [inline]
    do_syscall_64+0x6ac/0x800 arch/x86/entry/common.c:290
    entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x457d97
    RSP: 002b:00007ffd46f9c8e8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000457d97
    RDX: 00000000014b09a3 RSI: 0000000000000002 RDI: 00007ffd46f9da50
    RBP: 00007ffd46f9da50 R08: 0000000000000000 R09: 0000000000000009
    R10: 0000000000000005 R11: 0000000000000246 R12: 00000000014b0940
    R13: 0000000000000000 R14: 0000000000000002 R15: 000000000000658e
    RIP: update_sit_entry+0x1215/0x1590 fs/f2fs/segment.c:1882 RSP: ffff8801af526708
    ---[ end trace f498328bb02610a2 ]---

    Reported-and-tested-by: syzbot+bf9253040425feb155ad@syzkaller.appspotmail.com
    Reported-and-tested-by: syzbot+7d6d31d3bc702f566ce3@syzkaller.appspotmail.com
    Reported-and-tested-by: syzbot+0a725420475916460f12@syzkaller.appspotmail.com
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sudip Mukherjee
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     
  • commit c39a1b348c4fe172729eff77c533dabc3c7cdaa7 upstream.

    Let's avoid BUG_ON during fill_super, when on-disk was totall corrupted.

    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sudip Mukherjee
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     

03 Aug, 2018

8 commits

  • [ Upstream commit 5b19d284f5195a925dd015a6397bfce184097378 ]

    pageout() in MM traslates EAGAIN, so calls handle_write_error()
    -> mapping_set_error() -> set_bit(AS_EIO, ...).
    file_write_and_wait_range() will see EIO error, which is critical
    to return value of fsync() followed by atomic_write failure to user.

    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     
  • [ Upstream commit 27319ba4044c0c67d62ae39e53c0118c89f0a029 ]

    Thread GC thread
    - f2fs_ioc_start_atomic_write
    - get_dirty_pages
    - filemap_write_and_wait_range
    - f2fs_gc
    - do_garbage_collect
    - gc_data_segment
    - move_data_page
    - f2fs_is_atomic_file
    - set_page_dirty
    - set_inode_flag(, FI_ATOMIC_FILE)

    Dirty data page can still be generated by GC in race condition as
    above call stack.

    This patch adds fi->dio_rwsem[WRITE] in f2fs_ioc_start_atomic_write
    to avoid such race.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit c22aecd75919511abea872b201751e0be1add898 ]

    dquot_initialize() can fail due to any exception inside quota subsystem,
    f2fs needs to be aware of it, and return correct return value to caller.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 60b2b4ee2bc01dd052f99fa9d65da2232102ef8e ]

    f2fs_ioc_shutdown() ioctl gets stuck in the below path
    when issued with F2FS_GOING_DOWN_FULLSYNC option.

    __switch_to+0x90/0xc4
    percpu_down_write+0x8c/0xc0
    freeze_super+0xec/0x1e4
    freeze_bdev+0xc4/0xcc
    f2fs_ioctl+0xc0c/0x1ce0
    f2fs_compat_ioctl+0x98/0x1f0

    Signed-off-by: Sahitya Tummala
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sahitya Tummala
     
  • [ Upstream commit e5e5732d8120654159254c16834bc8663d8be124 ]

    After revoking atomic write, related LBA can be reused by others, so we
    need to wait page writeback before reusing the LBA, in order to avoid
    interference between old atomic written in-flight IO and new IO.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 64c74a7ab505ea40d1b3e5d02735ecab08ae1b14 ]

    - f2fs_fill_super
    - recover_fsync_data
    - recover_data
    - del_fsync_inode
    - iput
    - iput_final
    - write_inode_now
    - f2fs_write_inode
    - f2fs_balance_fs
    - f2fs_balance_fs_bg
    - sync_dirty_inodes

    With data_flush mount option, during recovery, in order to avoid entering
    above writeback flow, let's detect recovery status and do skip in
    f2fs_balance_fs_bg.

    Signed-off-by: Chao Yu
    Signed-off-by: Yunlei He
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 14a28559f43ac7c0b98dd1b0e73ec9ec8ab4fc45 ]

    This patch fixes error path of move_data_page:
    - clear cold data flag if it fails to write page.
    - redirty page for non-ENOMEM case.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 4071e67cffcc5c2a007116a02437471351f550eb ]

    The following patch disables loading of f2fs module on architectures
    which have PAGE_SIZE > 4096 , since it is impossible to mount f2fs on
    such architectures , log messages are:

    mount: /mnt: wrong fs type, bad option, bad superblock on
    /dev/vdiskb1, missing codepage or helper program, or other error.
    /dev/vdiskb1: F2FS filesystem,
    UUID=1d8b9ca4-2389-4910-af3b-10998969f09c, volume name ""

    May 15 18:03:13 ttip kernel: F2FS-fs (vdiskb1): Invalid
    page_cache_size (8192), supports only 4KB
    May 15 18:03:13 ttip kernel: F2FS-fs (vdiskb1): Can't find valid F2FS
    filesystem in 1th superblock
    May 15 18:03:13 ttip kernel: F2FS-fs (vdiskb1): Invalid
    page_cache_size (8192), supports only 4KB
    May 15 18:03:13 ttip kernel: F2FS-fs (vdiskb1): Can't find valid F2FS
    filesystem in 2th superblock
    May 15 18:03:13 ttip kernel: F2FS-fs (vdiskb1): Invalid
    page_cache_size (8192), supports only 4KB

    which was introduced by git commit 5c9b469295fb6b10d98923eab5e79c4edb80ed20

    tested on git kernel 4.17.0-rc6-00309-gec30dcf7f425

    with patch applied:

    modprobe: ERROR: could not insert 'f2fs': Invalid argument
    May 28 01:40:28 v215 kernel: F2FS not supported on PAGE_SIZE(8192) != 4096

    Signed-off-by: Anatoly Pugachev
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Anatoly Pugachev
     

17 Jul, 2018

1 commit

  • commit a4f843bd004d775cbb360cd375969b8a479568a9 upstream.

    syzbot hit the following crash on upstream commit
    83beed7b2b26f232d782127792dd0cd4362fdc41 (Fri Apr 20 17:56:32 2018 +0000)
    Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal
    syzbot dashboard link: https://syzkaller.appspot.com/bug?extid=d154ec99402c6f628887

    C reproducer: https://syzkaller.appspot.com/x/repro.c?id=5414336294027264
    syzkaller reproducer: https://syzkaller.appspot.com/x/repro.syz?id=5471683234234368
    Raw console output: https://syzkaller.appspot.com/x/log.txt?id=5436660795834368
    Kernel config: https://syzkaller.appspot.com/x/.config?id=1808800213120130118
    compiler: gcc (GCC) 8.0.1 20180413 (experimental)

    IMPORTANT: if you fix the bug, please add the following tag to the commit:
    Reported-by: syzbot+d154ec99402c6f628887@syzkaller.appspotmail.com
    It will help syzbot understand when the bug is fixed. See footer for details.
    If you forward the report, please keep this part and the footer.

    F2FS-fs (loop0): Magic Mismatch, valid(0xf2f52010) - read(0x0)
    F2FS-fs (loop0): Can't find valid F2FS filesystem in 1th superblock
    F2FS-fs (loop0): invalid crc value
    ------------[ cut here ]------------
    kernel BUG at fs/f2fs/node.c:1185!
    invalid opcode: 0000 [#1] SMP KASAN
    Dumping ftrace buffer:
    (ftrace buffer empty)
    Modules linked in:
    CPU: 1 PID: 4549 Comm: syzkaller704305 Not tainted 4.17.0-rc1+ #10
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:__get_node_page+0xb68/0x16e0 fs/f2fs/node.c:1185
    RSP: 0018:ffff8801d960e820 EFLAGS: 00010293
    RAX: ffff8801d88205c0 RBX: 0000000000000003 RCX: ffffffff82f6cc06
    RDX: 0000000000000000 RSI: ffffffff82f6d5e8 RDI: 0000000000000004
    RBP: ffff8801d960ec30 R08: ffff8801d88205c0 R09: ffffed003b5e46c2
    R10: 0000000000000003 R11: 0000000000000003 R12: ffff8801a86e00c0
    R13: 0000000000000001 R14: ffff8801a86e0530 R15: ffff8801d9745240
    FS: 000000000072c880(0000) GS:ffff8801daf00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f3d403209b8 CR3: 00000001d8f3f000 CR4: 00000000001406e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    get_node_page fs/f2fs/node.c:1237 [inline]
    truncate_xattr_node+0x152/0x2e0 fs/f2fs/node.c:1014
    remove_inode_page+0x200/0xaf0 fs/f2fs/node.c:1039
    f2fs_evict_inode+0xe86/0x1710 fs/f2fs/inode.c:547
    evict+0x4a6/0x960 fs/inode.c:557
    iput_final fs/inode.c:1519 [inline]
    iput+0x62d/0xa80 fs/inode.c:1545
    f2fs_fill_super+0x5f4e/0x7bf0 fs/f2fs/super.c:2849
    mount_bdev+0x30c/0x3e0 fs/super.c:1164
    f2fs_mount+0x34/0x40 fs/f2fs/super.c:3020
    mount_fs+0xae/0x328 fs/super.c:1267
    vfs_kern_mount.part.34+0xd4/0x4d0 fs/namespace.c:1037
    vfs_kern_mount fs/namespace.c:1027 [inline]
    do_new_mount fs/namespace.c:2518 [inline]
    do_mount+0x564/0x3070 fs/namespace.c:2848
    ksys_mount+0x12d/0x140 fs/namespace.c:3064
    __do_sys_mount fs/namespace.c:3078 [inline]
    __se_sys_mount fs/namespace.c:3075 [inline]
    __x64_sys_mount+0xbe/0x150 fs/namespace.c:3075
    do_syscall_64+0x1b1/0x800 arch/x86/entry/common.c:287
    entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x443dea
    RSP: 002b:00007ffcc7882368 EFLAGS: 00000297 ORIG_RAX: 00000000000000a5
    RAX: ffffffffffffffda RBX: 0000000020000c00 RCX: 0000000000443dea
    RDX: 0000000020000000 RSI: 0000000020000100 RDI: 00007ffcc7882370
    RBP: 0000000000000003 R08: 0000000020016a00 R09: 000000000000000a
    R10: 0000000000000000 R11: 0000000000000297 R12: 0000000000000004
    R13: 0000000000402ce0 R14: 0000000000000000 R15: 0000000000000000
    RIP: __get_node_page+0xb68/0x16e0 fs/f2fs/node.c:1185 RSP: ffff8801d960e820
    ---[ end trace 4edbeb71f002bb76 ]---

    Reported-and-tested-by: syzbot+d154ec99402c6f628887@syzkaller.appspotmail.com
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     

11 Jul, 2018

1 commit

  • commit dc7a10ddee0c56c6d891dd18de5c4ee9869545e0 upstream.

    If write is failed, we must deallocate the blocks that we couldn't write.

    Cc: stable@vger.kernel.org
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sudip Mukherjee
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     

30 May, 2018

4 commits

  • [ Upstream commit bf617f7a92edc6bb2909db2bfa4576f50b280ee5 ]

    If noextent_cache mount option is on, we will never initialize extent tree
    in inode, but still we're going to access it in f2fs_drop_extent_tree,
    result in kernel panic as below:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000038
    IP: _raw_write_lock+0xc/0x30
    Call Trace:
    ? f2fs_drop_extent_tree+0x41/0x70 [f2fs]
    f2fs_fallocate+0x5a0/0xdd0 [f2fs]
    ? common_file_perm+0x47/0xc0
    ? apparmor_file_permission+0x1a/0x20
    vfs_fallocate+0x15b/0x290
    SyS_fallocate+0x44/0x70
    do_syscall_64+0x6e/0x160
    entry_SYSCALL64_slow_path+0x25/0x25

    This patch fixes to check extent cache status before using in
    f2fs_drop_extent_tree.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit cd36d7a17f9da68be9aa67185ba3ad7969934a19 ]

    Once CP_TRIMMED_FLAG is set, after a reboot, we will never issue discard
    before LBA becomes invalid again, fix it by clearing the flag in
    checkpoint without CP_TRIMMED reason.

    Fixes: 1f43e2ad7bff ("f2fs: introduce CP_TRIMMED_FLAG to avoid unneeded discard")
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 17cd07ae95073c298af92c1ba14ac58ce84de33b ]

    As Jayashree Mohan reported:

    A simple workload to reproduce this would be :
    1. create foo
    2. Write (8K - 16K) // foo size = 16K now
    3. fsync()
    4. falloc zero_range , keep_size (4202496 - 4210688) // foo size must be 16K
    5. fdatasync()
    Crash now

    On recovery, we see that the file size is 4210688 and not 16K, which
    violates the semantics of keep_size flag. We have a test case to
    reproduce this using CrashMonkey on 4.15 kernel. Try this out by
    simply running :
    ./c_harness -f /dev/sda -d /dev/cow_ram0 -t f2fs -e 102400 -P -v
    tests/generic_468_zero.so

    The root cause is that we miss to set KEEP_SIZE bit correctly in zero_range
    when zeroing block cross EOF with FALLOC_FL_KEEP_SIZE, let's fix this
    missing case.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • commit 1e2e547a93a00ebc21582c06ca3c6cfea2a309ee upstream.

    For anything NFS-exported we do _not_ want to unlock new inode
    before it has grown an alias; original set of fixes got the
    ordering right, but missed the nasty complication in case of
    lockdep being enabled - unlock_new_inode() does
    lockdep_annotate_inode_mutex_key(inode)
    which can only be done before anyone gets a chance to touch
    ->i_mutex. Unfortunately, flipping the order and doing
    unlock_new_inode() before d_instantiate() opens a window when
    mkdir can race with open-by-fhandle on a guessed fhandle, leading
    to multiple aliases for a directory inode and all the breakage
    that follows from that.

    Correct solution: a new primitive (d_instantiate_new())
    combining these two in the right order - lockdep annotate, then
    d_instantiate(), then the rest of unlock_new_inode(). All
    combinations of d_instantiate() with unlock_new_inode() should
    be converted to that.

    Cc: stable@kernel.org # 2.6.29 and later
    Tested-by: Mike Marshall
    Reviewed-by: Andreas Dilger
    Signed-off-by: Al Viro
    Signed-off-by: Greg Kroah-Hartman

    Al Viro
     

26 Apr, 2018

1 commit

  • [ Upstream commit a9d572c7550044d5b217b5287d99a2e6d34b97b0 ]

    When io_bits is set, GCing encrypted block may hit the following hungtask.
    Since io_bits requires aligned block address, f2fs_submit_page_write may
    return -EAGAIN if new_blkaddr does not satisify io_bits alignment. As a
    result, the encrypted page will never be writtenback.

    This patch makes move_data_block aware the EAGAIN error and cancel the
    writeback.

    [ 246.751371] INFO: task kworker/u4:4:797 blocked for more than 90 seconds.
    [ 246.752423] Not tainted 4.15.0-rc4+ #11
    [ 246.754176] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    [ 246.755336] kworker/u4:4 D25448 797 2 0x80000000
    [ 246.755597] Workqueue: writeback wb_workfn (flush-7:0)
    [ 246.755616] Call Trace:
    [ 246.755695] ? __schedule+0x322/0xa90
    [ 246.755761] ? blk_init_request_from_bio+0x120/0x120
    [ 246.755773] ? pci_mmcfg_check_reserved+0xb0/0xb0
    [ 246.755801] ? __radix_tree_create+0x19e/0x200
    [ 246.755813] ? delete_node+0x136/0x370
    [ 246.755838] schedule+0x43/0xc0
    [ 246.755904] io_schedule+0x17/0x40
    [ 246.755939] wait_on_page_bit_common+0x17b/0x240
    [ 246.755950] ? wake_page_function+0xa0/0xa0
    [ 246.755961] ? add_to_page_cache_lru+0x160/0x160
    [ 246.755972] ? page_cache_tree_insert+0x170/0x170
    [ 246.755983] ? __lru_cache_add+0x96/0xb0
    [ 246.756086] __filemap_fdatawait_range+0x14f/0x1c0
    [ 246.756097] ? wait_on_page_bit_common+0x240/0x240
    [ 246.756120] ? __wake_up_locked_key_bookmark+0x20/0x20
    [ 246.756167] ? wait_on_all_pages_writeback+0xc9/0x100
    [ 246.756179] ? __remove_ino_entry+0x120/0x120
    [ 246.756192] ? wait_woken+0x100/0x100
    [ 246.756204] filemap_fdatawait_range+0x9/0x20
    [ 246.756216] write_checkpoint+0x18a1/0x1f00
    [ 246.756254] ? blk_get_request+0x10/0x10
    [ 246.756265] ? cpumask_next_and+0x43/0x60
    [ 246.756279] ? f2fs_sync_inode_meta+0x160/0x160
    [ 246.756289] ? remove_element.isra.4+0xa0/0xa0
    [ 246.756300] ? __put_compound_page+0x40/0x40
    [ 246.756310] ? f2fs_sync_fs+0xec/0x1c0
    [ 246.756320] ? f2fs_sync_fs+0x120/0x1c0
    [ 246.756329] f2fs_sync_fs+0x120/0x1c0
    [ 246.756357] ? trace_event_raw_event_f2fs__page+0x260/0x260
    [ 246.756393] ? ata_build_rw_tf+0x173/0x410
    [ 246.756397] f2fs_balance_fs_bg+0x198/0x390
    [ 246.756405] ? drop_inmem_page+0x230/0x230
    [ 246.756415] ? ahci_qc_prep+0x1bb/0x2e0
    [ 246.756418] ? ahci_qc_issue+0x1df/0x290
    [ 246.756422] ? __accumulate_pelt_segments+0x42/0xd0
    [ 246.756426] ? f2fs_write_node_pages+0xd1/0x380
    [ 246.756429] f2fs_write_node_pages+0xd1/0x380
    [ 246.756437] ? sync_node_pages+0x8f0/0x8f0
    [ 246.756440] ? update_curr+0x53/0x220
    [ 246.756444] ? __accumulate_pelt_segments+0xa2/0xd0
    [ 246.756448] ? __update_load_avg_se.isra.39+0x349/0x360
    [ 246.756452] ? do_writepages+0x2a/0xa0
    [ 246.756456] do_writepages+0x2a/0xa0
    [ 246.756460] __writeback_single_inode+0x70/0x490
    [ 246.756463] ? check_preempt_wakeup+0x199/0x310
    [ 246.756467] writeback_sb_inodes+0x2a2/0x660
    [ 246.756471] ? is_empty_dir_inode+0x40/0x40
    [ 246.756474] ? __writeback_single_inode+0x490/0x490
    [ 246.756477] ? string+0xbf/0xf0
    [ 246.756480] ? down_read_trylock+0x35/0x60
    [ 246.756484] __writeback_inodes_wb+0x9f/0xf0
    [ 246.756488] wb_writeback+0x41d/0x4b0
    [ 246.756492] ? writeback_inodes_wb.constprop.55+0x150/0x150
    [ 246.756498] ? set_worker_desc+0xf7/0x130
    [ 246.756502] ? current_is_workqueue_rescuer+0x60/0x60
    [ 246.756511] ? _find_next_bit+0x2c/0xa0
    [ 246.756514] ? wb_workfn+0x400/0x5d0
    [ 246.756518] wb_workfn+0x400/0x5d0
    [ 246.756521] ? finish_task_switch+0xdf/0x2a0
    [ 246.756525] ? inode_wait_for_writeback+0x30/0x30
    [ 246.756529] process_one_work+0x3a7/0x6f0
    [ 246.756533] worker_thread+0x82/0x750
    [ 246.756537] kthread+0x16f/0x1c0
    [ 246.756541] ? trace_event_raw_event_workqueue_work+0x110/0x110
    [ 246.756544] ? kthread_create_worker_on_cpu+0xb0/0xb0
    [ 246.756548] ret_from_fork+0x1f/0x30

    Signed-off-by: Sheng Yong
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sheng Yong
     

19 Apr, 2018

1 commit

  • commit b94929d975c8423defc9aededb0f499ff936b509 upstream.

    Commit 7a20b8a61eff81bdb7097a578752a74860e9d142 ("f2fs: allocate node
    and hot data in the beginning of partition") introduces another mount
    option, heap, to reset it back. But it does not do anything for heap
    mode, so fix it.

    Cc: stable@vger.kernel.org
    Signed-off-by: Yunlong Song
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Greg Kroah-Hartman

    Yunlong Song
     

14 Dec, 2017

1 commit

  • [ Upstream commit 28cfafb73853f0494b06649716687a3ea07681d5 ]

    We need to clear FI_NO_PREALLOC flag in error path of f2fs_file_write_iter,
    otherwise we will lose the chance to preallocate blocks in latter write()
    at one time.

    Fixes: dc91de78e5e1 ("f2fs: do not preallocate blocks which has wrong buffer")
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     

30 Nov, 2017

1 commit

  • commit 5b4267d195dd887c4412e34b5a7365baa741b679 upstream.

    If there's some data written through inline data or dentry, we need to shouw
    st_blocks. This fixes reporting zero blocks even though there is small written
    data.

    Reviewed-by: Chao Yu
    [Jaegeuk Kim: avoid link file for quotacheck]
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

03 Oct, 2017

1 commit

  • As Ju Hyung Park reported:

    "When 'fstrim' is called for manual trim, a BUG() can be triggered
    randomly with this patch.

    I'm seeing this issue on both x86 Desktop and arm64 Android phone.

    On x86 Desktop, this was caused during Ubuntu boot-up. I have a
    cronjob installed which calls 'fstrim -v /' during boot. On arm64
    Android, this was caused during GC looping with 1ms gc_min_sleep_time
    & gc_max_sleep_time."

    Root cause of this issue is that f2fs_wait_discard_bios can only be
    used by f2fs_put_super, because during put_super there must be no
    other referrers, so it can ignore discard entry's reference count
    when removing the entry, otherwise in other caller we will hit bug_on
    in __remove_discard_cmd as there may be other issuer added reference
    count in discard entry.

    Thread A Thread B
    - issue_discard_thread
    - f2fs_ioc_fitrim
    - f2fs_trim_fs
    - f2fs_wait_discard_bios
    - __issue_discard_cmd
    - __submit_discard_cmd
    - __wait_discard_cmd
    - dc->ref++
    - __wait_one_discard_bio
    - __wait_discard_cmd
    - __remove_discard_cmd
    - f2fs_bug_on(sbi, dc->ref)

    Fixes: 969d1b180d987c2be02de890d0fff0f66a0e80de
    Reported-by: Ju Hyung Park
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     

13 Sep, 2017

4 commits

  • Pull f2fs updates from Jaegeuk Kim:
    "In this round, we've mostly tuned f2fs to provide better user
    experience for Android. Especially, we've worked on atomic write
    feature again with SQLite community in order to support it officially.
    And we added or modified several facilities to analyze and enhance IO
    behaviors.

    Major changes include:
    - add app/fs io stat
    - add inode checksum feature
    - support project/journalled quota
    - enhance atomic write with new ioctl() which exposes feature set
    - enhance background gc/discard/fstrim flows with new gc_urgent mode
    - add F2FS_IOC_FS{GET,SET}XATTR
    - fix some quota flows"

    * tag 'f2fs-for-4.14' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (63 commits)
    f2fs: hurry up to issue discard after io interruption
    f2fs: fix to show correct discard_granularity in sysfs
    f2fs: detect dirty inode in evict_inode
    f2fs: clear radix tree dirty tag of pages whose dirty flag is cleared
    f2fs: speed up gc_urgent mode with SSR
    f2fs: better to wait for fstrim completion
    f2fs: avoid race in between read xattr & write xattr
    f2fs: make get_lock_data_page to handle encrypted inode
    f2fs: use generic terms used for encrypted block management
    f2fs: introduce f2fs_encrypted_file for clean-up
    Revert "f2fs: add a new function get_ssr_cost"
    f2fs: constify super_operations
    f2fs: fix to wake up all sleeping flusher
    f2fs: avoid race in between atomic_read & atomic_inc
    f2fs: remove unneeded parameter of change_curseg
    f2fs: update i_flags correctly
    f2fs: don't check inode's checksum if it was dirtied or writebacked
    f2fs: don't need to update inode checksum for recovery
    f2fs: trigger fdatasync for non-atomic_write file
    f2fs: fix to avoid race in between aio and gc
    ...

    Linus Torvalds
     
  • Once we encounter I/O interruption during issuing discards, we will delay
    long time before next round, but if system status is I/O idle during the
    time, it may loses opportunity to issue discards. So this patch changes
    to hurry up to issue discard after io interruption.

    Besides, this patch also fixes to issue discards accurately with assigned
    rate.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • Fix below incorrect display when reading discard_granularity sysfs node.

    $ cat /sys/fs/f2fs//discard_granularity
    $ 16
    $ echo 32 > /sys/fs/f2fs//discard_granularity
    $ cat /sys/fs/f2fs//discard_granularity
    $ 16

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • Add a bugon in f2fs_evict_inode to detect inconsistent status between
    inode cache and related node page cache.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     

12 Sep, 2017

3 commits

  • On a senario like writing out the first dirty page of the inode
    as the inline data, we only cleared dirty flags of the pages, but
    didn't clear the dirty tags of those pages in the radix tree.

    If we don't clear the dirty tags of the pages in the radix tree, the
    inodes which contain the pages will be marked with I_DIRTY_PAGES again
    and again, and writepages() for the inodes will be invoked in every
    writeback period. As a result, nothing will be done in every
    writepages() for the inodes and it will just consume CPU time
    meaninglessly.

    Signed-off-by: Daeho Jeong
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Daeho Jeong
     
  • This patch activates SSR in gc_urgent mode.

    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • In android, we'd better wait for fstrim completion instead of issuing the
    discard commands asynchronous.

    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim