12 Sep, 2017

1 commit

  • 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
     

06 Sep, 2017

1 commit


10 Aug, 2017

1 commit

  • This patch enables inner app/fs io stats and introduces below virtual fs
    nodes for exposing stats info:
    /sys/fs/f2fs//iostat_enable
    /proc/fs/f2fs//iostat_info

    Signed-off-by: Chao Yu
    [Jaegeuk Kim: fix wrong stat assignment]
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     

01 Aug, 2017

1 commit

  • This patch tries to make below macros calculating max inline size,
    inline dentry field size considerring reserving size-changeable
    space:
    - MAX_INLINE_DATA
    - NR_INLINE_DENTRY
    - INLINE_DENTRY_BITMAP_SIZE
    - INLINE_RESERVED_SIZE

    Then, when inline_{data,dentry} options is enabled, it allows us to
    reserve inline space with different size flexibly for adding newly
    introduced inode attribute.

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

    Chao Yu
     

27 Jul, 2017

1 commit

  • Use f2fs_dentry_ptr structure to indicate inline dentry structure as
    much as possible, so we can wrap inline dentry with size-fixed fields
    to the one with size-changeable fields. With this change, we can
    handle size-changeable inline dentry more easily.

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

    Chao Yu
     

04 Jul, 2017

1 commit

  • It is better to use variable name "inline_dentry" instead of "dentry_blk"
    when data type is "struct f2fs_inline_dentry". This patch has no functional
    changes, just to make code more readable especially when call the function
    make_dentry_ptr_inline() and f2fs_convert_inline_dir().

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

    Tiezhu Yang
     

09 May, 2017

1 commit

  • Pull f2fs updates from Jaegeuk Kim:
    "In this round, we've focused on enhancing performance with regards to
    block allocation, GC, and discard/in-place-update IO controls. There
    are a bunch of clean-ups as well as minor bug fixes.

    Enhancements:
    - disable heap-based allocation by default
    - issue small-sized discard commands by default
    - change the policy of data hotness for logging
    - distinguish IOs in terms of size and wbc type
    - start SSR earlier to avoid foreground GC
    - enhance data structures managing discard commands
    - enhance in-place update flow
    - add some more fault injection routines
    - secure one more xattr entry

    Bug fixes:
    - calculate victim cost for GC correctly
    - remain correct victim segment number for GC
    - race condition in nid allocator and initializer
    - stale pointer produced by atomic_writes
    - fix missing REQ_SYNC for flush commands
    - handle missing errors in more corner cases"

    * tag 'for-f2fs-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (111 commits)
    f2fs: fix a mount fail for wrong next_scan_nid
    f2fs: enhance scalability of trace macro
    f2fs: relocate inode_{,un}lock in F2FS_IOC_SETFLAGS
    f2fs: Make flush bios explicitely sync
    f2fs: show available_nids in f2fs/status
    f2fs: flush dirty nats periodically
    f2fs: introduce CP_TRIMMED_FLAG to avoid unneeded discard
    f2fs: allow cpc->reason to indicate more than one reason
    f2fs: release cp and dnode lock before IPU
    f2fs: shrink size of struct discard_cmd
    f2fs: don't hold cmd_lock during waiting discard command
    f2fs: nullify fio->encrypted_page for each writes
    f2fs: sanity check segment count
    f2fs: introduce valid_ipu_blkaddr to clean up
    f2fs: lookup extent cache first under IPU scenario
    f2fs: reconstruct code to write a data page
    f2fs: introduce __wait_discard_cmd
    f2fs: introduce __issue_discard_cmd
    f2fs: enable small discard by default
    f2fs: delay awaking discard thread
    ...

    Linus Torvalds
     

04 May, 2017

1 commit

  • If user has no key under an encrypted dir, fscrypt gives digested dentries.
    Previously, when looking up a dentry, f2fs only checks its hash value with
    first 4 bytes of the digested dentry, which didn't handle hash collisions fully.
    This patch enhances to check entire dentry bytes likewise ext4.

    Eric reported how to reproduce this issue by:

    # seq -f "edir/abcdefghijklmnopqrstuvwxyz012345%.0f" 100000 | xargs touch
    # find edir -type f | xargs stat -c %i | sort | uniq | wc -l
    100000
    # sync
    # echo 3 > /proc/sys/vm/drop_caches
    # keyctl new_session
    # find edir -type f | xargs stat -c %i | sort | uniq | wc -l
    99999

    Cc:
    Reported-by: Eric Biggers
    Signed-off-by: Jaegeuk Kim
    (fixed f2fs_dentry_hash() to work even when the hash is 0)
    Signed-off-by: Eric Biggers
    Signed-off-by: Theodore Ts'o

    Jaegeuk Kim
     

06 Apr, 2017

2 commits


22 Mar, 2017

