Merge branch 'for-linus' of git://git.infradead.org/users/eparis/selinux into for-linus

This commit is contained in:
James Morris
2011-05-04 11:59:34 +10:00
5 changed files with 26 additions and 13 deletions

View File

@@ -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.

View File

@@ -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,

View File

@@ -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,14 +245,24 @@ 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;
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; return -ENOSPC;
if (elements_fit_in_base(fa)) if (elements_fit_in_base(fa))
return 0; return 0;
@@ -343,6 +353,8 @@ int flex_array_shrink(struct flex_array *fa)
int part_nr; int part_nr;
int ret = 0; int ret = 0;
if (!fa->total_nr_elements)
return 0;
if (elements_fit_in_base(fa)) if (elements_fit_in_base(fa))
return ret; return ret;
for (part_nr = 0; part_nr < FLEX_ARRAY_NR_BASE_PTRS; part_nr++) { for (part_nr = 0; part_nr < FLEX_ARRAY_NR_BASE_PTRS; part_nr++) {

View File

@@ -1578,7 +1578,8 @@ static int may_create(struct inode *dir,
return rc; return rc;
if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) { if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) {
rc = security_transition_sid(sid, dsec->sid, tclass, NULL, &newsid); rc = security_transition_sid(sid, dsec->sid, tclass,
&dentry->d_name, &newsid);
if (rc) if (rc)
return rc; return rc;
} }

View File

@@ -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;