> + unsigned long flags; > > cache = per_cpu_ptr(bio->bi_pool->cache, get_cpu()); > bio_uninit(bio); > @@ -737,12 +776,15 @@ static inline void bio_put_percpu_cache(struct bio *bio) > cache->free_list = bio; > cache->nr++; > } else { > - put_cpu(); > - bio_free(bio); > - return; > + local_irq_save(flags); > + bio->bi_next = cache->free_list_irq; > + cache->free_list_irq = bio; > + cache->nr_irq++; > + local_irq_restore(flags); > } Ok, I guess with that my previous comments don't make quite as much sense any more. I think youcan keep flags local in the branch here, though.