]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
tcmu: fix multiple uio open/close sequences
authorMike Christie <mchristi@redhat.com>
Fri, 23 Jun 2017 06:18:20 +0000 (01:18 -0500)
committerNicholas Bellinger <nab@linux-iscsi.org>
Fri, 7 Jul 2017 06:11:42 +0000 (23:11 -0700)
If the uio device is open and closed multiple times, the
kref count will be off due to tcmu_release getting called
multiple times for each close. This patch integrates
Wenji Tang's patch to add a kref_get on open that now
matches the kref_put done on tcmu_release and adds
a kref_put in tcmu_destroy_device to match the kref_get
done in succesful tcmu_configure_device calls.

Signed-off-by: Mike Christie <mchristi@redhat.com>
Cc: Wenji Tang <tang.wenji@zte.com.cn>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/target_core_user.c

index d10aa0ac0918e4cb78ba77090c62ecda4c0630d4..1e69b1b32558d14cd6bdc8b39b80c88786dd9c3f 100644 (file)
@@ -1269,6 +1269,7 @@ static int tcmu_open(struct uio_info *info, struct inode *inode)
                return -EBUSY;
 
        udev->inode = inode;
+       kref_get(&udev->kref);
 
        pr_debug("open\n");
 
@@ -1300,7 +1301,7 @@ static int tcmu_release(struct uio_info *info, struct inode *inode)
        clear_bit(TCMU_DEV_BIT_OPEN, &udev->flags);
 
        pr_debug("close\n");
-       /* release ref from configure */
+       /* release ref from open */
        kref_put(&udev->kref, tcmu_dev_kref_release);
        return 0;
 }
@@ -1596,6 +1597,9 @@ static void tcmu_destroy_device(struct se_device *dev)
        tcmu_netlink_event(udev, TCMU_CMD_REMOVED_DEVICE, 0, NULL);
 
        uio_unregister_device(&udev->uio_info);
+
+       /* release ref from configure */
+       kref_put(&udev->kref, tcmu_dev_kref_release);
 }
 
 enum {