diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-08-11 08:19:09 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-08-11 08:19:09 -0400 |
commit | 89034bc2c7b839702c00a704e79d112737f98be0 (patch) | |
tree | e65b1f3d4c751baa840efc81bc4734f089379eb3 /lib/scatterlist.c | |
parent | fb82ad719831db58e9baa4c67015aae3fe27e7e3 (diff) | |
parent | 85dfd81dc57e8183a277ddd7a56aa65c96f3f487 (diff) |
Merge branch 'linus' into tracing/core
Conflicts:
kernel/trace/trace_events_filter.c
We use the tracing/core version.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'lib/scatterlist.c')
-rw-r--r-- | lib/scatterlist.c | 16 |
1 files changed, 12 insertions, 4 deletions
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 | } |