ublk: simplify ublk_ch_open and ublk_ch_release
authorChristoph Hellwig <hch@lst.de>
Thu, 21 Jul 2022 13:09:12 +0000 (15:09 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 21 Jul 2022 16:52:12 +0000 (10:52 -0600)
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>
drivers/block/ublk_drv.c

index deabcb2..1f7bbbc 100644 (file)
@@ -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;
 }