[patch 26/71] sg: disable interrupts inside sg_copy_buffer

From: Greg KH
Date: Mon Oct 06 2008 - 20:50:00 EST


2.6.26-stable review patch. If anyone has any objections, please let us
know.

------------------
From: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx>

This is the backport of the upstream commit 50bed2e2862a8f3a4f7d683d0d27292e71ef18b9

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@xxxxxxxxxxxxx>
Signed-off-by: Jens Axboe <jens.axboe@xxxxxxxxxx>
Signed-off-by: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>

---
lib/scatterlist.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

--- a/lib/scatterlist.c
+++ b/lib/scatterlist.c
@@ -312,8 +312,9 @@ static size_t sg_copy_buffer(struct scat
struct scatterlist *sg;
size_t buf_off = 0;
int i;
+ unsigned long flags;

- WARN_ON(!irqs_disabled());
+ local_irq_save(flags);

for_each_sg(sgl, sg, nents, i) {
struct page *page;
@@ -358,6 +359,8 @@ static size_t sg_copy_buffer(struct scat
break;
}

+ local_irq_restore(flags);
+
return buf_off;
}


--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/