flex_array: add flex_array_clear function
authorDavid Rientjes <rientjes@google.com>
Tue, 22 Sep 2009 00:04:30 +0000 (17:04 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Sep 2009 14:17:47 +0000 (07:17 -0700)
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>
include/linux/flex_array.h
lib/flex_array.c

index 45ff184915149aa150f2d9157ac3cc997a446a5d..3887b21f883fc9fb7fae91e126e71c554332c865 100644 (file)
@@ -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 */
index 7baed2fc3bc82920f97183c6fa70532250d165b4..b68f99be4080283ab6c0b1e0c5d630330640cbb4 100644 (file)
@@ -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