aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/assoc_array.c51
-rw-r--r--lib/digsig.c6
-rw-r--r--lib/scatterlist.c95
-rw-r--r--lib/ts_fsm.c2
-rw-r--r--lib/ts_kmp.c2
5 files changed, 93 insertions, 63 deletions
diff --git a/lib/assoc_array.c b/lib/assoc_array.c
index 155c55d8db5f..4e53be8bc590 100644
--- a/lib/assoc_array.c
+++ b/lib/assoc_array.c
@@ -598,21 +598,31 @@ static bool assoc_array_insert_into_terminal_node(struct assoc_array_edit *edit,
598 if ((edit->segment_cache[ASSOC_ARRAY_FAN_OUT] ^ base_seg) == 0) 598 if ((edit->segment_cache[ASSOC_ARRAY_FAN_OUT] ^ base_seg) == 0)
599 goto all_leaves_cluster_together; 599 goto all_leaves_cluster_together;
600 600
601 /* Otherwise we can just insert a new node ahead of the old 601 /* Otherwise all the old leaves cluster in the same slot, but
602 * one. 602 * the new leaf wants to go into a different slot - so we
603 * create a new node (n0) to hold the new leaf and a pointer to
604 * a new node (n1) holding all the old leaves.
605 *
606 * This can be done by falling through to the node splitting
607 * path.
603 */ 608 */
604 goto present_leaves_cluster_but_not_new_leaf; 609 pr_devel("present leaves cluster but not new leaf\n");
605 } 610 }
606 611
607split_node: 612split_node:
608 pr_devel("split node\n"); 613 pr_devel("split node\n");
609 614
610 /* We need to split the current node; we know that the node doesn't 615 /* We need to split the current node. The node must contain anything
611 * simply contain a full set of leaves that cluster together (it 616 * from a single leaf (in the one leaf case, this leaf will cluster
612 * contains meta pointers and/or non-clustering leaves). 617 * with the new leaf) and the rest meta-pointers, to all leaves, some
618 * of which may cluster.
619 *
620 * It won't contain the case in which all the current leaves plus the
621 * new leaves want to cluster in the same slot.
613 * 622 *
614 * We need to expel at least two leaves out of a set consisting of the 623 * We need to expel at least two leaves out of a set consisting of the
615 * leaves in the node and the new leaf. 624 * leaves in the node and the new leaf. The current meta pointers can
625 * just be copied as they shouldn't cluster with any of the leaves.
616 * 626 *
617 * We need a new node (n0) to replace the current one and a new node to 627 * We need a new node (n0) to replace the current one and a new node to
618 * take the expelled nodes (n1). 628 * take the expelled nodes (n1).
@@ -717,33 +727,6 @@ found_slot_for_multiple_occupancy:
717 pr_devel("<--%s() = ok [split node]\n", __func__); 727 pr_devel("<--%s() = ok [split node]\n", __func__);
718 return true; 728 return true;
719 729
720present_leaves_cluster_but_not_new_leaf:
721 /* All the old leaves cluster in the same slot, but the new leaf wants
722 * to go into a different slot, so we create a new node to hold the new
723 * leaf and a pointer to a new node holding all the old leaves.
724 */
725 pr_devel("present leaves cluster but not new leaf\n");
726
727 new_n0->back_pointer = node->back_pointer;
728 new_n0->parent_slot = node->parent_slot;
729 new_n0->nr_leaves_on_branch = node->nr_leaves_on_branch;
730 new_n1->back_pointer = assoc_array_node_to_ptr(new_n0);
731 new_n1->parent_slot = edit->segment_cache[0];
732 new_n1->nr_leaves_on_branch = node->nr_leaves_on_branch;
733 edit->adjust_count_on = new_n0;
734
735 for (i = 0; i < ASSOC_ARRAY_FAN_OUT; i++)
736 new_n1->slots[i] = node->slots[i];
737
738 new_n0->slots[edit->segment_cache[0]] = assoc_array_node_to_ptr(new_n0);
739 edit->leaf_p = &new_n0->slots[edit->segment_cache[ASSOC_ARRAY_FAN_OUT]];
740
741 edit->set[0].ptr = &assoc_array_ptr_to_node(node->back_pointer)->slots[node->parent_slot];
742 edit->set[0].to = assoc_array_node_to_ptr(new_n0);
743 edit->excised_meta[0] = assoc_array_node_to_ptr(node);
744 pr_devel("<--%s() = ok [insert node before]\n", __func__);
745 return true;
746
747all_leaves_cluster_together: 730all_leaves_cluster_together:
748 /* All the leaves, new and old, want to cluster together in this node 731 /* All the leaves, new and old, want to cluster together in this node
749 * in the same slot, so we have to replace this node with a shortcut to 732 * in the same slot, so we have to replace this node with a shortcut to
diff --git a/lib/digsig.c b/lib/digsig.c
index 03d7c63837ae..6ba6fcd92dd1 100644
--- a/lib/digsig.c
+++ b/lib/digsig.c
@@ -87,6 +87,12 @@ static int digsig_verify_rsa(struct key *key,
87 down_read(&key->sem); 87 down_read(&key->sem);
88 ukp = user_key_payload_locked(key); 88 ukp = user_key_payload_locked(key);
89 89
90 if (!ukp) {
91 /* key was revoked before we acquired its semaphore */
92 err = -EKEYREVOKED;
93 goto err1;
94 }
95
90 if (ukp->datalen < sizeof(*pkh)) 96 if (ukp->datalen < sizeof(*pkh))
91 goto err1; 97 goto err1;
92 98
diff --git a/lib/scatterlist.c b/lib/scatterlist.c
index be7b4dd6b68d..7c1c55f7daaa 100644
--- a/lib/scatterlist.c
+++ b/lib/scatterlist.c
@@ -370,41 +370,49 @@ int sg_alloc_table(struct sg_table *table, unsigned int nents, gfp_t gfp_mask)
370EXPORT_SYMBOL(sg_alloc_table); 370EXPORT_SYMBOL(sg_alloc_table);
371 371
372/** 372/**
373 * sg_alloc_table_from_pages - Allocate and initialize an sg table from 373 * __sg_alloc_table_from_pages - Allocate and initialize an sg table from
374 * an array of pages 374 * an array of pages
375 * @sgt: The sg table header to use 375 * @sgt: The sg table header to use
376 * @pages: Pointer to an array of page pointers 376 * @pages: Pointer to an array of page pointers
377 * @n_pages: Number of pages in the pages array 377 * @n_pages: Number of pages in the pages array
378 * @offset: Offset from start of the first page to the start of a buffer 378 * @offset: Offset from start of the first page to the start of a buffer
379 * @size: Number of valid bytes in the buffer (after offset) 379 * @size: Number of valid bytes in the buffer (after offset)
380 * @gfp_mask: GFP allocation mask 380 * @max_segment: Maximum size of a scatterlist node in bytes (page aligned)
381 * @gfp_mask: GFP allocation mask
381 * 382 *
382 * Description: 383 * Description:
383 * Allocate and initialize an sg table from a list of pages. Contiguous 384 * Allocate and initialize an sg table from a list of pages. Contiguous
384 * ranges of the pages are squashed into a single scatterlist node. A user 385 * ranges of the pages are squashed into a single scatterlist node up to the
385 * may provide an offset at a start and a size of valid data in a buffer 386 * maximum size specified in @max_segment. An user may provide an offset at a
386 * specified by the page array. The returned sg table is released by 387 * start and a size of valid data in a buffer specified by the page array.
387 * sg_free_table. 388 * The returned sg table is released by sg_free_table.
388 * 389 *
389 * Returns: 390 * Returns:
390 * 0 on success, negative error on failure 391 * 0 on success, negative error on failure
391 */ 392 */
392int sg_alloc_table_from_pages(struct sg_table *sgt, 393int __sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pages,
393 struct page **pages, unsigned int n_pages, 394 unsigned int n_pages, unsigned int offset,
394 unsigned long offset, unsigned long size, 395 unsigned long size, unsigned int max_segment,
395 gfp_t gfp_mask) 396 gfp_t gfp_mask)
396{ 397{
397 unsigned int chunks; 398 unsigned int chunks, cur_page, seg_len, i;
398 unsigned int i;
399 unsigned int cur_page;
400 int ret; 399 int ret;
401 struct scatterlist *s; 400 struct scatterlist *s;
402 401
402 if (WARN_ON(!max_segment || offset_in_page(max_segment)))
403 return -EINVAL;
404
403 /* compute number of contiguous chunks */ 405 /* compute number of contiguous chunks */
404 chunks = 1; 406 chunks = 1;
405 for (i = 1; i < n_pages; ++i) 407 seg_len = 0;
406 if (page_to_pfn(pages[i]) != page_to_pfn(pages[i - 1]) + 1) 408 for (i = 1; i < n_pages; i++) {
407 ++chunks; 409 seg_len += PAGE_SIZE;
410 if (seg_len >= max_segment ||
411 page_to_pfn(pages[i]) != page_to_pfn(pages[i - 1]) + 1) {
412 chunks++;
413 seg_len = 0;
414 }
415 }
408 416
409 ret = sg_alloc_table(sgt, chunks, gfp_mask); 417 ret = sg_alloc_table(sgt, chunks, gfp_mask);
410 if (unlikely(ret)) 418 if (unlikely(ret))
@@ -413,17 +421,21 @@ int sg_alloc_table_from_pages(struct sg_table *sgt,
413 /* merging chunks and putting them into the scatterlist */ 421 /* merging chunks and putting them into the scatterlist */
414 cur_page = 0; 422 cur_page = 0;
415 for_each_sg(sgt->sgl, s, sgt->orig_nents, i) { 423 for_each_sg(sgt->sgl, s, sgt->orig_nents, i) {
416 unsigned long chunk_size; 424 unsigned int j, chunk_size;
417 unsigned int j;
418 425
419 /* look for the end of the current chunk */ 426 /* look for the end of the current chunk */
420 for (j = cur_page + 1; j < n_pages; ++j) 427 seg_len = 0;
421 if (page_to_pfn(pages[j]) != 428 for (j = cur_page + 1; j < n_pages; j++) {
429 seg_len += PAGE_SIZE;
430 if (seg_len >= max_segment ||
431 page_to_pfn(pages[j]) !=
422 page_to_pfn(pages[j - 1]) + 1) 432 page_to_pfn(pages[j - 1]) + 1)
423 break; 433 break;
434 }
424 435
425 chunk_size = ((j - cur_page) << PAGE_SHIFT) - offset; 436 chunk_size = ((j - cur_page) << PAGE_SHIFT) - offset;
426 sg_set_page(s, pages[cur_page], min(size, chunk_size), offset); 437 sg_set_page(s, pages[cur_page],
438 min_t(unsigned long, size, chunk_size), offset);
427 size -= chunk_size; 439 size -= chunk_size;
428 offset = 0; 440 offset = 0;
429 cur_page = j; 441 cur_page = j;
@@ -431,6 +443,35 @@ int sg_alloc_table_from_pages(struct sg_table *sgt,
431 443
432 return 0; 444 return 0;
433} 445}
446EXPORT_SYMBOL(__sg_alloc_table_from_pages);
447
448/**
449 * sg_alloc_table_from_pages - Allocate and initialize an sg table from
450 * an array of pages
451 * @sgt: The sg table header to use
452 * @pages: Pointer to an array of page pointers
453 * @n_pages: Number of pages in the pages array
454 * @offset: Offset from start of the first page to the start of a buffer
455 * @size: Number of valid bytes in the buffer (after offset)
456 * @gfp_mask: GFP allocation mask
457 *
458 * Description:
459 * Allocate and initialize an sg table from a list of pages. Contiguous
460 * ranges of the pages are squashed into a single scatterlist node. A user
461 * may provide an offset at a start and a size of valid data in a buffer
462 * specified by the page array. The returned sg table is released by
463 * sg_free_table.
464 *
465 * Returns:
466 * 0 on success, negative error on failure
467 */
468int sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pages,
469 unsigned int n_pages, unsigned int offset,
470 unsigned long size, gfp_t gfp_mask)
471{
472 return __sg_alloc_table_from_pages(sgt, pages, n_pages, offset, size,
473 SCATTERLIST_MAX_SEGMENT, gfp_mask);
474}
434EXPORT_SYMBOL(sg_alloc_table_from_pages); 475EXPORT_SYMBOL(sg_alloc_table_from_pages);
435 476
436void __sg_page_iter_start(struct sg_page_iter *piter, 477void __sg_page_iter_start(struct sg_page_iter *piter,
diff --git a/lib/ts_fsm.c b/lib/ts_fsm.c
index 5696a35184e4..69557c74ef9f 100644
--- a/lib/ts_fsm.c
+++ b/lib/ts_fsm.c
@@ -11,7 +11,7 @@
11 * ========================================================================== 11 * ==========================================================================
12 * 12 *
13 * A finite state machine consists of n states (struct ts_fsm_token) 13 * A finite state machine consists of n states (struct ts_fsm_token)
14 * representing the pattern as a finite automation. The data is read 14 * representing the pattern as a finite automaton. The data is read
15 * sequentially on an octet basis. Every state token specifies the number 15 * sequentially on an octet basis. Every state token specifies the number
16 * of recurrences and the type of value accepted which can be either a 16 * of recurrences and the type of value accepted which can be either a
17 * specific character or ctype based set of characters. The available 17 * specific character or ctype based set of characters. The available
diff --git a/lib/ts_kmp.c b/lib/ts_kmp.c
index 632f783e65f1..ffbe66cbb0ed 100644
--- a/lib/ts_kmp.c
+++ b/lib/ts_kmp.c
@@ -27,7 +27,7 @@
27 * 27 *
28 * [1] Cormen, Leiserson, Rivest, Stein 28 * [1] Cormen, Leiserson, Rivest, Stein
29 * Introdcution to Algorithms, 2nd Edition, MIT Press 29 * Introdcution to Algorithms, 2nd Edition, MIT Press
30 * [2] See finite automation theory 30 * [2] See finite automaton theory
31 */ 31 */
32 32
33#include <linux/module.h> 33#include <linux/module.h>