struct r5conf *conf = sh->raid_conf;
        int level = conf->level;
        struct raid5_percpu *percpu;
-       unsigned long cpu;
 
-       cpu = get_cpu();
-       percpu = per_cpu_ptr(conf->percpu, cpu);
+       local_lock(&conf->percpu->lock);
+       percpu = this_cpu_ptr(conf->percpu);
        if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) {
                ops_run_biofill(sh);
                overlap_clear++;
                        BUG();
        }
 
-       if (overlap_clear && !sh->batch_head)
+       if (overlap_clear && !sh->batch_head) {
                for (i = disks; i--; ) {
                        struct r5dev *dev = &sh->dev[i];
                        if (test_and_clear_bit(R5_Overlap, &dev->flags))
                                wake_up(&sh->raid_conf->wait_for_overlap);
                }
-       put_cpu();
+       }
+       local_unlock(&conf->percpu->lock);
 }
 
 static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh)
                return -ENOMEM;
        }
 
+       local_lock_init(&percpu->lock);
        return 0;
 }
 
 
 
 #include <linux/raid/xor.h>
 #include <linux/dmaengine.h>
+#include <linux/local_lock.h>
 
 /*
  *
                                             * lists and performing address
                                             * conversions
                                             */
-               int scribble_obj_size;
+               int             scribble_obj_size;
+               local_lock_t    lock;
        } __percpu *percpu;
        int scribble_disks;
        int scribble_sectors;