Lines Matching refs:walk

41 			       struct blkcipher_walk *walk);
43 struct blkcipher_walk *walk);
45 static inline void blkcipher_map_src(struct blkcipher_walk *walk) in blkcipher_map_src() argument
47 walk->src.virt.addr = scatterwalk_map(&walk->in); in blkcipher_map_src()
50 static inline void blkcipher_map_dst(struct blkcipher_walk *walk) in blkcipher_map_dst() argument
52 walk->dst.virt.addr = scatterwalk_map(&walk->out); in blkcipher_map_dst()
55 static inline void blkcipher_unmap_src(struct blkcipher_walk *walk) in blkcipher_unmap_src() argument
57 scatterwalk_unmap(walk->src.virt.addr); in blkcipher_unmap_src()
60 static inline void blkcipher_unmap_dst(struct blkcipher_walk *walk) in blkcipher_unmap_dst() argument
62 scatterwalk_unmap(walk->dst.virt.addr); in blkcipher_unmap_dst()
74 static inline unsigned int blkcipher_done_slow(struct blkcipher_walk *walk, in blkcipher_done_slow() argument
79 addr = (u8 *)ALIGN((unsigned long)walk->buffer, walk->alignmask + 1); in blkcipher_done_slow()
81 scatterwalk_copychunks(addr, &walk->out, bsize, 1); in blkcipher_done_slow()
85 static inline unsigned int blkcipher_done_fast(struct blkcipher_walk *walk, in blkcipher_done_fast() argument
88 if (walk->flags & BLKCIPHER_WALK_COPY) { in blkcipher_done_fast()
89 blkcipher_map_dst(walk); in blkcipher_done_fast()
90 memcpy(walk->dst.virt.addr, walk->page, n); in blkcipher_done_fast()
91 blkcipher_unmap_dst(walk); in blkcipher_done_fast()
92 } else if (!(walk->flags & BLKCIPHER_WALK_PHYS)) { in blkcipher_done_fast()
93 if (walk->flags & BLKCIPHER_WALK_DIFF) in blkcipher_done_fast()
94 blkcipher_unmap_dst(walk); in blkcipher_done_fast()
95 blkcipher_unmap_src(walk); in blkcipher_done_fast()
98 scatterwalk_advance(&walk->in, n); in blkcipher_done_fast()
99 scatterwalk_advance(&walk->out, n); in blkcipher_done_fast()
105 struct blkcipher_walk *walk, int err) in blkcipher_walk_done() argument
110 unsigned int n = walk->nbytes - err; in blkcipher_walk_done()
112 if (likely(!(walk->flags & BLKCIPHER_WALK_SLOW))) in blkcipher_walk_done()
113 n = blkcipher_done_fast(walk, n); in blkcipher_walk_done()
118 n = blkcipher_done_slow(walk, n); in blkcipher_walk_done()
120 nbytes = walk->total - n; in blkcipher_walk_done()
124 scatterwalk_done(&walk->in, 0, nbytes); in blkcipher_walk_done()
125 scatterwalk_done(&walk->out, 1, nbytes); in blkcipher_walk_done()
128 walk->total = nbytes; in blkcipher_walk_done()
129 walk->nbytes = nbytes; in blkcipher_walk_done()
133 return blkcipher_walk_next(desc, walk); in blkcipher_walk_done()
136 if (walk->iv != desc->info) in blkcipher_walk_done()
137 memcpy(desc->info, walk->iv, walk->ivsize); in blkcipher_walk_done()
138 if (walk->buffer != walk->page) in blkcipher_walk_done()
139 kfree(walk->buffer); in blkcipher_walk_done()
140 if (walk->page) in blkcipher_walk_done()
141 free_page((unsigned long)walk->page); in blkcipher_walk_done()
148 struct blkcipher_walk *walk, in blkcipher_next_slow() argument
155 if (walk->buffer) in blkcipher_next_slow()
158 walk->buffer = walk->page; in blkcipher_next_slow()
159 if (walk->buffer) in blkcipher_next_slow()
164 walk->buffer = kmalloc(n, GFP_ATOMIC); in blkcipher_next_slow()
165 if (!walk->buffer) in blkcipher_next_slow()
166 return blkcipher_walk_done(desc, walk, -ENOMEM); in blkcipher_next_slow()
169 walk->dst.virt.addr = (u8 *)ALIGN((unsigned long)walk->buffer, in blkcipher_next_slow()
171 walk->dst.virt.addr = blkcipher_get_spot(walk->dst.virt.addr, bsize); in blkcipher_next_slow()
172 walk->src.virt.addr = blkcipher_get_spot(walk->dst.virt.addr + in blkcipher_next_slow()
175 scatterwalk_copychunks(walk->src.virt.addr, &walk->in, bsize, 0); in blkcipher_next_slow()
177 walk->nbytes = bsize; in blkcipher_next_slow()
178 walk->flags |= BLKCIPHER_WALK_SLOW; in blkcipher_next_slow()
183 static inline int blkcipher_next_copy(struct blkcipher_walk *walk) in blkcipher_next_copy() argument
185 u8 *tmp = walk->page; in blkcipher_next_copy()
187 blkcipher_map_src(walk); in blkcipher_next_copy()
188 memcpy(tmp, walk->src.virt.addr, walk->nbytes); in blkcipher_next_copy()
189 blkcipher_unmap_src(walk); in blkcipher_next_copy()
191 walk->src.virt.addr = tmp; in blkcipher_next_copy()
192 walk->dst.virt.addr = tmp; in blkcipher_next_copy()
198 struct blkcipher_walk *walk) in blkcipher_next_fast() argument
202 walk->src.phys.page = scatterwalk_page(&walk->in); in blkcipher_next_fast()
203 walk->src.phys.offset = offset_in_page(walk->in.offset); in blkcipher_next_fast()
204 walk->dst.phys.page = scatterwalk_page(&walk->out); in blkcipher_next_fast()
205 walk->dst.phys.offset = offset_in_page(walk->out.offset); in blkcipher_next_fast()
207 if (walk->flags & BLKCIPHER_WALK_PHYS) in blkcipher_next_fast()
210 diff = walk->src.phys.offset - walk->dst.phys.offset; in blkcipher_next_fast()
211 diff |= walk->src.virt.page - walk->dst.virt.page; in blkcipher_next_fast()
213 blkcipher_map_src(walk); in blkcipher_next_fast()
214 walk->dst.virt.addr = walk->src.virt.addr; in blkcipher_next_fast()
217 walk->flags |= BLKCIPHER_WALK_DIFF; in blkcipher_next_fast()
218 blkcipher_map_dst(walk); in blkcipher_next_fast()
225 struct blkcipher_walk *walk) in blkcipher_walk_next() argument
231 n = walk->total; in blkcipher_walk_next()
232 if (unlikely(n < walk->cipher_blocksize)) { in blkcipher_walk_next()
234 return blkcipher_walk_done(desc, walk, -EINVAL); in blkcipher_walk_next()
237 walk->flags &= ~(BLKCIPHER_WALK_SLOW | BLKCIPHER_WALK_COPY | in blkcipher_walk_next()
239 if (!scatterwalk_aligned(&walk->in, walk->alignmask) || in blkcipher_walk_next()
240 !scatterwalk_aligned(&walk->out, walk->alignmask)) { in blkcipher_walk_next()
241 walk->flags |= BLKCIPHER_WALK_COPY; in blkcipher_walk_next()
242 if (!walk->page) { in blkcipher_walk_next()
243 walk->page = (void *)__get_free_page(GFP_ATOMIC); in blkcipher_walk_next()
244 if (!walk->page) in blkcipher_walk_next()
249 bsize = min(walk->walk_blocksize, n); in blkcipher_walk_next()
250 n = scatterwalk_clamp(&walk->in, n); in blkcipher_walk_next()
251 n = scatterwalk_clamp(&walk->out, n); in blkcipher_walk_next()
254 err = blkcipher_next_slow(desc, walk, bsize, walk->alignmask); in blkcipher_walk_next()
258 walk->nbytes = n; in blkcipher_walk_next()
259 if (walk->flags & BLKCIPHER_WALK_COPY) { in blkcipher_walk_next()
260 err = blkcipher_next_copy(walk); in blkcipher_walk_next()
264 return blkcipher_next_fast(desc, walk); in blkcipher_walk_next()
267 if (walk->flags & BLKCIPHER_WALK_PHYS) { in blkcipher_walk_next()
268 walk->src.phys.page = virt_to_page(walk->src.virt.addr); in blkcipher_walk_next()
269 walk->dst.phys.page = virt_to_page(walk->dst.virt.addr); in blkcipher_walk_next()
270 walk->src.phys.offset &= PAGE_SIZE - 1; in blkcipher_walk_next()
271 walk->dst.phys.offset &= PAGE_SIZE - 1; in blkcipher_walk_next()
276 static inline int blkcipher_copy_iv(struct blkcipher_walk *walk) in blkcipher_copy_iv() argument
278 unsigned bs = walk->walk_blocksize; in blkcipher_copy_iv()
279 unsigned aligned_bs = ALIGN(bs, walk->alignmask + 1); in blkcipher_copy_iv()
281 walk->ivsize + max(aligned_bs, walk->ivsize) - in blkcipher_copy_iv()
282 (walk->alignmask + 1); in blkcipher_copy_iv()
285 size += walk->alignmask & ~(crypto_tfm_ctx_alignment() - 1); in blkcipher_copy_iv()
286 walk->buffer = kmalloc(size, GFP_ATOMIC); in blkcipher_copy_iv()
287 if (!walk->buffer) in blkcipher_copy_iv()
290 iv = (u8 *)ALIGN((unsigned long)walk->buffer, walk->alignmask + 1); in blkcipher_copy_iv()
293 iv = blkcipher_get_spot(iv, walk->ivsize); in blkcipher_copy_iv()
295 walk->iv = memcpy(iv, walk->iv, walk->ivsize); in blkcipher_copy_iv()
300 struct blkcipher_walk *walk) in blkcipher_walk_virt() argument
302 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_walk_virt()
303 walk->walk_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_virt()
304 walk->cipher_blocksize = walk->walk_blocksize; in blkcipher_walk_virt()
305 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_virt()
306 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_virt()
307 return blkcipher_walk_first(desc, walk); in blkcipher_walk_virt()
312 struct blkcipher_walk *walk) in blkcipher_walk_phys() argument
314 walk->flags |= BLKCIPHER_WALK_PHYS; in blkcipher_walk_phys()
315 walk->walk_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_phys()
316 walk->cipher_blocksize = walk->walk_blocksize; in blkcipher_walk_phys()
317 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_phys()
318 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_phys()
319 return blkcipher_walk_first(desc, walk); in blkcipher_walk_phys()
324 struct blkcipher_walk *walk) in blkcipher_walk_first() argument
329 walk->iv = desc->info; in blkcipher_walk_first()
330 walk->nbytes = walk->total; in blkcipher_walk_first()
331 if (unlikely(!walk->total)) in blkcipher_walk_first()
334 walk->buffer = NULL; in blkcipher_walk_first()
335 if (unlikely(((unsigned long)walk->iv & walk->alignmask))) { in blkcipher_walk_first()
336 int err = blkcipher_copy_iv(walk); in blkcipher_walk_first()
341 scatterwalk_start(&walk->in, walk->in.sg); in blkcipher_walk_first()
342 scatterwalk_start(&walk->out, walk->out.sg); in blkcipher_walk_first()
343 walk->page = NULL; in blkcipher_walk_first()
345 return blkcipher_walk_next(desc, walk); in blkcipher_walk_first()
349 struct blkcipher_walk *walk, in blkcipher_walk_virt_block() argument
352 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_walk_virt_block()
353 walk->walk_blocksize = blocksize; in blkcipher_walk_virt_block()
354 walk->cipher_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_virt_block()
355 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_virt_block()
356 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_virt_block()
357 return blkcipher_walk_first(desc, walk); in blkcipher_walk_virt_block()
362 struct blkcipher_walk *walk, in blkcipher_aead_walk_virt_block() argument
366 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_aead_walk_virt_block()
367 walk->walk_blocksize = blocksize; in blkcipher_aead_walk_virt_block()
368 walk->cipher_blocksize = crypto_aead_blocksize(tfm); in blkcipher_aead_walk_virt_block()
369 walk->ivsize = crypto_aead_ivsize(tfm); in blkcipher_aead_walk_virt_block()
370 walk->alignmask = crypto_aead_alignmask(tfm); in blkcipher_aead_walk_virt_block()
371 return blkcipher_walk_first(desc, walk); in blkcipher_aead_walk_virt_block()