diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/flex_array.c | 2 | ||||
-rw-r--r-- | lib/scatterlist.c | 16 |
2 files changed, 12 insertions, 6 deletions
diff --git a/lib/flex_array.c b/lib/flex_array.c index 0e7894ce8882..08f1636d296a 100644 --- a/lib/flex_array.c +++ b/lib/flex_array.c | |||
@@ -254,7 +254,6 @@ void *flex_array_get(struct flex_array *fa, int element_nr) | |||
254 | { | 254 | { |
255 | int part_nr = fa_element_to_part_nr(fa, element_nr); | 255 | int part_nr = fa_element_to_part_nr(fa, element_nr); |
256 | struct flex_array_part *part; | 256 | struct flex_array_part *part; |
257 | int index; | ||
258 | 257 | ||
259 | if (element_nr >= fa->total_nr_elements) | 258 | if (element_nr >= fa->total_nr_elements) |
260 | return NULL; | 259 | return NULL; |
@@ -264,6 +263,5 @@ void *flex_array_get(struct flex_array *fa, int element_nr) | |||
264 | part = (struct flex_array_part *)&fa->parts[0]; | 263 | part = (struct flex_array_part *)&fa->parts[0]; |
265 | else | 264 | else |
266 | part = fa->parts[part_nr]; | 265 | part = fa->parts[part_nr]; |
267 | index = index_inside_part(fa, element_nr); | ||
268 | return &part->elements[index_inside_part(fa, element_nr)]; | 266 | return &part->elements[index_inside_part(fa, element_nr)]; |
269 | } | 267 | } |
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index a295e404e908..0d475d8167bf 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c | |||
@@ -314,6 +314,7 @@ void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl, | |||
314 | miter->__sg = sgl; | 314 | miter->__sg = sgl; |
315 | miter->__nents = nents; | 315 | miter->__nents = nents; |
316 | miter->__offset = 0; | 316 | miter->__offset = 0; |
317 | WARN_ON(!(flags & (SG_MITER_TO_SG | SG_MITER_FROM_SG))); | ||
317 | miter->__flags = flags; | 318 | miter->__flags = flags; |
318 | } | 319 | } |
319 | EXPORT_SYMBOL(sg_miter_start); | 320 | EXPORT_SYMBOL(sg_miter_start); |
@@ -394,6 +395,9 @@ void sg_miter_stop(struct sg_mapping_iter *miter) | |||
394 | if (miter->addr) { | 395 | if (miter->addr) { |
395 | miter->__offset += miter->consumed; | 396 | miter->__offset += miter->consumed; |
396 | 397 | ||
398 | if (miter->__flags & SG_MITER_TO_SG) | ||
399 | flush_kernel_dcache_page(miter->page); | ||
400 | |||
397 | if (miter->__flags & SG_MITER_ATOMIC) { | 401 | if (miter->__flags & SG_MITER_ATOMIC) { |
398 | WARN_ON(!irqs_disabled()); | 402 | WARN_ON(!irqs_disabled()); |
399 | kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ); | 403 | kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ); |
@@ -426,8 +430,14 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, | |||
426 | unsigned int offset = 0; | 430 | unsigned int offset = 0; |
427 | struct sg_mapping_iter miter; | 431 | struct sg_mapping_iter miter; |
428 | unsigned long flags; | 432 | unsigned long flags; |
433 | unsigned int sg_flags = SG_MITER_ATOMIC; | ||
434 | |||
435 | if (to_buffer) | ||
436 | sg_flags |= SG_MITER_FROM_SG; | ||
437 | else | ||
438 | sg_flags |= SG_MITER_TO_SG; | ||
429 | 439 | ||
430 | sg_miter_start(&miter, sgl, nents, SG_MITER_ATOMIC); | 440 | sg_miter_start(&miter, sgl, nents, sg_flags); |
431 | 441 | ||
432 | local_irq_save(flags); | 442 | local_irq_save(flags); |
433 | 443 | ||
@@ -438,10 +448,8 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, | |||
438 | 448 | ||
439 | if (to_buffer) | 449 | if (to_buffer) |
440 | memcpy(buf + offset, miter.addr, len); | 450 | memcpy(buf + offset, miter.addr, len); |
441 | else { | 451 | else |
442 | memcpy(miter.addr, buf + offset, len); | 452 | memcpy(miter.addr, buf + offset, len); |
443 | flush_kernel_dcache_page(miter.page); | ||
444 | } | ||
445 | 453 | ||
446 | offset += len; | 454 | offset += len; |
447 | } | 455 | } |