cregit-Linux how code gets into the kernel

Release 4.7 crypto/scatterwalk.c

Directory: crypto
/*
 * Cryptographic API.
 *
 * Cipher operations.
 *
 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
 *               2002 Adam J. Richter <adam@yggdrasil.com>
 *               2004 Jean-Luc Cooke <jlcooke@certainkey.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 */

#include <crypto/scatterwalk.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/pagemap.h>
#include <linux/highmem.h>
#include <linux/scatterlist.h>


static inline void memcpy_dir(void *buf, void *sgdata, size_t nbytes, int out) { void *src = out ? buf : sgdata; void *dst = out ? sgdata : buf; memcpy(dst, src, nbytes); }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton3060.00%150.00%
herbert xuherbert xu2040.00%150.00%
Total50100.00%2100.00%


void scatterwalk_start(struct scatter_walk *walk, struct scatterlist *sg) { walk->sg = sg; BUG_ON(!sg->length); walk->offset = sg->offset; }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton2978.38%150.00%
herbert xuherbert xu821.62%150.00%
Total37100.00%2100.00%

EXPORT_SYMBOL_GPL(scatterwalk_start);
void *scatterwalk_map(struct scatter_walk *walk) { return kmap_atomic(scatterwalk_page(walk)) + offset_in_page(walk->offset); }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton1762.96%133.33%
herbert xuherbert xu933.33%133.33%
americo wangamerico wang13.70%133.33%
Total27100.00%3100.00%

EXPORT_SYMBOL_GPL(scatterwalk_map);
static void scatterwalk_pagedone(struct scatter_walk *walk, int out, unsigned int more) { if (out) { struct page *page; page = sg_page(walk->sg) + ((walk->offset - 1) >> PAGE_SHIFT); /* Test ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE first as * PageSlab cannot be optimised away per se due to * use of volatile pointer. */ if (ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE && !PageSlab(page)) flush_dcache_page(page); } if (more) { walk->offset += PAGE_SIZE - 1; walk->offset &= PAGE_MASK; if (walk->offset >= walk->sg->offset + walk->sg->length) scatterwalk_start(walk, sg_next(walk->sg)); } }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton5850.00%114.29%
herbert xuherbert xu5446.55%457.14%
jens axboejens axboe32.59%114.29%
cristian stoicacristian stoica10.86%114.29%
Total116100.00%7100.00%


void scatterwalk_done(struct scatter_walk *walk, int out, int more) { if (!(scatterwalk_pagelen(walk) & (PAGE_SIZE - 1)) || !more) scatterwalk_pagedone(walk, out, more); }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton3272.73%133.33%
david s. millerdavid s. miller920.45%133.33%
herbert xuherbert xu36.82%133.33%
Total44100.00%3100.00%

EXPORT_SYMBOL_GPL(scatterwalk_done);
void scatterwalk_copychunks(void *buf, struct scatter_walk *walk, size_t nbytes, int out) { for (;;) { unsigned int len_this_page = scatterwalk_pagelen(walk); u8 *vaddr; if (len_this_page > nbytes) len_this_page = nbytes; vaddr = scatterwalk_map(walk); memcpy_dir(buf, vaddr, len_this_page, out); scatterwalk_unmap(vaddr); scatterwalk_advance(walk, len_this_page); if (nbytes == len_this_page) break; buf += len_this_page; nbytes -= len_this_page; scatterwalk_pagedone(walk, out, 1); } }

Contributors

PersonTokensPropCommitsCommitProp
herbert xuherbert xu5149.04%360.00%
andrew mortonandrew morton4745.19%120.00%
j. bruce fieldsj. bruce fields65.77%120.00%
Total104100.00%5100.00%

EXPORT_SYMBOL_GPL(scatterwalk_copychunks);
void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg, unsigned int start, unsigned int nbytes, int out) { struct scatter_walk walk; struct scatterlist tmp[2]; if (!nbytes) return; sg = scatterwalk_ffwd(tmp, sg, start); if (sg_page(sg) == virt_to_page(buf) && sg->offset == offset_in_page(buf)) return; scatterwalk_start(&walk, sg); scatterwalk_copychunks(buf, &walk, nbytes, out); scatterwalk_done(&walk, out, 0); }

Contributors

PersonTokensPropCommitsCommitProp
herbert xuherbert xu105100.00%3100.00%
Total105100.00%3100.00%

EXPORT_SYMBOL_GPL(scatterwalk_map_and_copy);
int scatterwalk_bytes_sglen(struct scatterlist *sg, int num_bytes) { int offset = 0, n = 0; /* num_bytes is too small */ if (num_bytes < sg->length) return -1; do { offset += sg->length; n++; sg = sg_next(sg); /* num_bytes is too large */ if (unlikely(!sg && (num_bytes < offset))) return -1; } while (sg && (num_bytes > offset)); return n; }

Contributors

PersonTokensPropCommitsCommitProp
joel fernandesjoel fernandes8698.85%150.00%
cristian stoicacristian stoica11.15%150.00%
Total87100.00%2100.00%

EXPORT_SYMBOL_GPL(scatterwalk_bytes_sglen);
struct scatterlist *scatterwalk_ffwd(struct scatterlist dst[2], struct scatterlist *src, unsigned int len) { for (;;) { if (!len) return src; if (src->length > len) break; len -= src->length; src = sg_next(src); } sg_init_table(dst, 2); sg_set_page(dst, sg_page(src), src->length - len, src->offset + len); scatterwalk_crypto_chain(dst, sg_next(src), 0, 2); return dst; }

Contributors

PersonTokensPropCommitsCommitProp
herbert xuherbert xu106100.00%2100.00%
Total106100.00%2100.00%

EXPORT_SYMBOL_GPL(scatterwalk_ffwd);

Overall Contributors

PersonTokensPropCommitsCommitProp
herbert xuherbert xu39353.62%1365.00%
andrew mortonandrew morton22831.11%15.00%
joel fernandesjoel fernandes9112.41%15.00%
david s. millerdavid s. miller91.23%15.00%
j. bruce fieldsj. bruce fields60.82%15.00%
jens axboejens axboe30.41%15.00%
cristian stoicacristian stoica20.27%15.00%
americo wangamerico wang10.14%15.00%
Total733100.00%20100.00%
Directory: crypto
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}