flex_array: add flex_array_clear function
Add a new function to the flex_array API: int flex_array_clear(struct flex_array *fa, unsigned int element_nr) This function will zero the element at element_nr in the flex_array. Although this is equivalent to using flex_array_put() and passing a pointer to zero'd memory, flex_array_clear() does not require such a pointer to memory that would most likely need to be allocated on the caller's stack which could be significantly large depending on element_size. Signed-off-by: David Rientjes <rientjes@google.com> Cc: Dave Hansen <dave@linux.vnet.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
2f30b1f9e1
commit
e6de3988aa
2 changed files with 27 additions and 0 deletions
|
@ -44,6 +44,7 @@ void flex_array_free(struct flex_array *fa);
|
|||
void flex_array_free_parts(struct flex_array *fa);
|
||||
int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src,
|
||||
gfp_t flags);
|
||||
int flex_array_clear(struct flex_array *fa, unsigned int element_nr);
|
||||
void *flex_array_get(struct flex_array *fa, unsigned int element_nr);
|
||||
|
||||
#endif /* _FLEX_ARRAY_H */
|
||||
|
|
|
@ -206,6 +206,32 @@ int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* flex_array_clear - clear element in array at @element_nr
|
||||
* @element_nr: index of the position to clear.
|
||||
*
|
||||
* Locking must be provided by the caller.
|
||||
*/
|
||||
int flex_array_clear(struct flex_array *fa, unsigned int element_nr)
|
||||
{
|
||||
int part_nr = fa_element_to_part_nr(fa, element_nr);
|
||||
struct flex_array_part *part;
|
||||
void *dst;
|
||||
|
||||
if (element_nr >= fa->total_nr_elements)
|
||||
return -ENOSPC;
|
||||
if (elements_fit_in_base(fa))
|
||||
part = (struct flex_array_part *)&fa->parts[0];
|
||||
else {
|
||||
part = fa->parts[part_nr];
|
||||
if (!part)
|
||||
return -EINVAL;
|
||||
}
|
||||
dst = &part->elements[index_inside_part(fa, element_nr)];
|
||||
memset(dst, 0, fa->element_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* flex_array_prealloc - guarantee that array space exists
|
||||
* @start: index of first array element for which space is allocated
|
||||
|
|
Loading…
Reference in a new issue