2 commits

  • As discuss with Jaegeuk and Chao,
    "Once checkpoint is done, f2fs doesn't need to update there-in filename at all."

    The disk-level filename is used only one case,
    1. create a file A under a dir
    2. sync A
    3. godown
    4. umount
    5. mount (roll_forward)

    Only the rename/cross_rename changes the filename, if it happens,
    a. between step 1 and 2, the sync A will caused checkpoint, so that,
    the roll_forward at step 5 never happens.
    b. after step 2, the roll_forward happens, file A will roll forward
    to the result as after step 1.

    So that, any updating the disk filename is useless, just cleanup it.

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

    Kinglong Mee
     
  • Clear FI_DATA_EXIST flag atomically in truncate_inline_inode, and
    the return value from truncate_inline_inode isn't used, remove it.

    Signed-off-by: Kinglong Mee
    Signed-off-by: Jaegeuk Kim

    Kinglong Mee
     

15 Dec, 2016

1 commit

  • Pull f2fs updates from Jaegeuk Kim:
    "This patch series contains several performance tuning patches
    regarding to the IO submission flow, in addition to supporting new
    features such as a ZBC-base drive and multiple devices.

    It also includes some major bug fixes such as:
    - checkpoint version control
    - fdatasync-related roll-forward recovery routine
    - memory boundary or null-pointer access in corner cases
    - missing error cases

    It has various minor clean-up patches as well"

    * tag 'for-f2fs-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (66 commits)
    f2fs: fix a missing size change in f2fs_setattr
    f2fs: fix to access nullified flush_cmd_control pointer
    f2fs: free meta pages if sanity check for ckpt is failed
    f2fs: detect wrong layout
    f2fs: call sync_fs when f2fs is idle
    Revert "f2fs: use percpu_counter for # of dirty pages in inode"
    f2fs: return AOP_WRITEPAGE_ACTIVATE for writepage
    f2fs: do not activate auto_recovery for fallocated i_size
    f2fs: fix to determine start_cp_addr by sbi->cur_cp_pack
    f2fs: fix 32-bit build
    f2fs: set ->owner for debugfs status file's file_operations
    f2fs: fix incorrect free inode count in ->statfs
    f2fs: drop duplicate header timer.h
    f2fs: fix wrong AUTO_RECOVER condition
    f2fs: do not recover i_size if it's valid
    f2fs: fix fdatasync
    f2fs: fix to account total free nid correctly
    f2fs: fix an infinite loop when flush nodes in cp
    f2fs: don't wait writeback for datas during checkpoint
    f2fs: fix wrong written_valid_blocks counting
    ...

    Linus Torvalds
     

24 Nov, 2016

4 commits

  • Report error of f2fs_fill_dentries to ->iterate_shared, otherwise when
    error ocurrs, user may just list part of dirents in target directory
    without any hints.

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

    Chao Yu
     
  • This is to avoid no free segment bug during checkpoint caused by a number of
    dirty inodes.

    The case was reported by Chao like this.
    1. mount with lazytime option
    2. fill 4k file until disk is full
    3. sync filesystem
    4. read all files in the image
    5. umount

    In this case, we actually don't need to flush dirty inode to inode page during
    checkpoint.

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

    Jaegeuk Kim
     
  • f2fs contained a number of endianness conversion bugs.

    Also, one function should have been 'static'.

    Found with sparse by running 'make C=2 CF=-D__CHECK_ENDIAN__ fs/f2fs/'

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

    Eric Biggers
     
  • If there is no dirty pages in inode, we should give a chance to detach
    the inode from global dirty list, otherwise it needs to call another
    unnecessary .writepages for detaching.

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

    Chao Yu
     

01 Nov, 2016

1 commit


11 Oct, 2016

1 commit

  • Pull more vfs updates from Al Viro:
    ">rename2() work from Miklos + current_time() from Deepa"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    fs: Replace current_fs_time() with current_time()
    fs: Replace CURRENT_TIME_SEC with current_time() for inode timestamps
    fs: Replace CURRENT_TIME with current_time() for inode timestamps
    fs: proc: Delete inode time initializations in proc_alloc_inode()
    vfs: Add current_time() api
    vfs: add note about i_op->rename changes to porting
    fs: rename "rename2" i_op to "rename"
    vfs: remove unused i_op->rename
    fs: make remaining filesystems use .rename2
    libfs: support RENAME_NOREPLACE in simple_rename()
    fs: support RENAME_NOREPLACE for local filesystems
    ncpfs: fix unused variable warning

    Linus Torvalds
     

01 Oct, 2016

1 commit

  • Previously, we only support global fault injection configuration, so that
    when we configure type/rate of fault injection through sysfs, mount
    option, it will influence all f2fs partition which is being used.

    It is not make sence, since it will be not convenient if developer want
    to test separated partitions with different fault injection rate/type
    simultaneously, also it's not possible to enable fault injection in one
    partition and disable fault injection in other one.

    >From now on, we move global configuration of fault injection in module
    into per-superblock, hence injection testing can be more flexible.

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

    Chao Yu
     

28 Sep, 2016

