1. 12 12月, 2009 1 次提交
    • A
      xfs: Wrapped journal record corruption on read at recovery · fc5bc4c8
      Andy Poling 提交于
      Summary of problem:
      
      If a journal record wraps at the physical end of the journal, it has to be
      read in two parts in xlog_do_recovery_pass(): a read at the physical end and a
      read at the physical beginning.  If xlog_bread() has to re-align the first
      read, the second read request does not take that re-alignment into account.
      If the first read was re-aligned, the second read over-writes the end of the
      data from the first read, effectively corrupting it.  This can happen either
      when reading the record header or reading the record data.
      
      The first sanity check in xlog_recover_process_data() is to check for a valid
      clientid, so that is the error reported.
      
      Summary of fix:
      
      If there was a first read at the physical end, XFS_BUF_PTR() returns where the
      data was requested to begin.  Conversely, because it is the result of
      xlog_align(), offset indicates where the requested data for the first read
      actually begins - whether or not xlog_bread() has re-aligned it.
      
      Using offset as the base for the calculation of where to place the second read
      data ensures that it will be correctly placed immediately following the data
      from the first read instead of sometimes over-writing the end of it.
      
      The attached patch has resolved the reported problem of occasional inability
      to recover the journal (reporting "bad clientid").
      Signed-off-by: NAndy Poling <andy@realbig.com>
      Reviewed-by: NAlex Elder <aelder@sgi.com>
      Signed-off-by: NAlex Elder <aelder@sgi.com>
      fc5bc4c8
  2. 18 11月, 2009 1 次提交
  3. 01 9月, 2009 1 次提交
  4. 02 7月, 2009 1 次提交
  5. 08 6月, 2009 1 次提交
  6. 16 3月, 2009 3 次提交
  7. 07 3月, 2009 1 次提交
  8. 04 3月, 2009 1 次提交
  9. 09 2月, 2009 1 次提交
  10. 04 2月, 2009 2 次提交
  11. 11 12月, 2008 1 次提交
  12. 01 12月, 2008 9 次提交
  13. 10 11月, 2008 1 次提交
  14. 30 10月, 2008 8 次提交
    • D
      [XFS] XFS: Check for valid transaction headers in recovery · 5a792c45
      David Chinner 提交于
      When we are about to add a new item to a transaction in recovery, we need
      to check that it is valid first. Currently we just assert that header
      magic number matches, but in production systems that is not present and we
      add a corrupted transaction to the list to be processed. This results in a
      kernel oops later when processing the corrupted transaction.
      
      Instead, if we detect a corrupted transaction, abort recovery and leave
      the user to clean up the mess that has occurred.
      
      SGI-PV: 988145
      
      SGI-Modid: xfs-linux-melb:xfs-kern:32356a
      Signed-off-by: NDavid Chinner <david@fromorbit.com>
      Signed-off-by: NTim Shimmin <tes@sgi.com>
      Signed-off-by: NEric Sandeen <sandeen@sandeen.net>
      Signed-off-by: NLachlan McIlroy <lachlan@sgi.com>
      5a792c45
    • D
      [XFS] Finish removing the mount pointer from the AIL API · 783a2f65
      David Chinner 提交于
      Change all the remaining AIL API functions that are passed struct
      xfs_mount pointers to pass pointers directly to the struct xfs_ail being
      used. With this conversion, all external access to the AIL is via the
      struct xfs_ail. Hence the operation and referencing of the AIL is almost
      entirely independent of the xfs_mount that is using it - it is now much
      more tightly tied to the log and the items it is tracking in the log than
      it is tied to the xfs_mount.
      
      SGI-PV: 988143
      
      SGI-Modid: xfs-linux-melb:xfs-kern:32353a
      Signed-off-by: NDavid Chinner <david@fromorbit.com>
      Signed-off-by: NLachlan McIlroy <lachlan@sgi.com>
      Signed-off-by: NChristoph Hellwig <hch@infradead.org>
      783a2f65
    • D
      [XFS] Given the log a pointer to the AIL · a9c21c1b
      David Chinner 提交于
      When we need to go from the log to the AIL, we have to go via the
      xfs_mount. Add a xfs_ail pointer to the log so we can go directly to the
      AIL associated with the log.
      
      SGI-PV: 988143
      
      SGI-Modid: xfs-linux-melb:xfs-kern:32351a
      Signed-off-by: NDavid Chinner <david@fromorbit.com>
      Signed-off-by: NLachlan McIlroy <lachlan@sgi.com>
      Signed-off-by: NChristoph Hellwig <hch@infradead.org>
      a9c21c1b
    • D
      [XFS] Move the AIL lock into the struct xfs_ail · c7e8f268
      David Chinner 提交于
      Bring the ail lock inside the struct xfs_ail. This means the AIL can be
      entirely manipulated via the struct xfs_ail rather than needing both the
      struct xfs_mount and the struct xfs_ail.
      
      SGI-PV: 988143
      
      SGI-Modid: xfs-linux-melb:xfs-kern:32350a
      Signed-off-by: NDavid Chinner <david@fromorbit.com>
      Signed-off-by: NLachlan McIlroy <lachlan@sgi.com>
      Signed-off-by: NChristoph Hellwig <hch@infradead.org>
      c7e8f268
    • D
      [XFS] move the AIl traversal over to a consistent interface · 5b00f14f
      David Chinner 提交于
      With the new cursor interface, it makes sense to make all the traversing
      code use the cursor interface and make the old one go away. This means
      more of the AIL interfacing is done by passing struct xfs_ail pointers
      around the place instead of struct xfs_mount pointers.
      
      We can replace the use of xfs_trans_first_ail() in xfs_log_need_covered()
      as it is only checking if the AIL is empty. We can do that with a call to
      xfs_trans_ail_tail() instead, where a zero LSN returned indicates and
      empty AIL...
      
      SGI-PV: 988143
      
      SGI-Modid: xfs-linux-melb:xfs-kern:32348a
      Signed-off-by: NDavid Chinner <david@fromorbit.com>
      Signed-off-by: NLachlan McIlroy <lachlan@sgi.com>
      Signed-off-by: NChristoph Hellwig <hch@infradead.org>
      5b00f14f
    • D
      [XFS] Use a cursor for AIL traversal. · 27d8d5fe
      David Chinner 提交于
      To replace the current generation number ensuring sanity of the AIL
      traversal, replace it with an external cursor that is linked to the AIL.
      
      Basically, we store the next item in the cursor whenever we want to drop
      the AIL lock to do something to the current item. When we regain the lock.
      the current item may already be free, so we can't reference it, but the
      next item in the traversal is already held in the cursor.
      
      When we move or delete an object, we search all the active cursors and if
      there is an item match we clear the cursor(s) that point to the object.
      This forces the traversal to restart transparently.
      
      We don't invalidate the cursor on insert because the cursor still points
      to a valid item. If the intem is inserted between the current item and the
      cursor it does not matter; the traversal is considered to be past the
      insertion point so it will be picked up in the next traversal.
      
      Hence traversal restarts pretty much disappear altogether with this method
      of traversal, which should substantially reduce the overhead of pushing on
      a busy AIL.
      
      Version 2 o add restart logic o comment cursor interface o minor cleanups
      
      SGI-PV: 988143
      
      SGI-Modid: xfs-linux-melb:xfs-kern:32347a
      Signed-off-by: NDavid Chinner <david@fromorbit.com>
      Signed-off-by: NLachlan McIlroy <lachlan@sgi.com>
      Signed-off-by: NChristoph Hellwig <hch@infradead.org>
      27d8d5fe
    • C
      [XFS] Always use struct xfs_btree_block instead of short / longform · 7cc95a82
      Christoph Hellwig 提交于
      structures.
      
      Always use the generic xfs_btree_block type instead of the short / long
      structures. Add XFS_BTREE_SBLOCK_LEN / XFS_BTREE_LBLOCK_LEN defines for
      the length of a short / long form block. The rationale for this is that we
      will grow more btree block header variants to support CRCs and other RAS
      information, and always accessing them through the same datatype with
      unions for the short / long form pointers makes implementing this much
      easier.
      
      SGI-PV: 988146
      
      SGI-Modid: xfs-linux-melb:xfs-kern:32300a
      Signed-off-by: NChristoph Hellwig <hch@infradead.org>
      Signed-off-by: NDonald Douwsma <donaldd@sgi.com>
      Signed-off-by: NDavid Chinner <david@fromorbit.com>
      Signed-off-by: NLachlan McIlroy <lachlan@sgi.com>
      7cc95a82
    • C
      [XFS] Cleanup maxrecs calculation. · 60197e8d
      Christoph Hellwig 提交于
      Clean up the way the maximum and minimum records for the btree blocks are
      calculated. For the alloc and inobt btrees all the values are
      pre-calculated in xfs_mount_common, and we switch the current loop around
      the ugly generic macros that use cpp token pasting to generate type names
      to two small helpers in normal C code. For the bmbt and bmdr trees these
      helpers also exist, but can be called during runtime, too. Here we also
      kill various macros dealing with them and inline the logic into the
      get_minrecs / get_maxrecs / get_dmaxrecs methods in xfs_bmap_btree.c.
      
      Note that all these new helpers take an xfs_mount * argument which will be
      needed to determine the size of a btree block once we add support for
      extended btree blocks with CRCs and other RAS information.
      
      SGI-PV: 988146
      
      SGI-Modid: xfs-linux-melb:xfs-kern:32292a
      Signed-off-by: NChristoph Hellwig <hch@infradead.org>
      Signed-off-by: NDonald Douwsma <donaldd@sgi.com>
      Signed-off-by: NLachlan McIlroy <lachlan@sgi.com>
      60197e8d
  15. 13 8月, 2008 1 次提交
  16. 28 7月, 2008 1 次提交
  17. 18 4月, 2008 6 次提交