22 Dec, 2020

2 commits

  • Use rwsem to ensure serialization of the callers and to avoid
    starvation of high priority tasks, when the system is under
    heavy IO workload.

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

    Sahitya Tummala
     
  • Expand f2fs's casefolding support to include encrypted directories. To
    index casefolded+encrypted directories, we use the SipHash of the
    casefolded name, keyed by a key derived from the directory's fscrypt
    master key. This ensures that the dirhash doesn't leak information
    about the plaintext filenames.

    Encryption keys are unavailable during roll-forward recovery, so we
    can't compute the dirhash when recovering a new dentry in an encrypted +
    casefolded directory. To avoid having to force a checkpoint when a new
    file is fsync'ed, store the dirhash on-disk appended to i_name.

    This patch incorporates work by Eric Biggers
    and Jaegeuk Kim .

    Co-developed-by: Eric Biggers
    Signed-off-by: Eric Biggers
    Signed-off-by: Daniel Rosenberg
    Reviewed-by: Eric Biggers
    Signed-off-by: Jaegeuk Kim

    Daniel Rosenberg
     

09 Jul, 2020

1 commit

  • - don't panic kernel if f2fs_get_node_page() fails in
    f2fs_recover_inline_data() or f2fs_recover_inline_xattr();
    - return error number of f2fs_truncate_blocks() to
    f2fs_recover_inline_data()'s caller;

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

    Chao Yu
     

08 Jul, 2020

1 commit


12 May, 2020

