diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2008-09-11 18:35:39 +0200 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-09-11 18:35:39 +0200 |
commit | 50bed2e2862a8f3a4f7d683d0d27292e71ef18b9 (patch) | |
tree | 4de32d8495a5b79aae38948871abc65bb58d9d10 /lib/scatterlist.c | |
parent | 2dc75d3c3b49c64fd26b4832a7efb75546cb3fc5 (diff) | |
download | lwn-50bed2e2862a8f3a4f7d683d0d27292e71ef18b9.tar.gz lwn-50bed2e2862a8f3a4f7d683d0d27292e71ef18b9.zip |
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: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'lib/scatterlist.c')
-rw-r--r-- | lib/scatterlist.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 876ba6d5b670..8d2688ff1352 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -422,9 +422,12 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, { unsigned int offset = 0; struct sg_mapping_iter miter; + unsigned long flags; sg_miter_start(&miter, sgl, nents, SG_MITER_ATOMIC); + local_irq_save(flags); + while (sg_miter_next(&miter) && offset < buflen) { unsigned int len; @@ -442,6 +445,7 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, sg_miter_stop(&miter); + local_irq_restore(flags); return offset; } |