1. 08 5月, 2013 1 次提交
    • J
      f2fs: avoid deadlock during evict after f2fs_gc · 531ad7d5
      Jaegeuk Kim 提交于
      o Deadlock case #1
      
      Thread 1:
      - writeback_sb_inodes
       - do_writepages
        - f2fs_write_data_pages
         - write_cache_pages
          - f2fs_write_data_page
           - f2fs_balance_fs
            - wait mutex_lock(gc_mutex)
      
      Thread 2:
      - f2fs_balance_fs
       - mutex_lock(gc_mutex)
       - f2fs_gc
        - f2fs_iget
         - wait iget_locked(inode->i_lock)
      
      Thread 3:
      - do_unlinkat
       - iput
        - lock(inode->i_lock)
         - evict
          - inode_wait_for_writeback
      
      o Deadlock case #2
      
      Thread 1:
      - __writeback_single_inode
       : set I_SYNC
        - do_writepages
         - f2fs_write_data_page
          - f2fs_balance_fs
           - f2fs_gc
            - iput
             - evict
              - inode_wait_for_writeback(I_SYNC)
      
      In order to avoid this, even though iput is called with the zero-reference
      count, we need to stop the eviction procedure if the inode is on writeback.
      So this patch links f2fs_drop_inode which checks the I_SYNC flag.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      531ad7d5
  2. 30 4月, 2013 1 次提交
  3. 23 4月, 2013 1 次提交
  4. 22 4月, 2013 1 次提交
  5. 09 4月, 2013 1 次提交
    • J
      f2fs: introduce a new global lock scheme · 39936837
      Jaegeuk Kim 提交于
      In the previous version, f2fs uses global locks according to the usage types,
      such as directory operations, block allocation, block write, and so on.
      
      Reference the following lock types in f2fs.h.
      enum lock_type {
      	RENAME,		/* for renaming operations */
      	DENTRY_OPS,	/* for directory operations */
      	DATA_WRITE,	/* for data write */
      	DATA_NEW,	/* for data allocation */
      	DATA_TRUNC,	/* for data truncate */
      	NODE_NEW,	/* for node allocation */
      	NODE_TRUNC,	/* for node truncate */
      	NODE_WRITE,	/* for node write */
      	NR_LOCK_TYPE,
      };
      
      In that case, we lose the performance under the multi-threading environment,
      since every types of operations must be conducted one at a time.
      
      In order to address the problem, let's share the locks globally with a mutex
      array regardless of any types.
      So, let users grab a mutex and perform their jobs in parallel as much as
      possbile.
      
      For this, I propose a new global lock scheme as follows.
      
      0. Data structure
       - f2fs_sb_info -> mutex_lock[NR_GLOBAL_LOCKS]
       - f2fs_sb_info -> node_write
      
      1. mutex_lock_op(sbi)
       - try to get an avaiable lock from the array.
       - returns the index of the gottern lock variable.
      
      2. mutex_unlock_op(sbi, index of the lock)
       - unlock the given index of the lock.
      
      3. mutex_lock_all(sbi)
       - grab all the locks in the array before the checkpoint.
      
      4. mutex_unlock_all(sbi)
       - release all the locks in the array after checkpoint.
      
      5. block_operations()
       - call mutex_lock_all()
       - sync_dirty_dir_inodes()
       - grab node_write
       - sync_node_pages()
      
      Note that,
       the pairs of mutex_lock_op()/mutex_unlock_op() and
       mutex_lock_all()/mutex_unlock_all() should be used together.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      39936837
  6. 03 4月, 2013 2 次提交
    • J
      f2fs: avoid race for summary information · b7473754
      Jaegeuk Kim 提交于
      In order to do GC more reliably, I'd like to lock the vicitm summary page
      until its GC is completed, and also prevent any checkpoint process.
      Reviewed-by: NNamjae Jeon <namjae.jeon@samsung.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      b7473754
    • J
      f2fs: change GC bitmaps to apply the section granularity · 5ec4e49f
      Jaegeuk Kim 提交于
      This patch removes a bitmap for victim segments selected by foreground GC, and
      modifies the other bitmap for victim segments selected by background GC.
      
      1) foreground GC bitmap
       : We don't need to manage this, since we just only one previous victim section
         number instead of the whole victim history.
         The f2fs uses the victim section number in order not to allocate currently
         GC'ed section to current active logs.
      
      2) background GC bitmap
       : This bitmap is used to avoid selecting victims repeatedly by background GCs.
         In addition, the victims are able to be selected by foreground GCs, since
         there is no need to read victim blocks during foreground GCs.
      
         By the fact that the foreground GC reclaims segments in a section unit, it'd
         be better to manage this bitmap based on the section granularity.
      Reviewed-by: NNamjae Jeon <namjae.jeon@samsung.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      5ec4e49f
  7. 27 3月, 2013 1 次提交
  8. 20 3月, 2013 3 次提交
  9. 18 3月, 2013 1 次提交
  10. 12 2月, 2013 6 次提交
  11. 22 1月, 2013 1 次提交
  12. 15 1月, 2013 1 次提交
  13. 14 1月, 2013 1 次提交
  14. 11 1月, 2013 1 次提交
    • J
      f2fs: add f2fs_balance_fs in several interfaces · 7d82db83
      Jaegeuk Kim 提交于
      The f2fs_balance_fs() is to check the number of free sections and decide whether
      it needs to conduct cleaning or not. If there are not enough free sections, the
      cleaning job should be started.
      
      In order to control an amount of free sections even under high utilization, f2fs
      should call f2fs_balance_fs at all the VFS interfaces that are able to produce
      dirty pages.
      This patch adds the function calls in the missing interfaces as follows.
      
      1. f2fs_setxattr()
      The f2fs_setxattr() produces dirty node pages so that we should call
      f2fs_balance_fs() either likewise doing in other VFS interfaces such as
      f2fs_lookup(), f2fs_mkdir(), and so on.
      
      2. f2fs_sync_file()
      We should guarantee serving free sections for syncing metadata during fsync.
      Previously, there is no space check before triggering checkpoint and
      sync_node_pages.
      Therefore, if a bunch of fsync calls are triggered under 100% of FS utilization,
      f2fs is able to be faced with no free sections, resulting in BUG_ON().
      
      3. f2fs_sync_fs()
      Before calling write_checkpoint(), we should guarantee that there are minimum
      free sections.
      
      4. f2fs_write_inode()
      f2fs_write_inode() is also able to produce dirty node pages.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      7d82db83
  15. 04 1月, 2013 1 次提交
  16. 28 12月, 2012 2 次提交
  17. 26 12月, 2012 2 次提交
    • J
      f2fs: should recover orphan and fsync data · 30f0c758
      Jaegeuk Kim 提交于
      The recovery routine should do all the time regardless of normal umount action.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      30f0c758
    • J
      f2fs: fix wrong calculation on f_files in statfs · 1362b5e3
      Jaegeuk Kim 提交于
      In f2fs_statfs(), f_files should be the total number of available inodes
      instead of the currently allocated inodes.
      So, this patch should resolve the reported bug below.
      
      Note that, showing 10% usage is not a bug, since f2fs reveals whole volume size
      as much as possible and shows the space overhead as *used*.
      This policy is fair enough with respect to other file systems.
      
      <Reported Bug>
      (loop0 is backed by 1GiB file)
      
      $ mkfs.f2fs /dev/loop0
      
      F2FS-tools: Ver: 1.1.0 (2012-12-11)
      Info: sector size = 512
      Info: total sectors = 2097152 (in 512bytes)
      Info: zone aligned segment0 blkaddr: 512
      Info: format successful
      
      $ mount /dev/loop0 mnt/
      
      $ df mnt/
      Filesystem     1K-blocks  Used Available Use% Mounted on
      /dev/loop0       1046528 98312    929784  10%
      /home/zeta/linux-devel/mtd-bench/mnt
      
      $ df mnt/ -i
      Filesystem     Inodes   IUsed  IFree IUse% Mounted on
      /dev/loop0       1 -465918 465919     - /home/zeta/linux-devel/mtd-bench/mnt
      
      Notice IUsed is negative. Also, 10% usage on a fresh f2fs seems too
      much to be correct.
      Reported-and-Tested-by: NEzequiel Garcia <elezegarcia@gmail.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      1362b5e3
  18. 11 12月, 2012 5 次提交