X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmd%2Fbitmap.c;h=eae4473eadde2a359a7e00e05b8bf4a5387140cc;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=f8ffaee20ff8cdea3e34c50b158452a2935598fd;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index f8ffaee20..eae4473ea 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -89,6 +89,16 @@ int bitmap_active(struct bitmap *bitmap) } #define WRITE_POOL_SIZE 256 +/* mempool for queueing pending writes on the bitmap file */ +static void *write_pool_alloc(gfp_t gfp_flags, void *data) +{ + return kmalloc(sizeof(struct page_list), gfp_flags); +} + +static void write_pool_free(void *ptr, void *data) +{ + kfree(ptr); +} /* * just a placeholder - calls kmalloc for bitmap pages @@ -546,7 +556,7 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits, unsigned long flags; spin_lock_irqsave(&bitmap->lock, flags); - if (!bitmap->sb_page) { /* can't set the state */ + if (!bitmap || !bitmap->sb_page) { /* can't set the state */ spin_unlock_irqrestore(&bitmap->lock, flags); return; } @@ -1299,7 +1309,7 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect case 1: *bmc = 2; } - BUG_ON((*bmc & COUNTER_MAX) == COUNTER_MAX); + if ((*bmc & COUNTER_MAX) == COUNTER_MAX) BUG(); (*bmc)++; spin_unlock_irq(&bitmap->lock); @@ -1554,8 +1564,8 @@ int bitmap_create(mddev_t *mddev) spin_lock_init(&bitmap->write_lock); INIT_LIST_HEAD(&bitmap->complete_pages); init_waitqueue_head(&bitmap->write_wait); - bitmap->write_pool = mempool_create_kmalloc_pool(WRITE_POOL_SIZE, - sizeof(struct page_list)); + bitmap->write_pool = mempool_create(WRITE_POOL_SIZE, write_pool_alloc, + write_pool_free, NULL); err = -ENOMEM; if (!bitmap->write_pool) goto error;