diff options
Diffstat (limited to 'drivers/block/drbd/drbd_bitmap.c')
| -rw-r--r-- | drivers/block/drbd/drbd_bitmap.c | 11 | 
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index b61057e7788..3390716898d 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c @@ -26,6 +26,7 @@  #include <linux/vmalloc.h>  #include <linux/string.h>  #include <linux/drbd.h> +#include <linux/slab.h>  #include <asm/kmap_types.h>  #include "drbd_int.h" @@ -66,7 +67,7 @@ struct drbd_bitmap {  	size_t   bm_words;  	size_t   bm_number_of_pages;  	sector_t bm_dev_capacity; -	struct semaphore bm_change; /* serializes resize operations */ +	struct mutex bm_change; /* serializes resize operations */  	atomic_t bm_async_io;  	wait_queue_head_t bm_io_wait; @@ -114,7 +115,7 @@ void drbd_bm_lock(struct drbd_conf *mdev, char *why)  		return;  	} -	trylock_failed = down_trylock(&b->bm_change); +	trylock_failed = !mutex_trylock(&b->bm_change);  	if (trylock_failed) {  		dev_warn(DEV, "%s going to '%s' but bitmap already locked for '%s' by %s\n", @@ -125,7 +126,7 @@ void drbd_bm_lock(struct drbd_conf *mdev, char *why)  		    b->bm_task == mdev->receiver.task ? "receiver" :  		    b->bm_task == mdev->asender.task  ? "asender"  :  		    b->bm_task == mdev->worker.task   ? "worker"   : "?"); -		down(&b->bm_change); +		mutex_lock(&b->bm_change);  	}  	if (__test_and_set_bit(BM_LOCKED, &b->bm_flags))  		dev_err(DEV, "FIXME bitmap already locked in bm_lock\n"); @@ -147,7 +148,7 @@ void drbd_bm_unlock(struct drbd_conf *mdev)  	b->bm_why  = NULL;  	b->bm_task = NULL; -	up(&b->bm_change); +	mutex_unlock(&b->bm_change);  }  /* word offset to long pointer */ @@ -295,7 +296,7 @@ int drbd_bm_init(struct drbd_conf *mdev)  	if (!b)  		return -ENOMEM;  	spin_lock_init(&b->bm_lock); -	init_MUTEX(&b->bm_change); +	mutex_init(&b->bm_change);  	init_waitqueue_head(&b->bm_io_wait);  	mdev->bitmap = b;  |