1 commit

  • Rework f2fs's handling of filenames to use a new 'struct f2fs_filename'.
    Similar to 'struct ext4_filename', this stores the usr_fname, disk_name,
    dirhash, crypto_buf, and casefolded name. Some of these names can be
    NULL in some cases. 'struct f2fs_filename' differs from
    'struct fscrypt_name' mainly in that the casefolded name is included.

    For user-initiated directory operations like lookup() and create(),
    initialize the f2fs_filename by translating the corresponding
    fscrypt_name, then computing the dirhash and casefolded name if needed.

    This makes the dirhash and casefolded name be cached for each syscall,
    so we don't have to recompute them repeatedly. (Previously, f2fs
    computed the dirhash once per directory level, and the casefolded name
    once per directory block.) This improves performance.

    This rework also makes it much easier to correctly handle all
    combinations of normal, encrypted, casefolded, and encrypted+casefolded
    directories. (The fourth isn't supported yet but is being worked on.)

    The only other cases where an f2fs_filename gets initialized are for two
    filesystem-internal operations: (1) when converting an inline directory
    to a regular one, we grab the needed disk_name and hash from an existing
    f2fs_dir_entry; and (2) when roll-forward recovering a new dentry, we
    grab the needed disk_name from f2fs_inode::i_name and compute the hash.

    Signed-off-by: Eric Biggers
    Signed-off-by: Jaegeuk Kim

    Eric Biggers
     

20 Mar, 2020

2 commits

  • As Geert Uytterhoeven reported:

    for parameter HZ/50 in congestion_wait(BLK_RW_ASYNC, HZ/50);

    On some platforms, HZ can be less than 50, then unexpected 0 timeout
    jiffies will be set in congestion_wait().

    This patch introduces a macro DEFAULT_IO_TIMEOUT to wrap a determinate
    value with msecs_to_jiffies(20) to instead HZ/50 to avoid such issue.

    Quoted from Geert Uytterhoeven:

    "A timeout of HZ means 1 second.
    HZ/50 means 20 ms, but has the risk of being zero, if HZ < 50.

    If you want to use a timeout of 20 ms, you best use msecs_to_jiffies(20),
    as that takes care of the special cases, and never returns 0."

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

    Chao Yu
     
  • - rename datablock_addr() to data_blkaddr().
    - wrap data_blkaddr() with f2fs_data_blkaddr() to clean up
    parameters.

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

    Chao Yu
     

16 Jan, 2020

1 commit

  • On sudden f2fs shutdown, write pointers of zoned block devices can go
    further but f2fs meta data keeps current segments at positions before the
    write operations. After remounting the f2fs, this inconsistency causes
    write operations not at write pointers and "Unaligned write command"
    error is reported.

    To avoid the error, compare current segments with write pointers of open
    zones the current segments point to, during mount operation. If the write
    pointer position is not aligned with the current segment position, assign
    a new zone to the current segment. Also check the newly assigned zone has
    write pointer at zone start. If not, reset write pointer of the zone.

    Perform the consistency check during fsync recovery. Not to lose the
    fsync data, do the check after fsync data gets restored and before
    checkpoint commit which flushes data at current segment positions. Not to
    cause conflict with kworker's dirfy data/node flush, do the fix within
    SBI_POR_DOING protection.

    Signed-off-by: Shin'ichiro Kawasaki
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Shin'ichiro Kawasaki
     

08 Nov, 2019

1 commit

  • This patch supports 2MB-aligned pinned file, which can guarantee no GC at all
    by allocating fully valid 2MB segment.

    Check free segments by has_not_enough_free_secs() with large budget.

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     

03 Jul, 2019

2 commits

  • f2fs uses EFAULT as error number to indicate filesystem is corrupted
    all the time, but generic filesystems use EUCLEAN for such condition,
    we need to change to follow others.

    This patch adds two new macros as below to wrap more generic error
    code macros, and spread them in code.

    EFSBADCRC EBADMSG /* Bad CRC detected */
    EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */

    Reported-by: Pavel Machek
    Signed-off-by: Chao Yu
    Acked-by: Pavel Machek
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • - Add and use f2fs_ macros
    - Convert f2fs_msg to f2fs_printk
    - Remove level from f2fs_printk and embed the level in the format
    - Coalesce formats and align multi-line arguments
    - Remove unnecessary duplicate extern f2fs_msg f2fs.h

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

    Joe Perches
     

09 May, 2019

3 commits

  • Previously, f2fs_is_valid_blkaddr(, blkaddr, DATA_GENERIC) will check
    whether @blkaddr locates in main area or not.

    That check is weak, since the block address in range of main area can
    point to the address which is not valid in segment info table, and we
    can not detect such condition, we may suffer worse corruption as system
    continues running.

    So this patch introduce DATA_GENERIC_ENHANCE to enhance the sanity check
    which trigger SIT bitmap check rather than only range check.

    This patch did below changes as wel:
    - set SBI_NEED_FSCK in f2fs_is_valid_blkaddr().
    - get rid of is_valid_data_blkaddr() to avoid panic if blkaddr is invalid.
    - introduce verify_fio_blkaddr() to wrap fio {new,old}_blkaddr validation check.
    - spread blkaddr check in:
    * f2fs_get_node_info()
    * __read_out_blkaddrs()
    * f2fs_submit_page_read()
    * ra_data_block()
    * do_recover_data()

    This patch can fix bug reported from bugzilla below:

    https://bugzilla.kernel.org/show_bug.cgi?id=203215
    https://bugzilla.kernel.org/show_bug.cgi?id=203223
    https://bugzilla.kernel.org/show_bug.cgi?id=203231
    https://bugzilla.kernel.org/show_bug.cgi?id=203235
    https://bugzilla.kernel.org/show_bug.cgi?id=203241

    = Update by Jaegeuk Kim =

    DATA_GENERIC_ENHANCE enhanced to validate block addresses on read/write paths.
    But, xfstest/generic/446 compalins some generated kernel messages saying invalid
    bitmap was detected when reading a block. The reaons is, when we get the
    block addresses from extent_cache, there is no lock to synchronize it from
    truncating the blocks in parallel.

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

    Chao Yu
     
  • As Jungyeon reported in bugzilla:

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

    - Overview
    When mounting the attached crafted image, following errors are reported.
    Additionally, it hangs on sync after trying to mount it.

    The image is intentionally fuzzed from a normal f2fs image for testing.
    Compile options for F2FS are as follows.
    CONFIG_F2FS_FS=y
    CONFIG_F2FS_STAT_FS=y
    CONFIG_F2FS_FS_XATTR=y
    CONFIG_F2FS_FS_POSIX_ACL=y
    CONFIG_F2FS_CHECK_FS=y

    - Reproduces
    mkdir test
    mount -t f2fs tmp.img test
    sync

    - Messages
    kernel BUG at fs/f2fs/recovery.c:549!
    RIP: 0010:recover_data+0x167a/0x1780
    Call Trace:
    f2fs_recover_fsync_data+0x613/0x710
    f2fs_fill_super+0x1043/0x1aa0
    mount_bdev+0x16d/0x1a0
    mount_fs+0x4a/0x170
    vfs_kern_mount+0x5d/0x100
    do_mount+0x200/0xcf0
    ksys_mount+0x79/0xc0
    __x64_sys_mount+0x1c/0x20
    do_syscall_64+0x43/0xf0
    entry_SYSCALL_64_after_hwframe+0x44/0xa9

    During recovery, if ofs_of_node is inconsistent in between recovered
    node page and original checkpointed node page, let's just fail recovery
    instead of making kernel panic.

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

    Chao Yu
     
  • There are some places in where we missed to unlock page or unlock page
    incorrectly, fix them.

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

    Chao Yu
     

27 Dec, 2018

1 commit


27 Nov, 2018

1 commit

  • In F2FS_HAS_FEATURE(), we will use F2FS_SB(sb) to get sbi pointer to
    access .raw_super field, to avoid unneeded pointer conversion, this
    patch changes to F2FS_HAS_FEATURE() accept sbi parameter directly.

    Just do cleanup, no logic change.

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

    Chao Yu
     

23 Oct, 2018

4 commits

  • This patch does below changes to keep consistence of project quota data
    in sudden power-cut case:
    - update inode.i_projid and project quota atomically under lock_op() in
    f2fs_ioc_setproject()
    - recover inode.i_projid and project quota in recover_inode()

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

    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: Weichao Guo
    Signed-off-by: Chao Yu
    [Jaegeuk Kim: avoid warnings and set fsck flag]
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • During recover, we will try to create new dentries for inodes with
    dentry_mark. But if the parent is missing (e.g. killed by fsck),
    recover will break. But those recovered dirty pages are not cleanup.
    This will hit f2fs_bug_on:

    [ 53.519566] F2FS-fs (loop0): Found nat_bits in checkpoint
    [ 53.539354] F2FS-fs (loop0): recover_inode: ino = 5, name = file, inline = 3
    [ 53.539402] F2FS-fs (loop0): recover_dentry: ino = 5, name = file, dir = 0, err = -2
    [ 53.545760] F2FS-fs (loop0): Cannot recover all fsync data errno=-2
    [ 53.546105] F2FS-fs (loop0): access invalid blkaddr:4294967295
    [ 53.546171] WARNING: CPU: 1 PID: 1798 at fs/f2fs/checkpoint.c:163 f2fs_is_valid_blkaddr+0x26c/0x320
    [ 53.546174] Modules linked in:
    [ 53.546183] CPU: 1 PID: 1798 Comm: mount Not tainted 4.19.0-rc2+ #1
    [ 53.546186] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
    [ 53.546191] RIP: 0010:f2fs_is_valid_blkaddr+0x26c/0x320
    [ 53.546195] Code: 85 bb 00 00 00 48 89 df 88 44 24 07 e8 ad a8 db ff 48 8b 3b 44 89 e1 48 c7 c2 40 03 72 a9 48 c7 c6 e0 01 72 a9 e8 84 3c ff ff 0b 0f b6 44 24 07 e9 8a 00 00 00 48 8d bf 38 01 00 00 e8 7c a8
    [ 53.546201] RSP: 0018:ffff88006c067768 EFLAGS: 00010282
    [ 53.546208] RAX: 0000000000000000 RBX: ffff880068844200 RCX: ffffffffa83e1a33
    [ 53.546211] RDX: 0000000000000000 RSI: 0000000000000008 RDI: ffff88006d51e590
    [ 53.546215] RBP: 0000000000000005 R08: ffffed000daa3cb3 R09: ffffed000daa3cb3
    [ 53.546218] R10: 0000000000000001 R11: ffffed000daa3cb2 R12: 00000000ffffffff
    [ 53.546221] R13: ffff88006a1f8000 R14: 0000000000000200 R15: 0000000000000009
    [ 53.546226] FS: 00007fb2f3646840(0000) GS:ffff88006d500000(0000) knlGS:0000000000000000
    [ 53.546229] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 53.546234] CR2: 00007f0fd77f0008 CR3: 00000000687e6002 CR4: 00000000000206e0
    [ 53.546237] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 53.546240] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [ 53.546242] Call Trace:
    [ 53.546248] f2fs_submit_page_bio+0x95/0x740
    [ 53.546253] read_node_page+0x161/0x1e0
    [ 53.546271] ? truncate_node+0x650/0x650
    [ 53.546283] ? add_to_page_cache_lru+0x12c/0x170
    [ 53.546288] ? pagecache_get_page+0x262/0x2d0
    [ 53.546292] __get_node_page+0x200/0x660
    [ 53.546302] f2fs_update_inode_page+0x4a/0x160
    [ 53.546306] f2fs_write_inode+0x86/0xb0
    [ 53.546317] __writeback_single_inode+0x49c/0x620
    [ 53.546322] writeback_single_inode+0xe4/0x1e0
    [ 53.546326] sync_inode_metadata+0x93/0xd0
    [ 53.546330] ? sync_inode+0x10/0x10
    [ 53.546342] ? do_raw_spin_unlock+0xed/0x100
    [ 53.546347] f2fs_sync_inode_meta+0xe0/0x130
    [ 53.546351] f2fs_fill_super+0x287d/0x2d10
    [ 53.546367] ? vsnprintf+0x742/0x7a0
    [ 53.546372] ? f2fs_commit_super+0x180/0x180
    [ 53.546379] ? up_write+0x20/0x40
    [ 53.546385] ? set_blocksize+0x5f/0x140
    [ 53.546391] ? f2fs_commit_super+0x180/0x180
    [ 53.546402] mount_bdev+0x181/0x200
    [ 53.546406] mount_fs+0x94/0x180
    [ 53.546411] vfs_kern_mount+0x6c/0x1e0
    [ 53.546415] do_mount+0xe5e/0x1510
    [ 53.546420] ? fs_reclaim_release+0x9/0x30
    [ 53.546424] ? copy_mount_string+0x20/0x20
    [ 53.546428] ? fs_reclaim_acquire+0xd/0x30
    [ 53.546435] ? __might_sleep+0x2c/0xc0
    [ 53.546440] ? ___might_sleep+0x53/0x170
    [ 53.546453] ? __might_fault+0x4c/0x60
    [ 53.546468] ? _copy_from_user+0x95/0xa0
    [ 53.546474] ? memdup_user+0x39/0x60
    [ 53.546478] ksys_mount+0x88/0xb0
    [ 53.546482] __x64_sys_mount+0x5d/0x70
    [ 53.546495] do_syscall_64+0x65/0x130
    [ 53.546503] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 53.547639] ---[ end trace b804d1ea2fec893e ]---

    So if recover fails, we need to drop all recovered data.

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

    Sheng Yong
     
  • Testcase to reproduce this bug:
    1. mkfs.f2fs /dev/sdd
    2. mount -t f2fs /dev/sdd /mnt/f2fs
    3. touch /mnt/f2fs/file
    4. sync
    5. chattr +a /mnt/f2fs/file
    6. xfs_io -a /mnt/f2fs/file -c "fsync"
    7. godown /mnt/f2fs
    8. umount /mnt/f2fs
    9. mount -t f2fs /dev/sdd /mnt/f2fs
    10. xfs_io /mnt/f2fs/file

    There is no error when opening this file w/o O_APPEND, but actually,
    we expect the correct result should be:

    /mnt/f2fs/file: Operation not permitted

    The root cause is, in recover_inode(), we recover inode->i_flags more
    than F2FS_I(inode)->i_flags, so fix it.

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

    Chao Yu
     

29 Sep, 2018

1 commit


27 Sep, 2018

4 commits

  • Mark inode dirty explicitly in the end of recover_inode() to make sure
    that all recoverable fields can be persisted later.

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

    Chao Yu
     
  • inode.i_gc_failures is used to indicate that skip count of migrating
    on blocks of inode, we should guarantee it can be recovered in sudden
    power-off case.

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

    Chao Yu
     
  • Testcase to reproduce this bug:
    1. mkfs.f2fs /dev/sdd
    2. mount -t f2fs /dev/sdd /mnt/f2fs
    3. touch /mnt/f2fs/file
    4. sync
    5. chattr +A /mnt/f2fs/file
    6. xfs_io -f /mnt/f2fs/file -c "fsync"
    7. godown /mnt/f2fs
    8. umount /mnt/f2fs
    9. mount -t f2fs /dev/sdd /mnt/f2fs
    10. lsattr /mnt/f2fs/file

    -----------------N- /mnt/f2fs/file

    But actually, we expect the corrct result is:

    -------A---------N- /mnt/f2fs/file

    The reason is we didn't recover inode.i_flags field during mount,
    fix it.

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

    Chao Yu
     
  • Testcase to reproduce this bug:
    1. mkfs.f2fs -O extra_attr -O project_quota /dev/sdd
    2. mount -t f2fs /dev/sdd /mnt/f2fs
    3. touch /mnt/f2fs/file
    4. sync
    5. chattr -p 1 /mnt/f2fs/file
    6. xfs_io -f /mnt/f2fs/file -c "fsync"
    7. godown /mnt/f2fs
    8. umount /mnt/f2fs
    9. mount -t f2fs /dev/sdd /mnt/f2fs
    10. lsattr -p /mnt/f2fs/file

    0 -----------------N- /mnt/f2fs/file

    But actually, we expect the correct result is:

    1 -----------------N- /mnt/f2fs/file

    The reason is we didn't recover inode.i_projid field during mount,
    fix it.

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

    Chao Yu
     

21 Sep, 2018

1 commit

  • Step to reproduce this bug:
    1. logon as root
    2. mount -t f2fs /dev/sdd /mnt;
    3. touch /mnt/file;
    4. chown system /mnt/file; chgrp system /mnt/file;
    5. xfs_io -f /mnt/file -c "fsync";
    6. godown /mnt;
    7. umount /mnt;
    8. mount -t f2fs /dev/sdd /mnt;

    After step 8) we will expect file's uid/gid are all system, but during
    recovery, these two fields were not been recovered, fix it.

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

    Chao Yu
     

13 Sep, 2018

1 commit


12 Sep, 2018

1 commit

  • generic/417 reported as blow:

    ------------[ cut here ]------------
    kernel BUG at /home/yuchao/git/devf2fs/inode.c:695!
    invalid opcode: 0000 [#1] PREEMPT SMP
    CPU: 1 PID: 21697 Comm: umount Tainted: G W O 4.18.0-rc2+ #39
    Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
    EIP: f2fs_evict_inode+0x556/0x580 [f2fs]
    Call Trace:
    ? _raw_spin_unlock+0x2c/0x50
    evict+0xa8/0x170
    dispose_list+0x34/0x40
    evict_inodes+0x118/0x120
    generic_shutdown_super+0x41/0x100
    ? rcu_read_lock_sched_held+0x97/0xa0
    kill_block_super+0x22/0x50
    kill_f2fs_super+0x6f/0x80 [f2fs]
    deactivate_locked_super+0x3d/0x70
    deactivate_super+0x40/0x60
    cleanup_mnt+0x39/0x70
    __cleanup_mnt+0x10/0x20
    task_work_run+0x81/0xa0
    exit_to_usermode_loop+0x59/0xa7
    do_fast_syscall_32+0x1f5/0x22c
    entry_SYSENTER_32+0x53/0x86
    EIP: f2fs_evict_inode+0x556/0x580 [f2fs]

    It can simply reproduced with scripts:

    Enable quota feature during mkfs.

    Testcase1:
    1. mkfs.f2fs /dev/zram0
    2. mount -t f2fs /dev/zram0 /mnt/f2fs
    3. xfs_io -f /mnt/f2fs/file -c "pwrite 0 4k" -c "fsync"
    4. godown /mnt/f2fs
    5. umount /mnt/f2fs
    6. mount -t f2fs -o ro /dev/zram0 /mnt/f2fs
    7. umount /mnt/f2fs

    Testcase2:
    1. mkfs.f2fs /dev/zram0
    2. mount -t f2fs /dev/zram0 /mnt/f2fs
    3. touch /mnt/f2fs/file
    4. create process[pid = x] do:
    a) open /mnt/f2fs/file;
    b) unlink /mnt/f2fs/file
    5. godown -f /mnt/f2fs
    6. kill process[pid = x]
    7. umount /mnt/f2fs
    8. mount -t f2fs -o ro /dev/zram0 /mnt/f2fs
    9. umount /mnt/f2fs

    The reason is: during recovery, i_{c,m}time of inode will be updated, then
    the inode can be set dirty w/o being tracked in sbi->inode_list[DIRTY_META]
    global list, so later write_checkpoint will not flush such dirty inode into
    node page.

    Once umount is called, sync_filesystem() in generic_shutdown_super() will
    skip syncng dirty inodes due to sb_rdonly check, leaving dirty inodes
    there.

    To solve this issue, during umount, add remove SB_RDONLY flag in
    sb->s_flags, to make sure sync_filesystem() will not be skipped.

    Signed-off-by: Chao Yu

    Signed-off-by: Jaegeuk Kim

    Chao Yu
     

