Commit 50bed2e2 authored by FUJITA Tomonori's avatar FUJITA Tomonori Committed by Jens Axboe

sg: disable interrupts inside sg_copy_buffer

The callers of sg_copy_buffer must disable interrupts before calling
it (since it uses kmap_atomic). Some callers use it on
interrupt-disabled code but some need to take the trouble to disable
interrupts just for this. No wonder they forget about it and we hit a
bug like:

http://bugzilla.kernel.org/show_bug.cgi?id=11529

James said that it might be better to disable interrupts inside the
function rather than risk the callers getting it wrong.
Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 2dc75d3c
...@@ -422,9 +422,12 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, ...@@ -422,9 +422,12 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
{ {
unsigned int offset = 0; unsigned int offset = 0;
struct sg_mapping_iter miter; struct sg_mapping_iter miter;
unsigned long flags;
sg_miter_start(&miter, sgl, nents, SG_MITER_ATOMIC); sg_miter_start(&miter, sgl, nents, SG_MITER_ATOMIC);
local_irq_save(flags);
while (sg_miter_next(&miter) && offset < buflen) { while (sg_miter_next(&miter) && offset < buflen) {
unsigned int len; unsigned int len;
...@@ -442,6 +445,7 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, ...@@ -442,6 +445,7 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
sg_miter_stop(&miter); sg_miter_stop(&miter);
local_irq_restore(flags);
return offset; return offset;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment