diff --git a/modules/cas_cache/disk.c b/modules/cas_cache/disk.c index 9ec7b4a..8ca6056 100644 --- a/modules/cas_cache/disk.c +++ b/modules/cas_cache/disk.c @@ -72,8 +72,6 @@ struct cas_disk *cas_disk_open(const char *path) goto error_kmem; } - mutex_init(&dsk->openers_lock); - dsk->path = kstrdup(path, GFP_KERNEL); if (!dsk->path) { result = -ENOMEM; diff --git a/modules/cas_cache/disk.h b/modules/cas_cache/disk.h index 80c7e3a..7ba1257 100644 --- a/modules/cas_cache/disk.h +++ b/modules/cas_cache/disk.h @@ -16,10 +16,6 @@ struct cas_exp_obj; struct cas_disk { char *path; - struct mutex openers_lock; - unsigned int openers; - bool claimed; - struct block_device *bd; int gd_flags; diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index 694182e..c08b70f 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -234,32 +234,34 @@ static void _cas_exp_obj_clear_dev_t(struct cas_disk *dsk) static int _cas_exp_obj_open(struct block_device *bdev, fmode_t mode) { struct cas_disk *dsk = bdev->bd_disk->private_data; + struct cas_exp_obj *exp_obj = dsk->exp_obj; int result = -ENAVAIL; - mutex_lock(&dsk->openers_lock); + mutex_lock(&exp_obj->openers_lock); - if (!dsk->claimed) { - if (unlikely(dsk->openers == UINT_MAX)) { + if (!exp_obj->claimed) { + if (unlikely(exp_obj->openers == UINT_MAX)) { result = -EBUSY; } else { - dsk->openers++; + exp_obj->openers++; result = 0; } } - mutex_unlock(&dsk->openers_lock); + mutex_unlock(&dsk->exp_obj->openers_lock); return result; } static void _cas_exp_obj_close(struct gendisk *gd, fmode_t mode) { struct cas_disk *dsk = gd->private_data; + struct cas_exp_obj *exp_obj = dsk->exp_obj; - BUG_ON(dsk->openers == 0); + BUG_ON(exp_obj->openers == 0); - mutex_lock(&dsk->openers_lock); - dsk->openers--; - mutex_unlock(&dsk->openers_lock); + mutex_lock(&exp_obj->openers_lock); + exp_obj->openers--; + mutex_unlock(&exp_obj->openers_lock); } @@ -369,6 +371,8 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, exp_obj = dsk->exp_obj; + mutex_init(&exp_obj->openers_lock); + exp_obj->dev_name = kstrdup(dev_name, GFP_KERNEL); if (!exp_obj->dev_name) { result = -ENOMEM; @@ -562,25 +566,29 @@ int cas_exp_obj_lock(struct cas_disk *dsk) exp_obj = dsk->exp_obj; - mutex_lock(&dsk->openers_lock); + mutex_lock(&exp_obj->openers_lock); - if (dsk->openers == 0) { - dsk->claimed = true; + if (exp_obj->openers == 0) { + exp_obj->claimed = true; result = 0; } - mutex_unlock(&dsk->openers_lock); + mutex_unlock(&exp_obj->openers_lock); return result; } int cas_exp_obj_unlock(struct cas_disk *dsk) { + struct cas_exp_obj *exp_obj; + BUG_ON(!dsk); CAS_DEBUG_DISK_TRACE(dsk); - mutex_lock(&dsk->openers_lock); - dsk->claimed = false; - mutex_unlock(&dsk->openers_lock); + exp_obj = dsk->exp_obj; + + mutex_lock(&exp_obj->openers_lock); + exp_obj->claimed = false; + mutex_unlock(&exp_obj->openers_lock); return 0; } diff --git a/modules/cas_cache/exp_obj.h b/modules/cas_cache/exp_obj.h index cf2c24b..2a280fc 100644 --- a/modules/cas_cache/exp_obj.h +++ b/modules/cas_cache/exp_obj.h @@ -39,6 +39,10 @@ struct cas_exp_obj { const char *dev_name; + struct mutex openers_lock; + unsigned int openers; + bool claimed; + atomic_t pt_ios; atomic_t *pending_rqs; };