01 Oct, 2016

5 commits

  • This patch improves the migration of dirty pages and allows migrating atomic
    written pages that F2FS uses in Page Cache. Instead of the fallback releasing
    page path, it provides better performance for memory compaction, CMA and other
    users of memory page migrating. For dirty pages, there is no need to write back
    first when migrating. For an atomic written page before committing, we can
    migrate the page and update the related 'inmem_pages' list at the same time.

    Signed-off-by: Weichao Guo
    Reviewed-by: Chao Yu
    [Jaegeuk Kim: fix some coding style]
    Signed-off-by: Jaegeuk Kim

    Weichao Guo
     
  • This patch introduces spinlock to protect updating process of ckpt_flags
    field in struct f2fs_checkpoint, it avoids incorrectly updating in race
    condition.

    Signed-off-by: Chao Yu
    [Jaegeuk Kim: add __is_set_ckpt_flags likewise __set_ckpt_flags]
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • Making updating of sbi flag atomic by using {test,set,clear}_bit,
    otherwise in concurrency scenario, the flag could be updated incorrectly.

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

    Chao Yu
     
  • Before checkpoint, we'd be better drop any inodes.

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • Previously, we used cp_version only to detect recoverable dnodes.
    In order to avoid same garbage cp_version, we needed to truncate the next
    dnode during checkpoint, resulting in additional discard or data write.
    If we can distinguish this by using crc in addition to cp_version, we can
    remove this overhead.

    There is backward compatibility concern where it changes node_footer layout.
    So, this patch introduces a new checkpoint flag, CP_CRC_RECOVERY_FLAG, to
    detect new layout. New layout will be activated only when this flag is set.

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     

23 Sep, 2016

5 commits


16 Sep, 2016

1 commit


15 Sep, 2016

2 commits

  • The macro f2fs_check_acl is defined but never used since
    the initial commit, this patch removes the code that has
    been dead for several years.

    Signed-off-by: Tiezhu Yang
    Signed-off-by: Jaegeuk Kim

    Tiezhu Yang
     
  • When src and dst is the same file, and the latter part of source region
    overlaps with the former part of destination region, current implement
    will overwrite data which hasn't been moved yet and truncate data in
    overlapped region.
    This patch return -EINVAL when such cases occur and return 0 when
    source region and destination region is actually the same part of
    the same file.

    Signed-off-by: Fan li
    Signed-off-by: Jaegeuk Kim

    Fan Li
     

14 Sep, 2016

4 commits

  • Previously, f2fs_write_begin sets PageUptodate all the time. But, when user
    tries to update the entire page (i.e., len == PAGE_SIZE), we need to consider
    that the page is able to be copied partially afterwards. In such the case,
    we will lose the remaing region in the page.

    This patch fixes this by setting PageUptodate in f2fs_write_end as given copied
    result. In the short copy case, it returns zero to let generic_perform_write
    retry copying user data again.

    As a result, f2fs_write_end() works:
    PageUptodate len copied return retry
    1. no 4096 4096 4096 false -> return 4096
    2. no 4096 1024 0 true -> goto #1 case
    3. yes 2048 2048 2048 false -> return 2048
    4. yes 2048 1024 1024 false -> return 1024

    Suggested-by: Al Viro
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • __exchange_data_block should take block indexes as parameters
    instead of offsets in bytes.

    Signed-off-by: Fan li
    Signed-off-by: Jaegeuk Kim

    Fan Li
     
  • This patch includes below modifications:
    1. change my maintainership from reviewer to maintainer.
    2. remove maintainership of Changman Lee since he is not active about
    one and a half year.
    3. change website of f2fs from wiki to kernel one.

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

    Chao Yu
     
  • This patch gives another chances during roll-forward recovery regarding to
    -ENOMEM.

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     

13 Sep, 2016

4 commits


08 Sep, 2016