15 Aug, 2018

1 commit

  • When CONFIG_F2FS_FAULT_INJECTION is disabled, we get a warning about an
    unused label:

    fs/f2fs/segment.c: In function '__submit_discard_cmd':
    fs/f2fs/segment.c:1059:1: error: label 'submit' defined but not used [-Werror=unused-label]

    This could be fixed by adding another #ifdef around it, but the more
    reliable way of doing this seems to be to remove the other #ifdefs
    where that is easily possible.

    By defining time_to_inject() as a trivial stub, most of the checks for
    CONFIG_F2FS_FAULT_INJECTION can go away. This also leads to nicer
    formatting of the code.

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

    Arnd Bergmann
     

02 Aug, 2018

3 commits

  • This patch fix wrong message info for recover fsync data
    on readonly fs.

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

    Yunlei He
     
  • If caller of __get_meta_page() can handle error, let's propagate error
    from __get_meta_page().

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

    Chao Yu
     
  • Below dmesg was printed when testing generic/388 of fstest:

    F2FS-fs (zram1): find_fsync_dnodes: detect looped node chain, blkaddr:526615, next:526616
    F2FS-fs (zram1): Cannot recover all fsync data errno=-22
    F2FS-fs (zram1): Mounted with checkpoint version = 22300d0e
    F2FS-fs (zram1): find_fsync_dnodes: detect looped node chain, blkaddr:526615, next:526616
    F2FS-fs (zram1): Cannot recover all fsync data errno=-22

    The reason is that we initialize free_blocks with free blocks of
    filesystem, so if filesystem is full, free_blocks can be zero,
    below condition will be true, so that, it will fail recovery.

    if (++loop_cnt >= free_blocks ||
    blkaddr == next_blkaddr_of_node(page))

    To fix this issue, initialize free_blocks with correct value which
    includes over-privision blocks.

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

    Chao Yu
     

