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;
|
goto error_kmem;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_init(&dsk->openers_lock);
|
|
||||||
|
|
||||||
dsk->path = kstrdup(path, GFP_KERNEL);
|
dsk->path = kstrdup(path, GFP_KERNEL);
|
||||||
if (!dsk->path) {
|
if (!dsk->path) {
|
||||||
result = -ENOMEM;
|
result = -ENOMEM;
|
||||||
|
@ -16,10 +16,6 @@ struct cas_exp_obj;
|
|||||||
struct cas_disk {
|
struct cas_disk {
|
||||||
char *path;
|
char *path;
|
||||||
|
|
||||||
struct mutex openers_lock;
|
|
||||||
unsigned int openers;
|
|
||||||
bool claimed;
|
|
||||||
|
|
||||||
struct block_device *bd;
|
struct block_device *bd;
|
||||||
|
|
||||||
int gd_flags;
|
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)
|
static int _cas_exp_obj_open(struct block_device *bdev, fmode_t mode)
|
||||||
{
|
{
|
||||||
struct cas_disk *dsk = bdev->bd_disk->private_data;
|
struct cas_disk *dsk = bdev->bd_disk->private_data;
|
||||||
|
struct cas_exp_obj *exp_obj = dsk->exp_obj;
|
||||||
int result = -ENAVAIL;
|
int result = -ENAVAIL;
|
||||||
|
|
||||||
mutex_lock(&dsk->openers_lock);
|
mutex_lock(&exp_obj->openers_lock);
|
||||||
|
|
||||||
if (!dsk->claimed) {
|
if (!exp_obj->claimed) {
|
||||||
if (unlikely(dsk->openers == UINT_MAX)) {
|
if (unlikely(exp_obj->openers == UINT_MAX)) {
|
||||||
result = -EBUSY;
|
result = -EBUSY;
|
||||||
} else {
|
} else {
|
||||||
dsk->openers++;
|
exp_obj->openers++;
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&dsk->openers_lock);
|
mutex_unlock(&dsk->exp_obj->openers_lock);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _cas_exp_obj_close(struct gendisk *gd, fmode_t mode)
|
static void _cas_exp_obj_close(struct gendisk *gd, fmode_t mode)
|
||||||
{
|
{
|
||||||
struct cas_disk *dsk = gd->private_data;
|
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);
|
mutex_lock(&exp_obj->openers_lock);
|
||||||
dsk->openers--;
|
exp_obj->openers--;
|
||||||
mutex_unlock(&dsk->openers_lock);
|
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;
|
exp_obj = dsk->exp_obj;
|
||||||
|
|
||||||
|
mutex_init(&exp_obj->openers_lock);
|
||||||
|
|
||||||
exp_obj->dev_name = kstrdup(dev_name, GFP_KERNEL);
|
exp_obj->dev_name = kstrdup(dev_name, GFP_KERNEL);
|
||||||
if (!exp_obj->dev_name) {
|
if (!exp_obj->dev_name) {
|
||||||
result = -ENOMEM;
|
result = -ENOMEM;
|
||||||
@ -562,25 +566,29 @@ int cas_exp_obj_lock(struct cas_disk *dsk)
|
|||||||
|
|
||||||
exp_obj = dsk->exp_obj;
|
exp_obj = dsk->exp_obj;
|
||||||
|
|
||||||
mutex_lock(&dsk->openers_lock);
|
mutex_lock(&exp_obj->openers_lock);
|
||||||
|
|
||||||
if (dsk->openers == 0) {
|
if (exp_obj->openers == 0) {
|
||||||
dsk->claimed = true;
|
exp_obj->claimed = true;
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&dsk->openers_lock);
|
mutex_unlock(&exp_obj->openers_lock);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cas_exp_obj_unlock(struct cas_disk *dsk)
|
int cas_exp_obj_unlock(struct cas_disk *dsk)
|
||||||
{
|
{
|
||||||
|
struct cas_exp_obj *exp_obj;
|
||||||
|
|
||||||
BUG_ON(!dsk);
|
BUG_ON(!dsk);
|
||||||
CAS_DEBUG_DISK_TRACE(dsk);
|
CAS_DEBUG_DISK_TRACE(dsk);
|
||||||
|
|
||||||
mutex_lock(&dsk->openers_lock);
|
exp_obj = dsk->exp_obj;
|
||||||
dsk->claimed = false;
|
|
||||||
mutex_unlock(&dsk->openers_lock);
|
mutex_lock(&exp_obj->openers_lock);
|
||||||
|
exp_obj->claimed = false;
|
||||||
|
mutex_unlock(&exp_obj->openers_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,10 @@ struct cas_exp_obj {
|
|||||||
|
|
||||||
const char *dev_name;
|
const char *dev_name;
|
||||||
|
|
||||||
|
struct mutex openers_lock;
|
||||||
|
unsigned int openers;
|
||||||
|
bool claimed;
|
||||||
|
|
||||||
atomic_t pt_ios;
|
atomic_t pt_ios;
|
||||||
atomic_t *pending_rqs;
|
atomic_t *pending_rqs;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user