Use a cursor for AIL traversal.
To replace the current generation number ensuring sanity of the AIL
traversal, replace it with an external cursor that is linked to the
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
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
Hence traversal restarts pretty much disappear altogether with this
method of traversal, which should substantially reduce the overhead
of pushing on a busy AIL.
o add restart logic
o comment cursor interface
o minor cleanups
Signed-off-by: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Thu Oct 16 15:33:42 EST 2008
Inspected by: hch
The following file(s) were checked into:
fs/xfs/xfs_log.c - 1.369 - changed
fs/xfs/xfs_trans_priv.h - 1.32 - changed
fs/xfs/xfs_trans_ail.c - 1.89 - changed
fs/xfs/xfs_log_recover.c - 1.350 - changed
- Use a cursor for AIL traversal.