27 Jul, 2018

1 commit

  • This patch introduces verify_blkaddr to check meta/data block address
    with valid range to detect bug earlier.

    In addition, once we encounter an invalid blkaddr, notice user to run
    fsck to fix, and let the kernel panic.

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

    Chao Yu
     

01 Jun, 2018

3 commits

  • As Ted reported:

    "Hi, I was looking at f2fs's sources recently, and I noticed that there
    is a very large number of non-static symbols which don't have a f2fs
    prefix. There's well over a hundred (see attached below).

    As one example, in fs/f2fs/dir.c there is:

    unsigned char get_de_type(struct f2fs_dir_entry *de)

    This function is clearly only useful for f2fs, but it has a generic
    name. This means that if any other file system tries to have the same
    symbol name, there will be a symbol conflict and the kernel would not
    successfully build. It also means that when someone is looking f2fs
    sources, it's not at all obvious whether a function such as
    read_data_page(), invalidate_blocks(), is a generic kernel function
    found in the fs, mm, or block layers, or a f2fs specific function.

    You might want to fix this at some point. Hopefully Kent's bcachefs
    isn't similarly using genericly named functions, since that might
    cause conflicts with f2fs's functions --- but just as this would be a
    problem that we would rightly insist that Kent fix, this is something
    that we should have rightly insisted that f2fs should have fixed
    before it was integrated into the mainline kernel.

    acquire_orphan_inode
    add_ino_entry
    add_orphan_inode
    allocate_data_block
    allocate_new_segments
    alloc_nid
    alloc_nid_done
    alloc_nid_failed
    available_free_memory
    ...."

    This patch adds "f2fs_" prefix for all non-static symbols in order to:
    a) avoid conflict with other kernel generic symbols;
    b) to indicate the function is f2fs specific one instead of generic
    one;

    Reported-by: Theodore Ts'o
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • - rename is_valid_blkaddr() to is_valid_meta_blkaddr() for readability.
    - introduce is_valid_blkaddr() for cleanup.

    No logic change in this patch.

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

    Chao Yu
     
  • Only dir may have F2FS_INLINE_DOTS flag, so there is no need to check
    the flag in recover flow.

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

    Sheng Yong
     

13 Mar, 2018

2 commits

  • There is no checksum in node block now, so bit-transition from hardware
    can make node_footer.next_blkaddr being corrupted w/o any detection,
    result in node chain becoming looped one.

    For this condition, during recovery, in order to avoid running into dead
    loop, let's detect it and just skip out.

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

    Chao Yu
     
  • Previous dentry page uses highmem, which will cause panic in platforms
    using highmem (such as arm), since the address space of dentry pages
    from highmem directly goes into the decryption path via the function
    fscrypt_fname_disk_to_usr. But sg_init_one assumes the address is not
    from highmem, and then cause panic since it doesn't call kmap_high but
    kunmap_high is triggered at the end. To fix this problem in a simple
    way, this patch avoids to put dentry page in pagecache into highmem.

    Signed-off-by: Yunlong Song
    Reviewed-by: Chao Yu
    [Jaegeuk Kim: fix coding style]
    Signed-off-by: Jaegeuk Kim

    Yunlong Song
     

23 Jan, 2018

1 commit


03 Jan, 2018

1 commit

  • Commit d260081ccf37 ("f2fs: change recovery policy of xattr node block")
    removes the use of blkaddr, which is no longer used. So remove the
    parameter.

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

    Sheng Yong