Commit e568b360 authored by FUJITA Tomonori's avatar FUJITA Tomonori Committed by Greg Kroah-Hartman

sg: disable interrupts inside sg_copy_buffer

This is the backport of the upstream commit 50bed2e2

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>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 2e8e9ac3
...@@ -312,8 +312,9 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, ...@@ -312,8 +312,9 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
struct scatterlist *sg; struct scatterlist *sg;
size_t buf_off = 0; size_t buf_off = 0;
int i; int i;
unsigned long flags;
WARN_ON(!irqs_disabled()); local_irq_save(flags);
for_each_sg(sgl, sg, nents, i) { for_each_sg(sgl, sg, nents, i) {
struct page *page; struct page *page;
...@@ -358,6 +359,8 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, ...@@ -358,6 +359,8 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
break; break;
} }
local_irq_restore(flags);
return buf_off; return buf_off;
} }
......
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