1 commit

  • CURRENT_TIME macro is not appropriate for filesystems as it
    doesn't use the right granularity for filesystem timestamps.
    Use current_time() instead.

    CURRENT_TIME is also not y2038 safe.

    This is also in preparation for the patch that transitions
    vfs timestamps to use 64 bit time and hence make them
    y2038 safe. As part of the effort current_time() will be
    extended to do range checks. Hence, it is necessary for all
    file system timestamps to use current_time(). Also,
    current_time() will be transitioned along with vfs to be
    y2038 safe.

    Note that whenever a single call to current_time() is used
    to change timestamps in different inodes, it is because they
    share the same time granularity.

    Signed-off-by: Deepa Dinamani
    Reviewed-by: Arnd Bergmann
    Acked-by: Felipe Balbi
    Acked-by: Steven Whitehouse
    Acked-by: Ryusuke Konishi
    Acked-by: David Sterba
    Signed-off-by: Al Viro

    Deepa Dinamani
     

08 Sep, 2016

3 commits


28 Jul, 2016

1 commit

  • Pull f2fs updates from Jaegeuk Kim:
    "The major change in this version is mitigating cpu overheads on write
    paths by replacing redundant inode page updates with mark_inode_dirty
    calls. And we tried to reduce lock contentions as well to improve
    filesystem scalability. Other feature is setting F2FS automatically
    when detecting host-managed SMR.

    Enhancements:
    - ioctl to move a range of data between files
    - inject orphan inode errors
    - avoid flush commands congestion
    - support lazytime

    Bug fixes:
    - return proper results for some dentry operations
    - fix deadlock in add_link failure
    - disable extent_cache for fcollapse/finsert"

    * tag 'for-f2fs-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (68 commits)
    f2fs: clean up coding style and redundancy
    f2fs: get victim segment again after new cp
    f2fs: handle error case with f2fs_bug_on
    f2fs: avoid data race when deciding checkpoin in f2fs_sync_file
    f2fs: support an ioctl to move a range of data blocks
    f2fs: fix to report error number of f2fs_find_entry
    f2fs: avoid memory allocation failure due to a long length
    f2fs: reset default idle interval value
    f2fs: use blk_plug in all the possible paths
    f2fs: fix to avoid data update racing between GC and DIO
    f2fs: add maximum prefree segments
    f2fs: disable extent_cache for fcollapse/finsert inodes
    f2fs: refactor __exchange_data_block for speed up
    f2fs: fix ERR_PTR returned by bio
    f2fs: avoid mark_inode_dirty
    f2fs: move i_size_write in f2fs_write_end
    f2fs: fix to avoid redundant discard during fstrim
    f2fs: avoid mismatching block range for discard
    f2fs: fix incorrect f_bfree calculation in ->statfs
    f2fs: use percpu_rw_semaphore
    ...

    Linus Torvalds
     

09 Jul, 2016

2 commits


16 Jun, 2016

1 commit

  • If dotdot directory is corrupted, its slot may be ocupied by another
    file. In this case, dentry[1] is not the parent directory. Rename and
    cross-rename will update the inode in dentry[1] incorrectly. This
    patch finds dotdot dentry by name.

    Signed-off-by: Sheng Yong
    [Jaegeuk Kim: remove wron bug_on]
    Signed-off-by: Jaegeuk Kim

    Sheng Yong
     

08 Jun, 2016

2 commits


03 Jun, 2016

5 commits


17 May, 2016

2 commits

  • Fix two bugs in error path of f2fs_move_rehashed_dirents:
    - release dir's inode page if fail to call kmalloc
    - recover i_current_depth if fail to converting

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

    Chao Yu
     
  • With below steps, we will see that dentry page becoming unaccessable later.
    This is because we forget updating i_current_depth in inode during inline
    dentry conversion, after that, once we failed at somewhere, it will leave
    i_current_depth as 0 in non-inline directory. Then, during ->lookup, the
    current_depth value makes all dentry pages in first level invisible. Fix
    it.

    1) mount f2fs with inline_dentry option
    2) mkdir dir
    3) touch 180 files named [0-179] in dir
    4) touch 180 in dir (fail after inline dir conversion)
    5) ll dir

    ls: cannot access /mnt/f2fs/dir/0: No such file or directory
    ls: cannot access /mnt/f2fs/dir/1: No such file or directory
    ls: cannot access /mnt/f2fs/dir/2: No such file or directory
    ls: cannot access /mnt/f2fs/dir/3: No such file or directory
    ls: cannot access /mnt/f2fs/dir/4: No such file or directory

    drwxr-xr-x 2 root root 4096 may 13 21:47 ./
    drwxr-xr-x 3 root root 4096 may 13 21:46 ../
    -????????? ? ? ? ? ? 0
    -????????? ? ? ? ? ? 1
    -????????? ? ? ? ? ? 10
    -????????? ? ? ? ? ? 100
    -????????? ? ? ? ? ? 101
    -????????? ? ? ? ? ? 102

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

    Chao Yu
     

08 May, 2016

2 commits


28 Apr, 2016

1 commit

  • The filename length in dirent of may become zero-sized after random junk
    data injection, once encounter such dirent, find_target_dentry or
    f2fs_add_inline_entries will run into an infinite loop. So let f2fs being
    aware of that to avoid deadloop.

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

    Chao Yu