Move openers_lock to struct cas_exp_obj
Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
This commit is contained in:
parent
67ed36ae0e
commit
72cf855355
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user