summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJames Morris <jmorris@namei.org>2011-05-04 11:59:34 +1000
committerJames Morris <jmorris@namei.org>2011-05-04 11:59:34 +1000
commit6f239284542bae297d27355d06afbb8df23c5db9 (patch)
treeb0ba42fb54cd05178c61584e0913be38a57f0384 /lib
parent609cfda586c7fe3e5d1a02c51edb587506294167 (diff)
parentbf69d41d198138e3c601e9a6645f4f1369aff7e0 (diff)
downloadlinux-stable-6f239284542bae297d27355d06afbb8df23c5db9.tar.gz
linux-stable-6f239284542bae297d27355d06afbb8df23c5db9.tar.bz2
linux-stable-6f239284542bae297d27355d06afbb8df23c5db9.zip
Merge branch 'for-linus' of git://git.infradead.org/users/eparis/selinux into for-linus
Diffstat (limited to 'lib')
-rw-r--r--lib/flex_array.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/lib/flex_array.c b/lib/flex_array.c
index c0ea40ba2082..854b57bd7d9d 100644
--- a/lib/flex_array.c
+++ b/lib/flex_array.c
@@ -232,10 +232,10 @@ EXPORT_SYMBOL(flex_array_clear);
/**
* flex_array_prealloc - guarantee that array space exists
- * @fa: the flex array for which to preallocate parts
- * @start: index of first array element for which space is allocated
- * @end: index of last (inclusive) element for which space is allocated
- * @flags: page allocation flags
+ * @fa: the flex array for which to preallocate parts
+ * @start: index of first array element for which space is allocated
+ * @nr_elements: number of elements for which space is allocated
+ * @flags: page allocation flags
*
* This will guarantee that no future calls to flex_array_put()
* will allocate memory. It can be used if you are expecting to
@@ -245,14 +245,24 @@ EXPORT_SYMBOL(flex_array_clear);
* Locking must be provided by the caller.
*/
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 end_part;
int part_nr;
+ unsigned int end;
struct flex_array_part *part;
- if (start >= fa->total_nr_elements || end >= fa->total_nr_elements)
+ if (!start && !nr_elements)
+ return 0;
+ if (start >= fa->total_nr_elements)
+ return -ENOSPC;
+ if (!nr_elements)
+ return 0;
+
+ end = start + nr_elements - 1;
+
+ if (end >= fa->total_nr_elements)
return -ENOSPC;
if (elements_fit_in_base(fa))
return 0;
@@ -343,6 +353,8 @@ int flex_array_shrink(struct flex_array *fa)
int part_nr;
int ret = 0;
+ if (!fa->total_nr_elements)
+ return 0;
if (elements_fit_in_base(fa))
return ret;
for (part_nr = 0; part_nr < FLEX_ARRAY_NR_BASE_PTRS; part_nr++) {