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: Christoph Hellwig <hch@lst.de> Reviewed-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20220721130916.1869719-5-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
committed by
Jens Axboe
parent
49d686ccee
commit
fa36204556
@@ -125,7 +125,8 @@ struct ublk_device {
|
|||||||
struct cdev cdev;
|
struct cdev cdev;
|
||||||
struct device cdev_dev;
|
struct device cdev_dev;
|
||||||
|
|
||||||
atomic_t ch_open_cnt;
|
#define UB_STATE_OPEN (1 << 0)
|
||||||
|
unsigned long state;
|
||||||
int ub_number;
|
int ub_number;
|
||||||
|
|
||||||
struct mutex mutex;
|
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 *ub = container_of(inode->i_cdev,
|
||||||
struct ublk_device, cdev);
|
struct ublk_device, cdev);
|
||||||
|
|
||||||
if (atomic_cmpxchg(&ub->ch_open_cnt, 0, 1) == 0) {
|
if (test_and_set_bit(UB_STATE_OPEN, &ub->state))
|
||||||
|
return -EBUSY;
|
||||||
filp->private_data = ub;
|
filp->private_data = ub;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ublk_ch_release(struct inode *inode, struct file *filp)
|
static int ublk_ch_release(struct inode *inode, struct file *filp)
|
||||||
{
|
{
|
||||||
struct ublk_device *ub = filp->private_data;
|
struct ublk_device *ub = filp->private_data;
|
||||||
|
|
||||||
while (atomic_cmpxchg(&ub->ch_open_cnt, 1, 0) != 1)
|
clear_bit(UB_STATE_OPEN, &ub->state);
|
||||||
cpu_relax();
|
|
||||||
|
|
||||||
filp->private_data = NULL;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user