13 commits

  • We don't need to make zeros beyond i_size, since we already wrote that through
    NEW_ADDR case.

    Reported-by: Al Viro
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • Some applications may create multimeida file with temporary name like
    '*.jpg.tmp' or '*.mp4.tmp', then rename to '*.jpg' or '*.mp4'.

    Now, f2fs can only detect multimedia filename with specified format:
    "filename + '.' + extension", so it will make f2fs missing to detect
    multimedia file with special temporary name, result in failing to set
    cold flag on file.

    This patch enhances detection flow for enabling lookup extension in the
    middle of temporary filename.

    Reported-by: Xue Liu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • Correct typo from 'destory' to 'destroy'.

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

    Chao Yu
     
  • This fixes pointer panic when using inline_dentry, which was triggered when
    backporting to 3.10.

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • tests/generic/251 of fstest suit complains us with below message:

    ------------[ cut here ]------------
    invalid opcode: 0000 [#1] PREEMPT SMP
    CPU: 2 PID: 7698 Comm: fstrim Tainted: G O 4.7.0+ #21
    task: e9f4e000 task.stack: e7262000
    EIP: 0060:[] EFLAGS: 00010202 CPU: 2
    EIP is at write_checkpoint+0xfde/0x1020 [f2fs]
    EAX: f33eb300 EBX: eecac310 ECX: 00000001 EDX: ffff0001
    ESI: eecac000 EDI: eecac5f0 EBP: e7263dec ESP: e7263d18
    DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
    CR0: 80050033 CR2: b76ab01c CR3: 2eb89de0 CR4: 000406f0
    Stack:
    00000001 a220fb7b e9f4e000 00000002 419ff2d3 b3a05151 00000002 e9f4e5d8
    e9f4e000 419ff2d3 b3a05151 eecac310 c10b8154 b3a05151 419ff2d3 c10b78bd
    e9f4e000 e9f4e000 e9f4e5d8 00000001 e9f4e000 ec409000 eecac2cc eecac288
    Call Trace:
    [] ? __lock_acquire+0x3c4/0x760
    [] ? mark_held_locks+0x5d/0x80
    [] f2fs_trim_fs+0x1c2/0x2e0 [f2fs]
    [] f2fs_ioctl+0x6b6/0x10b0 [f2fs]
    [] ? __this_cpu_preempt_check+0xf/0x20
    [] ? trace_hardirqs_off_caller+0x91/0x120
    [] ? __exchange_data_block+0xd30/0xd30 [f2fs]
    [] do_vfs_ioctl+0x81/0x7f0
    [] ? kmem_cache_free+0x245/0x2e0
    [] ? get_unused_fd_flags+0x40/0x40
    [] ? putname+0x4c/0x50
    [] ? do_sys_open+0x16e/0x1d0
    [] ? do_fast_syscall_32+0x30/0x1c0
    [] ? __this_cpu_preempt_check+0xf/0x20
    [] SyS_ioctl+0x58/0x80
    [] do_fast_syscall_32+0xa1/0x1c0
    [] sysenter_past_esp+0x45/0x74
    EIP: [] write_checkpoint+0xfde/0x1020 [f2fs] SS:ESP 0068:e7263d18
    ---[ end trace 4de95d7e6b3aa7c6 ]---

    The reason is: with below call stack, we will encounter BUG_ON during
    doing fstrim.

    Thread A Thread B
    - write_checkpoint
    - do_checkpoint
    - f2fs_write_inode
    - update_inode_page
    - update_inode
    - set_page_dirty
    - f2fs_set_node_page_dirty
    - inc_page_count
    - percpu_counter_inc
    - set_sbi_flag(SBI_IS_DIRTY)
    - clear_sbi_flag(SBI_IS_DIRTY)

    Thread C Thread D
    - f2fs_write_node_page
    - set_node_addr
    - __set_nat_cache_dirty
    - nm_i->dirty_nat_cnt++
    - do_vfs_ioctl
    - f2fs_ioctl
    - f2fs_trim_fs
    - write_checkpoint
    - f2fs_bug_on(nm_i->dirty_nat_cnt)

    Fix it by setting superblock dirty correctly in do_checkpoint and
    f2fs_write_node_page.

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

    Chao Yu
     
  • Add roll-forward recovery process for encrypted dentry, so the first fsync
    issued to an encrypted file does not need writing checkpoint.

    This improves the performance of the following test at thousands of small
    files: open -> write -> fsync -> close

    Signed-off-by: Shuoran Liu
    Acked-by: Chao Yu
    [Jaegeuk Kim: modify kernel message to show encrypted names]
    Signed-off-by: Jaegeuk Kim

    Shuoran Liu
     
  • This patch enhances the xattr consistency of dirs from suddern power-cuts.

    Possible scenario would be:
    1. dir->setxattr used by per-file encryption
    2. file->setxattr goes into inline_xattr
    3. file->fsync

    In that case, we should do checkpoint for #1.
    Otherwise we'd lose dir's key information for the file given #2.

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • Like most filesystems, f2fs will issue discard command synchronously, so
    when user trigger fstrim through ioctl, multiple discard commands will be
    issued serially with sync mode, which makes poor performance.

    In this patch we try to support async discard, so that all discard
    commands can be issued and be waited for endio in batch to improve
    performance.

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

    Chao Yu
     
  • This patch sets encryption name flag in the add inline entry path
    if filename is encrypted.

    Signed-off-by: Shuoran Liu
    Signed-off-by: Jaegeuk Kim

    Shuoran Liu
     
  • When decrypting dirents in ->readdir, fscrypt_fname_disk_to_usr won't
    change content of original encrypted dirent, we don't need to allocate
    additional buffer for storing mirror of it, so get rid of it.

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

    Chao Yu
     
  • When creating new inode, security_inode_init_security will be called for
    initializing security info related to the inode, and filename is passed to
    security module, it helps security module such as SElinux to know which
    rule or label could be applied for the inode with specified name.

    Previously, if new inode is created as an encrypted one, f2fs will transfer
    encrypted filename to security module which may fail the check of security
    policy belong to the inode. So in order to this issue, alter to transfer
    original unencrypted filename instead.

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

    Chao Yu
     
  • In order to enhance performance, we try to readahead node page during
    GC, but before loading node page we should get block address of node page
    which is stored in NAT table, so synchronously read of single NAT page
    block our readahead flow.

    f2fs_submit_page_bio: dev = (251,0), ino = 2, page_index = 0xa1e, oldaddr = 0xa1e, newaddr = 0xa1e, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x35e9, oldaddr = 0x72d7a, newaddr = 0x72d7a, rw = READAHEAD ^H, type = NODE
    f2fs_submit_page_bio: dev = (251,0), ino = 2, page_index = 0xc1f, oldaddr = 0xc1f, newaddr = 0xc1f, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x389d, oldaddr = 0x72d7d, newaddr = 0x72d7d, rw = READAHEAD ^H, type = NODE
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x3a82, oldaddr = 0x72d7f, newaddr = 0x72d7f, rw = READAHEAD ^H, type = NODE
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x3bfa, oldaddr = 0x72d86, newaddr = 0x72d86, rw = READAHEAD ^H, type = NODE

    This patch adds one phase that do readahead NAT pages in batch before
    readahead node page for more effeciently.

    f2fs_submit_page_bio: dev = (251,0), ino = 2, page_index = 0x1952, oldaddr = 0x1952, newaddr = 0x1952, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc34, oldaddr = 0xc34, newaddr = 0xc34, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xa33, oldaddr = 0xa33, newaddr = 0xa33, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc30, oldaddr = 0xc30, newaddr = 0xc30, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc32, oldaddr = 0xc32, newaddr = 0xc32, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc26, oldaddr = 0xc26, newaddr = 0xc26, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xa2b, oldaddr = 0xa2b, newaddr = 0xa2b, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc23, oldaddr = 0xc23, newaddr = 0xc23, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc24, oldaddr = 0xc24, newaddr = 0xc24, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xa10, oldaddr = 0xa10, newaddr = 0xa10, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc2c, oldaddr = 0xc2c, newaddr = 0xc2c, rw = READ_SYNC(MP), type = META
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5db7, oldaddr = 0x6be00, newaddr = 0x6be00, rw = READAHEAD ^H, type = NODE
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5db9, oldaddr = 0x6be17, newaddr = 0x6be17, rw = READAHEAD ^H, type = NODE
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5dbc, oldaddr = 0x6be1a, newaddr = 0x6be1a, rw = READAHEAD ^H, type = NODE
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5dc3, oldaddr = 0x6be20, newaddr = 0x6be20, rw = READAHEAD ^H, type = NODE
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5dc7, oldaddr = 0x6be24, newaddr = 0x6be24, rw = READAHEAD ^H, type = NODE
    f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5dc9, oldaddr = 0x6be25, newaddr = 0x6be25, rw = READAHEAD ^H, type = NODE

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

    Chao Yu
     
  • In batch discard approach of fstrim will grab/release gc_mutex lock
    repeatly, it makes contention of the lock becoming more intensive.

    So after one batch discards were issued in checkpoint and the lock
    was released, it's better to do schedule() to increase opportunity
    of grabbing gc_mutex lock for other competitors.

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

    Chao Yu
     

30 Aug, 2016

6 commits