Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -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.


+1 −1
Original line number Original line Diff line number Diff line
@@ -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,
+8 −5
Original line number Original line Diff line number Diff line
@@ -234,7 +234,7 @@ 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()
@@ -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))
+3 −3
Original line number Original line Diff line number Diff line
@@ -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)
			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)
		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;