Loading Documentation/flexible-arrays.txt +2 −2 Original line number Original line Diff line number Diff line Loading @@ -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. Loading include/linux/flex_array.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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, Loading lib/flex_array.c +18 −6 Original line number Original line Diff line number Diff line Loading @@ -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() Loading @@ -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; Loading Loading @@ -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++) { Loading security/selinux/hooks.c +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading security/selinux/ss/policydb.c +3 −3 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading
Documentation/flexible-arrays.txt +2 −2 Original line number Original line Diff line number Diff line Loading @@ -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. Loading
include/linux/flex_array.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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, Loading
lib/flex_array.c +18 −6 Original line number Original line Diff line number Diff line Loading @@ -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() Loading @@ -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; Loading Loading @@ -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++) { Loading
security/selinux/hooks.c +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading
security/selinux/ss/policydb.c +3 −3 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading