04 Feb, 2009

1 commit


05 Dec, 2008

1 commit

  • Hit this assert because an inode was tagged with XFS_ICI_RECLAIM_TAG but
    not XFS_IRECLAIMABLE|XFS_IRECLAIM. This is because xfs_iget_cache_hit()
    first clears XFS_IRECLAIMABLE and then calls __xfs_inode_clear_reclaim_tag()
    while only holding the pag_ici_lock in read mode so we can race with
    xfs_reclaim_inodes_ag(). Looks like xfs_reclaim_inodes_ag() will do the
    right thing anyway so just remove the assert.

    Thanks to Christoph for pointing out where the problem was.

    Signed-off-by: Lachlan McIlroy
    Reviewed-by: Christoph Hellwig

    Lachlan McIlroy
     

04 Dec, 2008

1 commit


10 Nov, 2008

1 commit

  • The radix tree walks in xfs_sync_inodes_ag and xfs_qm_dqrele_all_inodes()
    can find inodes that are still undergoing initialisation. Avoid
    them by checking for the the XFS_INEW() flag once we have a reference
    on the inode. This flag is cleared once the inode is properly initialised.

    SGI-PV: 987246

    Signed-off-by: Dave Chinner
    Signed-off-by: Lachlan McIlroy

    Dave Chinner
     

30 Oct, 2008

21 commits

  • If we are syncing data in xfs_sync_inodes_ag(), the VFS inode must still
    be referencable as the dirty data state is carried on the VFS inode. hence
    if we can't get a reference via igrab(), the inode must be in reclaim
    which implies that it has no dirty data attached.

    Leave such inodes to the reclaim code to flush the dirty inode state to
    disk and so avoid attempting to access the VFS inode when it may not exist
    in xfs_sync_inodes_ag().

    Version 4:
    o don't reference linux inode until after igrab() succeeds

    Version 3:
    o converted unlock/rele to an xfs_iput() call.

    Version 2:
    o change igrab logic to be more linear
    o remove initial reclaimable inode check now that we are using
    igrab() failure to find reclaimable inodes
    o assert that igrab failure occurs only on reclaimable inodes
    o clean up inode locking - only grab the iolock if we are doing
    a SYNC_DELWRI call and we have a dirty inode.

    SGI-PV: 987246

    SGI-Modid: xfs-linux-melb:xfs-kern:32391a

    Signed-off-by: David Chinner
    Signed-off-by: Christoph Hellwig
    Signed-off-by: Peter Leckie
    Signed-off-by: Lachlan McIlroy

    David Chinner
     
  • If the last block of the AG has inodes in it and the AG is an exactly
    power-of-2 size then the last inode in the AG points to the last block in
    the AG. If we try to find the next inode in the AG by adding one to the
    inode number, we increment the inode number past the size of the AG. The
    result is that the macro XFS_INO_TO_AGINO() will strip the AG portion of
    the inode number and return an inode number of zero.

    That is, instead of terminating the lookup loop because we hit the inode
    number went outside the valid range for the AG, the search index returns
    to zero and we start traversing the radix tree from the start again. This
    results in an endless loop in xfs_sync_inodes_ag().

    Fix it be detecting if the new search index decreases as a result of
    incrementing the current inode number. That indicate an overflow and hence
    that we have finished processing the AG so we can terminate the loop.

    SGI-PV: 988142

    SGI-Modid: xfs-linux-melb:xfs-kern:32335a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Now that the deleted inodes list is unused, kill it. This also removes the
    i_reclaim list head from the xfs_inode, shrinking it by two pointers.

    SGI-PV: 988142

    SGI-Modid: xfs-linux-melb:xfs-kern:32334a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Use the reclaim tag to walk the radix tree and find the inodes under
    reclaim. This was the only user of the deleted inode list.

    SGI-PV: 988142

    SGI-Modid: xfs-linux-melb:xfs-kern:32333a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Prepare for removing the deleted inode list by marking inodes for reclaim
    in the inode radix trees so that we can use the radix trees to find
    reclaimable inodes.

    SGI-PV: 988142

    SGI-Modid: xfs-linux-melb:xfs-kern:32331a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • The function names xfs_finish_reclaim and xfs_finish_reclaim_all are not
    very descriptive of what they are reclaiming. Rename to
    xfs_reclaim_inode[s] to match the xfs_sync_inodes() function.

    SGI-PV: 988142

    SGI-Modid: xfs-linux-melb:xfs-kern:32330a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Background inode reclaim is run by the xfssyncd. Move the reclaim worker
    functions to be close to the sync code as the are very similar in
    structure and are both run from the same background thread.

    SGI-PV: 988142

    SGI-Modid: xfs-linux-melb:xfs-kern:32329a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • With all the other filesystem sync code it in xfs_sync.c including the
    data quiesce code, it makes sense to move the remaining quiesce code to
    the same place.

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32312a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • There are no more callers to xfs_sync() now, so remove the function
    altogther.

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32311a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • SYNC_CLOSE is only ever used and checked in conjunction with SYNC_WAIT,
    and this only done in one spot. The only thing this does is make
    XFS_bflush() calls to the data buftargs.

    This will happen very shortly afterwards the xfs_sync() call anyway in the
    unmount path via the xfs_close_devices(), so this code is redundant and
    can be removed. That only user of SYNC_CLOSE is now gone, so kill the flag
    completely.

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32310a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Continue to de-multiplex xfs_sync be replacing all SYNC_DELWRI callers
    with direct calls functions that do the work. Isolate the data quiesce
    case to a function in xfs_sync.c. Isolate the FSDATA case with explicit
    calls to xfs_sync_fsdata().

    Version 2: o Push delwri related log forces into xfs_sync_inodes().

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32309a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Continue to de-multiplex xfs_sync be replacing all SYNC_ATTR callers with
    direct calls xfs_sync_inodes(). Add an assert into xfs_sync() to ensure we
    caught all the SYNC_ATTR callers.

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32308a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Start de-multiplexing xfs_sync() by making xfs_sync_worker() call the
    specific sync functions it needs. This is only a small, unique subset of
    the entire xfs_sync() code so is easier to follow.

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32307a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Now that the only caller is xfs_sync(), merge the two together as it makes
    no sense to keep them separate.

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32306a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Kill the unused arg in xfs_syncsub() and xfs_sync_inodes(). For callers of
    xfs_syncsub() that only want to flush inodes, replace xfs_syncsub() with
    direct calls to xfs_sync_inodes() as that is all that is being done with
    the specific flags being passed in.

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32305a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • With the sync code relocated to the linux-2.6 directory we can use struct
    inodes directly. If we do the same thing for the quota release code, we
    can remove vn_grab altogether. While here, convert the VN_BAD() checks to
    is_bad_inode() so we can remove vnodes entirely from this code.

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32304a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Split out two helpers from xfs_syncsub for the dummy log commit and the
    superblock writeout.

    SGI-PV: 988140

    SGI-Modid: xfs-linux-melb:xfs-kern:32303a

    Signed-off-by: Christoph Hellwig
    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy

    Christoph Hellwig
     
  • Update xfs_sync_inodes to walk the inode radix tree cache to find dirty
    inodes. This removes a huge bunch of nasty, messy code for traversing the
    mount inode list safely and removes another user of the mount inode list.

    Version 3 o rediff against new linux-2.6/xfs_sync.c code

    Version 2 o add comment explaining use of gang lookups for a single inode
    o use IRELE, not VN_RELE o move check for ag initialisation to caller.

    SGI-PV: 988139

    SGI-Modid: xfs-linux-melb:xfs-kern:32290a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • xfs_iflush_all() walks the m_inodes list to find inodes that need
    reclaiming. We already have such a list - the m_del_inodes list. Replace
    xfs_iflush_all() with a call to xfs_finish_reclaim_all() and clean up
    xfs_finish_reclaim_all() to handle the different flush modes now needed.

    Originally based on a patch from Christoph Hellwig.

    Version 3 o rediff against new linux-2.6/xfs_sync.c code

    Version 2 o revert xfs_syncsub() inode reclaim behaviour back to original

    code o xfs_quiesce_fs() should use XFS_IFLUSH_DELWRI_ELSE_ASYNC, not

    XFS_IFLUSH_ASYNC, to prevent change of behaviour.

    SGI-PV: 988139

    SGI-Modid: xfs-linux-melb:xfs-kern:32284a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • Move all the xfssyncd code to the new xfs_sync.c file. This places it
    closer to the actual code that it interacts with, rather than just being
    associated with high level VFS code.

    SGI-PV: 988139

    SGI-Modid: xfs-linux-melb:xfs-kern:32283a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner
     
  • The sync code in XFS is spread around several files. While it used to make
    sense to have such a distribution, the code is about to be cleaned up and
    so centralising it in one spot as the first step makes sense.

    SGI-PV: 988139

    SGI-Modid: xfs-linux-melb:xfs-kern:32282a

    Signed-off-by: David Chinner
    Signed-off-by: Lachlan McIlroy
    Signed-off-by: Christoph Hellwig

    David Chinner