Move openers_lock to struct cas_exp_obj

Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
This commit is contained in:
Robert Baldyga 2022-09-16 22:09:08 +02:00
parent 67ed36ae0e
commit 72cf855355
4 changed files with 28 additions and 22 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
};