diff options
author | James Morris <jmorris@namei.org> | 2011-05-04 11:59:34 +1000 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2011-05-04 11:59:34 +1000 |
commit | 6f239284542bae297d27355d06afbb8df23c5db9 (patch) | |
tree | b0ba42fb54cd05178c61584e0913be38a57f0384 /lib | |
parent | 609cfda586c7fe3e5d1a02c51edb587506294167 (diff) | |
parent | bf69d41d198138e3c601e9a6645f4f1369aff7e0 (diff) | |
download | linux-6f239284542bae297d27355d06afbb8df23c5db9.tar.gz linux-6f239284542bae297d27355d06afbb8df23c5db9.tar.bz2 linux-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.c | 24 |
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++) { |