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

View File

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

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

View File

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