x86, mce: make non Monarch panic message "Fatal machine check" too
[safe/jmp/linux-2.6] / lib / scatterlist.c
index 876ba6d..a295e40 100644 (file)
@@ -347,9 +347,12 @@ bool sg_miter_next(struct sg_mapping_iter *miter)
        sg_miter_stop(miter);
 
        /* get to the next sg if necessary.  __offset is adjusted by stop */
-       if (miter->__offset == miter->__sg->length && --miter->__nents) {
-               miter->__sg = sg_next(miter->__sg);
-               miter->__offset = 0;
+       while (miter->__offset == miter->__sg->length) {
+               if (--miter->__nents) {
+                       miter->__sg = sg_next(miter->__sg);
+                       miter->__offset = 0;
+               } else
+                       return false;
        }
 
        /* map the next page */
@@ -395,7 +398,7 @@ void sg_miter_stop(struct sg_mapping_iter *miter)
                        WARN_ON(!irqs_disabled());
                        kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ);
                } else
-                       kunmap(miter->addr);
+                       kunmap(miter->page);
 
                miter->page = NULL;
                miter->addr = NULL;
@@ -422,9 +425,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 +448,7 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
 
        sg_miter_stop(&miter);
 
+       local_irq_restore(flags);
        return offset;
 }