Loading Documentation/flexible-arrays.txt +2 −2 Original line number 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: 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 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 block. Loading include/linux/flex_array.h +1 −1 Original line number 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, gfp_t flags); 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_parts(struct flex_array *fa); int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, Loading lib/flex_array.c +18 −6 Original line number Diff line number Diff line Loading @@ -234,7 +234,7 @@ 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 * @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() Loading @@ -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; Loading Loading @@ -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++) { Loading security/selinux/hooks.c +2 −1 Original line number Diff line number Diff line Loading @@ -1578,7 +1578,8 @@ static int may_create(struct inode *dir, return rc; 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) return rc; } Loading security/selinux/ss/policydb.c +3 −3 Original line number Diff line number Diff line Loading @@ -502,7 +502,7 @@ static int policydb_index(struct policydb *p) goto out; 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) goto out; Loading @@ -519,7 +519,7 @@ static int policydb_index(struct policydb *p) goto out; 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); if (rc) goto out; Loading Loading @@ -2375,7 +2375,7 @@ int policydb_read(struct policydb *p, void *fp) goto bad; /* 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); if (rc) goto bad; Loading Loading
Documentation/flexible-arrays.txt +2 −2 Original line number 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: 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 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 block. Loading
include/linux/flex_array.h +1 −1 Original line number 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, gfp_t flags); 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_parts(struct flex_array *fa); int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, Loading
lib/flex_array.c +18 −6 Original line number Diff line number Diff line Loading @@ -234,7 +234,7 @@ 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 * @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() Loading @@ -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; Loading Loading @@ -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++) { Loading
security/selinux/hooks.c +2 −1 Original line number Diff line number Diff line Loading @@ -1578,7 +1578,8 @@ static int may_create(struct inode *dir, return rc; 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) return rc; } Loading
security/selinux/ss/policydb.c +3 −3 Original line number Diff line number Diff line Loading @@ -502,7 +502,7 @@ static int policydb_index(struct policydb *p) goto out; 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) goto out; Loading @@ -519,7 +519,7 @@ static int policydb_index(struct policydb *p) goto out; 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); if (rc) goto out; Loading Loading @@ -2375,7 +2375,7 @@ int policydb_read(struct policydb *p, void *fp) goto bad; /* 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); if (rc) goto bad; Loading