Commit fa362045 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

ublk: simplify ublk_ch_open and ublk_ch_release

fops->open and fops->release are always paired.  Use simple atomic bit
ops ot indicate if the device is opened instead of a count that can
only be 0 and 1 and a useless cmpxchg loop in ublk_ch_release.

Also don't bother clearing file->private_data is the file is about to
be freed anyway.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20220721130916.1869719-5-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 49d686cc
......@@ -125,7 +125,8 @@ struct ublk_device {
struct cdev cdev;
struct device cdev_dev;
atomic_t ch_open_cnt;
#define UB_STATE_OPEN (1 << 0)
unsigned long state;
int ub_number;
struct mutex mutex;
......@@ -647,21 +648,17 @@ static int ublk_ch_open(struct inode *inode, struct file *filp)
struct ublk_device *ub = container_of(inode->i_cdev,
struct ublk_device, cdev);
if (atomic_cmpxchg(&ub->ch_open_cnt, 0, 1) == 0) {
filp->private_data = ub;
return 0;
}
return -EBUSY;
if (test_and_set_bit(UB_STATE_OPEN, &ub->state))
return -EBUSY;
filp->private_data = ub;
return 0;
}
static int ublk_ch_release(struct inode *inode, struct file *filp)
{
struct ublk_device *ub = filp->private_data;
while (atomic_cmpxchg(&ub->ch_open_cnt, 1, 0) != 1)
cpu_relax();
filp->private_data = NULL;
clear_bit(UB_STATE_OPEN, &ub->state);
return 0;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment