mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
XArray: Add xas_advance()
Add a new helper function to help iterate over multi-index entries. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: William Kucharski <william.kucharski@oracle.com>
This commit is contained in:
parent
b9a8a4195c
commit
25a8de7f8d
|
@ -1580,6 +1580,24 @@ static inline void xas_set(struct xa_state *xas, unsigned long index)
|
|||
xas->xa_node = XAS_RESTART;
|
||||
}
|
||||
|
||||
/**
|
||||
* xas_advance() - Skip over sibling entries.
|
||||
* @xas: XArray operation state.
|
||||
* @index: Index of last sibling entry.
|
||||
*
|
||||
* Move the operation state to refer to the last sibling entry.
|
||||
* This is useful for loops that normally want to see sibling
|
||||
* entries but sometimes want to skip them. Use xas_set() if you
|
||||
* want to move to an index which is not part of this entry.
|
||||
*/
|
||||
static inline void xas_advance(struct xa_state *xas, unsigned long index)
|
||||
{
|
||||
unsigned char shift = xas_is_node(xas) ? xas->xa_node->shift : 0;
|
||||
|
||||
xas->xa_index = index;
|
||||
xas->xa_offset = (index >> shift) & XA_CHUNK_MASK;
|
||||
}
|
||||
|
||||
/**
|
||||
* xas_set_order() - Set up XArray operation state for a multislot entry.
|
||||
* @xas: XArray operation state.
|
||||
|
|
|
@ -157,7 +157,7 @@ static void xas_move_index(struct xa_state *xas, unsigned long offset)
|
|||
xas->xa_index += offset << shift;
|
||||
}
|
||||
|
||||
static void xas_advance(struct xa_state *xas)
|
||||
static void xas_next_offset(struct xa_state *xas)
|
||||
{
|
||||
xas->xa_offset++;
|
||||
xas_move_index(xas, xas->xa_offset);
|
||||
|
@ -1250,7 +1250,7 @@ void *xas_find(struct xa_state *xas, unsigned long max)
|
|||
xas->xa_offset = ((xas->xa_index - 1) & XA_CHUNK_MASK) + 1;
|
||||
}
|
||||
|
||||
xas_advance(xas);
|
||||
xas_next_offset(xas);
|
||||
|
||||
while (xas->xa_node && (xas->xa_index <= max)) {
|
||||
if (unlikely(xas->xa_offset == XA_CHUNK_SIZE)) {
|
||||
|
@ -1268,7 +1268,7 @@ void *xas_find(struct xa_state *xas, unsigned long max)
|
|||
if (entry && !xa_is_sibling(entry))
|
||||
return entry;
|
||||
|
||||
xas_advance(xas);
|
||||
xas_next_offset(xas);
|
||||
}
|
||||
|
||||
if (!xas->xa_node)
|
||||
|
|
Loading…
Reference in a new issue