Commit 5d30b10b authored by Eric Paris's avatar Eric Paris

flex_array: flex_array_prealloc takes a number of elements, not an end

Change flex_array_prealloc to take the number of elements for which space
should be allocated instead of the last (inclusive) element. Users
and documentation are updated accordingly.  flex_arrays got introduced before
they had users.  When folks started using it, they ended up needing a
different API than was coded up originally.  This swaps over to the API that
folks apparently need.
Based-on-patch-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: default avatarEric Paris <eparis@redhat.com>
Tested-by: default avatarChris Richards <gizmo@giz-works.com>
Acked-by: default avatarDave Hansen <dave@linux.vnet.ibm.com>
Cc: stable@kernel.org [2.6.38+]
parent cb1e922f
...@@ -66,10 +66,10 @@ trick is to ensure that any needed memory allocations are done before ...@@ -66,10 +66,10 @@ trick is to ensure that any needed memory allocations are done before
entering atomic context, using: entering atomic context, using:
int flex_array_prealloc(struct flex_array *array, unsigned int start, int flex_array_prealloc(struct flex_array *array, unsigned int start,
unsigned int end, gfp_t flags); unsigned int nr_elements, gfp_t flags);
This function will ensure that memory for the elements indexed in the range This function will ensure that memory for the elements indexed in the range
defined by start and end has been allocated. Thereafter, a defined by start and nr_elements has been allocated. Thereafter, a
flex_array_put() call on an element in that range is guaranteed not to flex_array_put() call on an element in that range is guaranteed not to
block. block.
......
...@@ -61,7 +61,7 @@ struct flex_array { ...@@ -61,7 +61,7 @@ struct flex_array {
struct flex_array *flex_array_alloc(int element_size, unsigned int total, struct flex_array *flex_array_alloc(int element_size, unsigned int total,
gfp_t flags); gfp_t flags);
int flex_array_prealloc(struct flex_array *fa, unsigned int start, int flex_array_prealloc(struct flex_array *fa, unsigned int start,
unsigned int end, gfp_t flags); unsigned int nr_elements, gfp_t flags);
void flex_array_free(struct flex_array *fa); void flex_array_free(struct flex_array *fa);
void flex_array_free_parts(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, int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src,
......
...@@ -232,10 +232,10 @@ EXPORT_SYMBOL(flex_array_clear); ...@@ -232,10 +232,10 @@ EXPORT_SYMBOL(flex_array_clear);
/** /**
* flex_array_prealloc - guarantee that array space exists * flex_array_prealloc - guarantee that array space exists
* @fa: the flex array for which to preallocate parts * @fa: the flex array for which to preallocate parts
* @start: index of first array element for which space is allocated * @start: index of first array element for which space is allocated
* @end: index of last (inclusive) element for which space is allocated * @nr_elements: number of elements for which space is allocated
* @flags: page allocation flags * @flags: page allocation flags
* *
* This will guarantee that no future calls to flex_array_put() * This will guarantee that no future calls to flex_array_put()
* will allocate memory. It can be used if you are expecting to * will allocate memory. It can be used if you are expecting to
...@@ -245,13 +245,16 @@ EXPORT_SYMBOL(flex_array_clear); ...@@ -245,13 +245,16 @@ EXPORT_SYMBOL(flex_array_clear);
* Locking must be provided by the caller. * Locking must be provided by the caller.
*/ */
int flex_array_prealloc(struct flex_array *fa, unsigned int start, int flex_array_prealloc(struct flex_array *fa, unsigned int start,
unsigned int end, gfp_t flags) unsigned int nr_elements, gfp_t flags)
{ {
int start_part; int start_part;
int end_part; int end_part;
int part_nr; int part_nr;
unsigned int end;
struct flex_array_part *part; struct flex_array_part *part;
end = start + nr_elements - 1;
if (start >= fa->total_nr_elements || end >= fa->total_nr_elements) if (start >= fa->total_nr_elements || end >= fa->total_nr_elements)
return -ENOSPC; return -ENOSPC;
if (elements_fit_in_base(fa)) if (elements_fit_in_base(fa))
......
...@@ -502,7 +502,7 @@ static int policydb_index(struct policydb *p) ...@@ -502,7 +502,7 @@ static int policydb_index(struct policydb *p)
goto out; goto out;
rc = flex_array_prealloc(p->type_val_to_struct_array, 0, rc = flex_array_prealloc(p->type_val_to_struct_array, 0,
p->p_types.nprim - 1, GFP_KERNEL | __GFP_ZERO); p->p_types.nprim, GFP_KERNEL | __GFP_ZERO);
if (rc) if (rc)
goto out; goto out;
...@@ -519,7 +519,7 @@ static int policydb_index(struct policydb *p) ...@@ -519,7 +519,7 @@ static int policydb_index(struct policydb *p)
goto out; goto out;
rc = flex_array_prealloc(p->sym_val_to_name[i], rc = flex_array_prealloc(p->sym_val_to_name[i],
0, p->symtab[i].nprim - 1, 0, p->symtab[i].nprim,
GFP_KERNEL | __GFP_ZERO); GFP_KERNEL | __GFP_ZERO);
if (rc) if (rc)
goto out; goto out;
...@@ -2375,7 +2375,7 @@ int policydb_read(struct policydb *p, void *fp) ...@@ -2375,7 +2375,7 @@ int policydb_read(struct policydb *p, void *fp)
goto bad; goto bad;
/* preallocate so we don't have to worry about the put ever failing */ /* preallocate so we don't have to worry about the put ever failing */
rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim - 1, rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim,
GFP_KERNEL | __GFP_ZERO); GFP_KERNEL | __GFP_ZERO);
if (rc) if (rc)
goto bad; goto bad;
......
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