} else
                BUG();
 
-       seb = kmalloc(sizeof(struct ubi_scan_leb), GFP_KERNEL);
+       seb = kmem_cache_alloc(si->scan_leb_slab, GFP_KERNEL);
        if (!seb)
                return -ENOMEM;
 
 
        dbg_bld("add to corrupted: PEB %d, EC %d", pnum, ec);
 
-       seb = kmalloc(sizeof(struct ubi_scan_leb), GFP_KERNEL);
+       seb = kmem_cache_alloc(si->scan_leb_slab, GFP_KERNEL);
        if (!seb)
                return -ENOMEM;
 
        if (err)
                return err;
 
-       seb = kmalloc(sizeof(struct ubi_scan_leb), GFP_KERNEL);
+       seb = kmem_cache_alloc(si->scan_leb_slab, GFP_KERNEL);
        if (!seb)
                return -ENOMEM;
 
        si->volumes = RB_ROOT;
 
        err = -ENOMEM;
+       si->scan_leb_slab = kmem_cache_create("ubi_scan_leb_slab",
+                                             sizeof(struct ubi_scan_leb),
+                                             0, 0, NULL);
+       if (!si->scan_leb_slab)
+               goto out_si;
+
        ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
        if (!ech)
-               goto out_si;
+               goto out_slab;
 
        vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
        if (!vidh)
        ubi_free_vid_hdr(ubi, vidh);
 out_ech:
        kfree(ech);
+out_slab:
+       kmem_cache_destroy(si->scan_leb_slab);
 out_si:
        ubi_scan_destroy_si(si);
        return ERR_PTR(err);
 /**
  * destroy_sv - free the scanning volume information
  * @sv: scanning volume information
+ * @si: scanning information
  *
  * This function destroys the volume RB-tree (@sv->root) and the scanning
  * volume information.
  */
-static void destroy_sv(struct ubi_scan_volume *sv)
+static void destroy_sv(struct ubi_scan_info *si, struct ubi_scan_volume *sv)
 {
        struct ubi_scan_leb *seb;
        struct rb_node *this = sv->root.rb_node;
                                        this->rb_right = NULL;
                        }
 
-                       kfree(seb);
+                       kmem_cache_free(si->scan_leb_slab, seb);
                }
        }
        kfree(sv);
 
        list_for_each_entry_safe(seb, seb_tmp, &si->alien, u.list) {
                list_del(&seb->u.list);
-               kfree(seb);
+               kmem_cache_free(si->scan_leb_slab, seb);
        }
        list_for_each_entry_safe(seb, seb_tmp, &si->erase, u.list) {
                list_del(&seb->u.list);
-               kfree(seb);
+               kmem_cache_free(si->scan_leb_slab, seb);
        }
        list_for_each_entry_safe(seb, seb_tmp, &si->corr, u.list) {
                list_del(&seb->u.list);
-               kfree(seb);
+               kmem_cache_free(si->scan_leb_slab, seb);
        }
        list_for_each_entry_safe(seb, seb_tmp, &si->free, u.list) {
                list_del(&seb->u.list);
-               kfree(seb);
+               kmem_cache_free(si->scan_leb_slab, seb);
        }
 
        /* Destroy the volume RB-tree */
                                        rb->rb_right = NULL;
                        }
 
-                       destroy_sv(sv);
+                       destroy_sv(si, sv);
                }
        }
 
+       kmem_cache_destroy(si->scan_leb_slab);
        kfree(si);
 }