Convert sg_device::open_cnt into an atomic. Also rename
sg_tablesize into the more descriptive max_sgat_elems.

Signed-off-by: Douglas Gilbert <dgilb...@interlog.com>
---
 drivers/scsi/sg.c | 39 ++++++++++++++++++++-------------------
 1 file changed, 20 insertions(+), 19 deletions(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 97ce84f0c51b..9e9470944fe3 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -162,9 +162,9 @@ struct sg_device { /* holds the state of each scsi generic 
device */
        struct mutex open_rel_lock;     /* held when in open() or release() */
        struct list_head sfds;
        rwlock_t sfd_lock;      /* protect access to sfd list */
-       int sg_tablesize;       /* adapter's max scatter-gather table size */
+       int max_sgat_elems;     /* adapter's max sgat number of elements */
        u32 index;              /* device index number */
-       int open_cnt;           /* count of opens (perhaps < num(sfds) ) */
+       atomic_t open_cnt;      /* count of opens (perhaps < num(sfds) ) */
        unsigned long fdev_bm[1];       /* see SG_FDEV_* defines above */
        struct gendisk *disk;
        struct cdev * cdev;     /* char_dev [sysfs: /sys/cdev/major/sg<n>] */
@@ -276,11 +276,11 @@ sg_wait_open_event(struct sg_device *sdp, bool o_excl)
        int retval = 0;
 
        if (o_excl) {
-               while (sdp->open_cnt > 0) {
+               while (atomic_read(&sdp->open_cnt) > 0) {
                        mutex_unlock(&sdp->open_rel_lock);
                        retval = wait_event_interruptible(sdp->open_wait,
                                        (SG_IS_DETACHING(sdp) ||
-                                        !sdp->open_cnt));
+                                        atomic_read(&sdp->open_cnt) == 0));
                        mutex_lock(&sdp->open_rel_lock);
 
                        if (retval) /* -ERESTARTSYS */
@@ -355,7 +355,7 @@ sg_open(struct inode *inode, struct file *filp)
        mutex_lock(&sdp->open_rel_lock);
        if (op_flags & O_NONBLOCK) {
                if (o_excl) {
-                       if (sdp->open_cnt > 0) {
+                       if (atomic_read(&sdp->open_cnt) > 0) {
                                retval = -EBUSY;
                                goto error_mutex_locked;
                        }
@@ -375,10 +375,10 @@ sg_open(struct inode *inode, struct file *filp)
        if (o_excl)
                set_bit(SG_FDEV_EXCLUDE, sdp->fdev_bm);
 
-       if (sdp->open_cnt < 1) {  /* no existing opens */
+       if (atomic_read(&sdp->open_cnt) < 1) {  /* no existing opens */
                clear_bit(SG_FDEV_LOG_SENSE, sdp->fdev_bm);
                q = sdp->device->request_queue;
-               sdp->sg_tablesize = queue_max_segments(q);
+               sdp->max_sgat_elems = queue_max_segments(q);
        }
        sfp = sg_add_sfp(sdp);
        if (IS_ERR(sfp)) {
@@ -387,10 +387,11 @@ sg_open(struct inode *inode, struct file *filp)
        }
 
        filp->private_data = sfp;
-       sdp->open_cnt++;
+       atomic_inc(&sdp->open_cnt);
        mutex_unlock(&sdp->open_rel_lock);
        SG_LOG(3, sfp, "%s: minor=%d, op_flags=0x%x; %s count prior=%d%s\n",
-              __func__, min_dev, op_flags, "device open", sdp->open_cnt,
+              __func__, min_dev, op_flags, "device open",
+              atomic_read(&sdp->open_cnt),
               ((op_flags & O_NONBLOCK) ? " O_NONBLOCK" : ""));
 
        retval = 0;
@@ -423,20 +424,20 @@ sg_release(struct inode *inode, struct file *filp)
        sfp = filp->private_data;
        sdp = sfp->parentdp;
        SG_LOG(3, sfp, "%s: device open count prior=%d\n", __func__,
-              sdp->open_cnt);
+              atomic_read(&sdp->open_cnt));
        if (!sdp)
                return -ENXIO;
 
        mutex_lock(&sdp->open_rel_lock);
        scsi_autopm_put_device(sdp->device);
        kref_put(&sfp->f_ref, sg_remove_sfp);
-       sdp->open_cnt--;
+       atomic_dec(&sdp->open_cnt);
 
        /* possibly many open()s waiting on exlude clearing, start many;
         * only open(O_EXCL)s wait on 0==open_cnt so only start one */
        if (test_and_clear_bit(SG_FDEV_EXCLUDE, sdp->fdev_bm))
                wake_up_interruptible_all(&sdp->open_wait);
-       else if (sdp->open_cnt == 0)
+       else if (atomic_read(&sdp->open_cnt) == 0)
                wake_up_interruptible(&sdp->open_wait);
        mutex_unlock(&sdp->open_rel_lock);
        return 0;
@@ -1104,7 +1105,7 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned 
long arg)
                read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
                return put_user(val, ip);
        case SG_GET_SG_TABLESIZE:
-               return put_user(sdp->sg_tablesize, ip);
+               return put_user(sdp->max_sgat_elems, ip);
        case SG_SET_RESERVED_SIZE:
                result = get_user(val, ip);
                if (result)
@@ -1563,7 +1564,7 @@ sg_alloc(struct gendisk *disk, struct scsi_device *scsidp)
        init_waitqueue_head(&sdp->open_wait);
        clear_bit(SG_FDEV_DETACHING, sdp->fdev_bm);
        rwlock_init(&sdp->sfd_lock);
-       sdp->sg_tablesize = queue_max_segments(q);
+       sdp->max_sgat_elems = queue_max_segments(q);
        sdp->index = k;
        kref_init(&sdp->d_ref);
        error = 0;
@@ -1958,7 +1959,7 @@ sg_build_indirect(struct sg_scatter_hold *schp, struct 
sg_fd *sfp,
                  int buff_size)
 {
        int ret_sz = 0, i, k, rem_sz, num, mx_sc_elems;
-       int sg_tablesize = sfp->parentdp->sg_tablesize;
+       int max_sgat_elems = sfp->parentdp->max_sgat_elems;
        int blk_size = buff_size, order;
        gfp_t gfp_mask = GFP_ATOMIC | __GFP_COMP | __GFP_NOWARN | __GFP_ZERO;
        struct sg_device *sdp = sfp->parentdp;
@@ -1973,7 +1974,7 @@ sg_build_indirect(struct sg_scatter_hold *schp, struct 
sg_fd *sfp,
               blk_size);
 
        /* N.B. ret_sz carried into this block ... */
-       mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize);
+       mx_sc_elems = sg_build_sgat(schp, sfp, max_sgat_elems);
        if (mx_sc_elems < 0)
                return mx_sc_elems;     /* most likely -ENOMEM */
 
@@ -2662,9 +2663,9 @@ sg_proc_seq_show_debug(struct seq_file *s, void *v)
                                   scsidp->lun,
                                   scsidp->host->hostt->emulated);
                }
-               seq_printf(s, " sg_tablesize=%d excl=%d open_cnt=%d\n",
-                          sdp->sg_tablesize, SG_HAVE_EXCLUDE(sdp),
-                          sdp->open_cnt);
+               seq_printf(s, " max_sgat_elems=%d excl=%d open_cnt=%d\n",
+                          sdp->max_sgat_elems, SG_HAVE_EXCLUDE(sdp),
+                          atomic_read(&sdp->open_cnt));
                sg_proc_debug_helper(s, sdp);
        }
        read_unlock(&sdp->sfd_lock);
-- 
2.17.1

Reply via email to