Commit ea98eed9 authored by Eric Paris's avatar Eric Paris Committed by Linus Torvalds

flex_array: add helpers to get and put to make pointers easy to use

Getting and putting arrays of pointers with flex arrays is a PITA.  You
have to remember to pass &ptr to the _put and you have to do weird and
wacky casting to get the ptr back from the _get.  Add two functions
flex_array_get_ptr() and flex_array_put_ptr() to handle all of the magic.

[akpm@linux-foundation.org: simplification suggested by Joe]
Signed-off-by: default avatarEric Paris <eparis@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Dave Hansen <dave@linux.vnet.ibm.com>
Cc: Joe Perches <joe@perches.com>
Cc: James Morris <jmorris@namei.org>
Cc: Joe Perches <joe@perches.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 559b140a
...@@ -70,4 +70,9 @@ int flex_array_clear(struct flex_array *fa, unsigned int element_nr); ...@@ -70,4 +70,9 @@ int flex_array_clear(struct flex_array *fa, unsigned int element_nr);
void *flex_array_get(struct flex_array *fa, unsigned int element_nr); void *flex_array_get(struct flex_array *fa, unsigned int element_nr);
int flex_array_shrink(struct flex_array *fa); int flex_array_shrink(struct flex_array *fa);
#define flex_array_put_ptr(fa, nr, src, gfp) \
flex_array_put(fa, nr, &(void *)(src), gfp)
void *flex_array_get_ptr(struct flex_array *fa, unsigned int element_nr);
#endif /* _FLEX_ARRAY_H */ #endif /* _FLEX_ARRAY_H */
...@@ -171,6 +171,8 @@ __fa_get_part(struct flex_array *fa, int part_nr, gfp_t flags) ...@@ -171,6 +171,8 @@ __fa_get_part(struct flex_array *fa, int part_nr, gfp_t flags)
* Note that this *copies* the contents of @src into * Note that this *copies* the contents of @src into
* the array. If you are trying to store an array of * the array. If you are trying to store an array of
* pointers, make sure to pass in &ptr instead of ptr. * pointers, make sure to pass in &ptr instead of ptr.
* You may instead wish to use the flex_array_put_ptr()
* helper function.
* *
* Locking must be provided by the caller. * Locking must be provided by the caller.
*/ */
...@@ -265,7 +267,8 @@ int flex_array_prealloc(struct flex_array *fa, unsigned int start, ...@@ -265,7 +267,8 @@ int flex_array_prealloc(struct flex_array *fa, unsigned int start,
* *
* Returns a pointer to the data at index @element_nr. Note * Returns a pointer to the data at index @element_nr. Note
* that this is a copy of the data that was passed in. If you * that this is a copy of the data that was passed in. If you
* are using this to store pointers, you'll get back &ptr. * are using this to store pointers, you'll get back &ptr. You
* may instead wish to use the flex_array_get_ptr helper.
* *
* Locking must be provided by the caller. * Locking must be provided by the caller.
*/ */
...@@ -286,6 +289,26 @@ void *flex_array_get(struct flex_array *fa, unsigned int element_nr) ...@@ -286,6 +289,26 @@ void *flex_array_get(struct flex_array *fa, unsigned int element_nr)
return &part->elements[index_inside_part(fa, element_nr)]; return &part->elements[index_inside_part(fa, element_nr)];
} }
/**
* flex_array_get_ptr - pull a ptr back out of the array
* @fa: the flex array from which to extract data
* @element_nr: index of the element to fetch from the array
*
* Returns the pointer placed in the flex array at element_nr using
* flex_array_put_ptr(). This function should not be called if the
* element in question was not set using the _put_ptr() helper.
*/
void *flex_array_get_ptr(struct flex_array *fa, unsigned int element_nr)
{
void **tmp;
tmp = flex_array_get(fa, element_nr);
if (!tmp)
return NULL;
return *tmp;
}
static int part_is_free(struct flex_array_part *part) static int part_is_free(struct flex_array_part *part)
{ {
int i; int i;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment