1. 28 5月, 2013 9 次提交
    • J
      f2fs: update inode page after creation · 44a83ff6
      Jaegeuk Kim 提交于
      I found a bug when testing power-off-recovery as follows.
      
      [Bug Scenario]
      1. create a file
      2. fsync the file
      3. reboot w/o any sync
      4. try to recover the file
       - found its fsync mark
       - found its dentry mark
         : try to recover its dentry
          - get its file name
          - get its parent inode number
           : here we got zero value
      
      The reason why we get the wrong parent inode number is that we didn't
      synchronize the inode page with its newly created inode information perfectly.
      
      Especially, previous f2fs stores fi->i_pino and writes it to the cached
      node page in a wrong order, which incurs the zero-valued i_pino during the
      recovery.
      
      So, this patch modifies the creation flow to fix the synchronization order of
      inode page with its inode.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      44a83ff6
    • J
      f2fs: change get_new_data_page to pass a locked node page · 64aa7ed9
      Jaegeuk Kim 提交于
      This patch is for passing a locked node page to get_dnode_of_data.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      64aa7ed9
    • J
      f2fs: skip get_node_page if locked node page is passed · 1646cfac
      Jaegeuk Kim 提交于
      If get_dnode_of_data gets a locked node page, let's skip redundant
      get_node_page calls.
      This is for the futher enhancement.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      1646cfac
    • J
      f2fs: remove unnecessary por_doing check · 0a364af1
      Jaegeuk Kim 提交于
      This por_doing check is totally not related to the recovery process.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      0a364af1
    • J
      f2fs: fix BUG_ON during f2fs_evict_inode(dir) · 74d0b917
      Jaegeuk Kim 提交于
      During the dentry recovery routine, recover_inode() triggers __f2fs_add_link
      with its directory inode.
      
      In the following scenario, a bug is captured.
       1. dir = f2fs_iget(pino)
       2. __f2fs_add_link(dir, name)
       3. iput(dir)
        -> f2fs_evict_inode() faces with BUG_ON(atomic_read(fi->dirty_dents))
      
      Kernel BUG at ffffffffa01c0676 [verbose debug info unavailable]
      [<ffffffffa01c0676>] f2fs_evict_inode+0x276/0x300 [f2fs]
      Call Trace:
       [<ffffffff8118ea00>] evict+0xb0/0x1b0
       [<ffffffff8118f1c5>] iput+0x105/0x190
       [<ffffffffa01d2dac>] recover_fsync_data+0x3bc/0x1070 [f2fs]
       [<ffffffff81692e8a>] ? io_schedule+0xaa/0xd0
       [<ffffffff81690acb>] ? __wait_on_bit_lock+0x7b/0xc0
       [<ffffffff8111a0e7>] ? __lock_page+0x67/0x70
       [<ffffffff81165e21>] ? kmem_cache_alloc+0x31/0x140
       [<ffffffff8118a502>] ? __d_instantiate+0x92/0xf0
       [<ffffffff812a949b>] ? security_d_instantiate+0x1b/0x30
       [<ffffffff8118a5b4>] ? d_instantiate+0x54/0x70
      
      This means that we should flush all the dentry pages between iget and iput().
      But, during the recovery routine, it is unallowed due to consistency, so we
      have to wait the whole recovery process.
      And then, write_checkpoint flushes all the dirty dentry blocks, and nicely we
      can put the stale dir inodes from the dirty_dir_inode_list.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      74d0b917
    • J
      f2fs: fix por_doing variable coverage · 8c26d7d5
      Jaegeuk Kim 提交于
      The reason of using sbi->por_doing is to alleviate data writes during the
      recovery.
      The find_fsync_dnodes() produces some dirty dentry pages, so we should
      cover it too with sbi->por_doing.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      8c26d7d5
    • J
      f2fs: remove redundant assignment · addbe45b
      Jaegeuk Kim 提交于
      We don't need to assign a value redundantly.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      addbe45b
    • J
      f2fs: fix the inconsistent state of data pages · 650495de
      Jaegeuk Kim 提交于
      In get_lock_data_page, if there is a data race between get_dnode_of_data for
      node and grab_cache_page for data, f2fs is able to face with the following
      BUG_ON(dn.data_blkaddr == NEW_ADDR).
      
      kernel BUG at /home/zeus/f2fs_test/src/fs/f2fs/data.c:251!
       [<ffffffffa044966c>] get_lock_data_page+0x1ec/0x210 [f2fs]
      Call Trace:
       [<ffffffffa043b089>] f2fs_readdir+0x89/0x210 [f2fs]
       [<ffffffff811a0920>] ? fillonedir+0x100/0x100
       [<ffffffff811a0920>] ? fillonedir+0x100/0x100
       [<ffffffff811a07f8>] vfs_readdir+0xb8/0xe0
       [<ffffffff811a0b4f>] sys_getdents+0x8f/0x110
       [<ffffffff816d7999>] system_call_fastpath+0x16/0x1b
      
      This bug is able to be occurred when the block address of the data block is
      changed after f2fs_put_dnode().
      In order to avoid that, this patch fixes the lock order of node and data
      blocks in which the node block lock is covered by the data block lock.
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      650495de
    • J
      f2fs: fix inconsistency of block count during recovery · 65e5cd0a
      Jaegeuk Kim 提交于
      Currently f2fs recovers the dentry of fsynced files.
      When power-off-recovery is conducted, this newly recovered inode should increase
      node block count as well as inode block count.
      
      This patch resolves this inconsistency that results in:
      
      1. create a file
      2. write data
      3. fsync
      4. reboot without sync
      5. mount and recover the file
      6. node block count is 1 and inode block count is 2
       : fall into the inconsistent state
      7. unlink the file
       : trigger the following BUG_ON
      
      ------------[ cut here ]------------
      kernel BUG at /home/zeus/f2fs_test/src/fs/f2fs/f2fs.h:716!
      Call Trace:
       [<ffffffffa0344100>] ? get_node_page+0x50/0x1a0 [f2fs]
       [<ffffffffa0344bfc>] remove_inode_page+0x8c/0x100 [f2fs]
       [<ffffffffa03380f0>] ? f2fs_evict_inode+0x180/0x2d0 [f2fs]
       [<ffffffffa033812e>] f2fs_evict_inode+0x1be/0x2d0 [f2fs]
       [<ffffffff811c7a67>] evict+0xa7/0x1a0
       [<ffffffff811c82b5>] iput+0x105/0x190
       [<ffffffff811c2b30>] d_kill+0xe0/0x120
       [<ffffffff811c2c57>] dput+0xe7/0x1e0
       [<ffffffff811acc3d>] __fput+0x19d/0x2d0
       [<ffffffff811acd7e>] ____fput+0xe/0x10
       [<ffffffff81070645>] task_work_run+0xb5/0xe0
       [<ffffffff81002941>] do_notify_resume+0x71/0xb0
       [<ffffffff8175f14a>] int_signal+0x12/0x17
      Reported-and-Tested-by: NChris Fries <C.Fries@motorola.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
      65e5cd0a
  2. 25 5月, 2013 14 次提交
  3. 24 5月, 2013 5 次提交
    • S
      GFS2: Fix typo in gfs2_log_end_write loop · e97e548b
      Steven Whitehouse 提交于
      There was a missing _all in this loop iterator
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      e97e548b
    • R
      GFS2: fix DLM depends to fix build errors · 75f96ce6
      Randy Dunlap 提交于
      Fix build errors by correcting DLM dependencies in GFS2.
      Build errors happen when CONFIG_GFS2_FS_LOCKING_DLM=y and CONFIG_DLM=m:
      
      fs/built-in.o: In function `gfs2_lock':
      file.c:(.text+0xc7abd): undefined reference to `dlm_posix_get'
      file.c:(.text+0xc7ad0): undefined reference to `dlm_posix_unlock'
      file.c:(.text+0xc7ad9): undefined reference to `dlm_posix_lock'
      fs/built-in.o: In function `gdlm_unmount':
      lock_dlm.c:(.text+0xd6e5b): undefined reference to `dlm_release_lockspace'
      fs/built-in.o: In function `sync_unlock':
      lock_dlm.c:(.text+0xd6e9e): undefined reference to `dlm_unlock'
      fs/built-in.o: In function `sync_lock':
      lock_dlm.c:(.text+0xd6fb6): undefined reference to `dlm_lock'
      fs/built-in.o: In function `gdlm_put_lock':
      lock_dlm.c:(.text+0xd7238): undefined reference to `dlm_unlock'
      fs/built-in.o: In function `gdlm_mount':
      lock_dlm.c:(.text+0xd753e): undefined reference to `dlm_new_lockspace'
      lock_dlm.c:(.text+0xd79d3): undefined reference to `dlm_release_lockspace'
      fs/built-in.o: In function `gdlm_lock':
      lock_dlm.c:(.text+0xd8179): undefined reference to `dlm_lock'
      fs/built-in.o: In function `gdlm_cancel':
      lock_dlm.c:(.text+0xd6b22): undefined reference to `dlm_unlock'
      Signed-off-by: NRandy Dunlap <rdunlap@infradead.org>
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      75f96ce6
    • B
      GFS2: Use single-block reservations for directories · af21ca8e
      Bob Peterson 提交于
      This patch changes the multi-block allocation code, such that
      directory inodes only get a single block reserved in the bitmap.
      That way, the bitmaps are more tightly packed together, and there
      are fewer spans of free blocks for in-use block reservations.
      This means it takes less time to find a free span of blocks in the
      bitmap, which speeds things up. This increases the performance of
      some workloads by almost 2X. In Nate's mockup.py script (which does
      (1) create dir, (2) create dir in dir, (3) create file in that dir)
      the test executes in 23 steps rather than 43 steps, a 47%
      performance improvement.
      Signed-off-by: NBob Peterson <rpeterso@redhat.com>
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      af21ca8e
    • B
      GFS2: two minor quota fixups · 37f71577
      Bob Peterson 提交于
      This patch fixes two regression problems that Abhi found in the
      GFS2 quota code.
      Signed-off-by: NBob Peterson <rpeterso@redhat.com>
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      37f71577
    • C
      NFS: Fix SETCLIENTID fallback if GSS is not available · 83c168bf
      Chuck Lever 提交于
      Commit 79d852bf "NFS: Retry SETCLIENTID with AUTH_SYS instead of
      AUTH_NONE" did not take into account commit 23631227 "NFSv4: Fix the
      fallback to AUTH_NULL if krb5i is not available".
      Signed-off-by: NChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      83c168bf
  4. 21 5月, 2013 1 次提交
    • A
      NFSv4.1 Fix a pNFS session draining deadlock · 774d5f14
      Andy Adamson 提交于
      On a CB_RECALL the callback service thread flushes the inode using
      filemap_flush prior to scheduling the state manager thread to return the
      delegation. When pNFS is used and I/O has not yet gone to the data server
      servicing the inode, a LAYOUTGET can preceed the I/O. Unlike the async
      filemap_flush call, the LAYOUTGET must proceed to completion.
      
      If the state manager starts to recover data while the inode flush is sending
      the LAYOUTGET, a deadlock occurs as the callback service thread holds the
      single callback session slot until the flushing is done which blocks the state
      manager thread, and the state manager thread has set the session draining bit
      which puts the inode flush LAYOUTGET RPC to sleep on the forechannel slot
      table waitq.
      
      Separate the draining of the back channel from the draining of the fore channel
      by moving the NFS4_SESSION_DRAINING bit from session scope into the fore
      and back slot tables.  Drain the back channel first allowing the LAYOUTGET
      call to proceed (and fail) so the callback service thread frees the callback
      slot. Then proceed with draining the forechannel.
      Signed-off-by: NAndy Adamson <andros@netapp.com>
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      774d5f14
  5. 18 5月, 2013 11 次提交