All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefani Seibold <stefani@seibold.net>
To: linux-kernel <linux-kernel@vger.kernel.org>
Cc: Greg KH <gregkh@linuxfoundation.org>,
	oneukum@suse.de, alan@lxorguk.ukuu.org.uk,
	linux-usb@vger.kernel.org, Alan Stern <stern@rowland.harvard.edu>
Subject: RFC: remove usb_device pointer from usb_skeleton.c
Date: Fri, 08 Jun 2012 09:18:55 +0200	[thread overview]
Message-ID: <1339139935.16819.5.camel@wall-e> (raw)
In-Reply-To: <1339098621.13885.13.camel@wall-e>

Hi,

what do you think about this solution for removing the usb_device
pointer from the struct usb_skel in the usb_skeleton driver?

diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c
index 1e36782..af698b3 100644
--- a/drivers/usb/usb-skeleton.c
+++ b/drivers/usb/usb-skeleton.c
@@ -47,7 +47,6 @@ MODULE_DEVICE_TABLE(usb, skel_table);
 
 /* Structure to hold all of our device specific stuff */
 struct usb_skel {
-	struct usb_device	*udev;			/* the usb device for this device */
 	struct usb_interface	*interface;		/* the interface for this device */
 	struct semaphore	limit_sem;		/* limiting the number of writes in progress */
 	struct usb_anchor	submitted;		/* in case we need to retract our submissions */
@@ -61,6 +60,7 @@ struct usb_skel {
 	int			errors;			/* the last request tanked */
 	bool			ongoing_read;		/* a read is going on */
 	bool			in_use;			/* in use flag */
+	bool			connected;		/* connected flag */
 	spinlock_t		err_lock;		/* lock for errors */
 	struct kref		kref;
 	struct mutex		io_mutex;		/* synchronize I/O with disconnect */
@@ -73,9 +73,12 @@ static struct usb_driver skel_driver;
 static void skel_delete(struct kref *kref)
 {
 	struct usb_skel *dev = to_skel_dev(kref);
+	struct usb_interface *interface = dev->interface;
+	struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface));
 
 	usb_free_urb(dev->bulk_in_urb);
-	usb_put_dev(dev->udev);
+	usb_put_dev(udev);
+	usb_put_intf(interface);
 	kfree(dev->bulk_in_buffer);
 	kfree(dev);
 }
@@ -128,7 +131,7 @@ static int skel_release(struct inode *inode, struct file *file)
 
 	/* allow the device to be autosuspended */
 	mutex_lock(&dev->io_mutex);
-	if (dev->interface)
+	if (dev->connected)
 		usb_autopm_put_interface(dev->interface);
 	dev->in_use = false;
 	mutex_unlock(&dev->io_mutex);
@@ -155,7 +158,7 @@ static int skel_fsync(struct file *file, loff_t start, loff_t end, int datasync)
 
 	/* wait for io to stop */
 	mutex_lock(&dev->io_mutex);
-	if (!dev->interface) {		/* disconnect() was called */
+	if (!dev->connected) {		/* disconnect() was called */
 		retval = -ENODEV;
 		goto exit;
 	}
@@ -206,11 +209,12 @@ static void skel_read_bulk_callback(struct urb *urb)
 static int skel_do_read_io(struct usb_skel *dev, size_t count)
 {
 	int retval;
+	struct usb_device *udev = usb_get_dev(interface_to_usbdev(dev->interface));
 
 	/* prepare a read */
 	usb_fill_bulk_urb(dev->bulk_in_urb,
-			dev->udev,
-			usb_rcvbulkpipe(dev->udev,
+			udev,
+			usb_rcvbulkpipe(udev,
 				dev->bulk_in_endpointAddr),
 			dev->bulk_in_buffer,
 			min(dev->bulk_in_size, count),
@@ -258,7 +262,7 @@ static ssize_t skel_read(struct file *file, char *buffer, size_t count,
 			return retval;
 	}
 
-	if (!dev->interface) {		/* disconnect() was called */
+	if (!dev->connected) {		/* disconnect() was called */
 		retval = -ENODEV;
 		goto exit;
 	}
@@ -391,6 +395,7 @@ static ssize_t skel_write(struct file *file, const char *user_buffer,
 	struct urb *urb = NULL;
 	char *buf = NULL;
 	size_t writesize = min(count, (size_t)MAX_TRANSFER);
+	struct usb_device *udev = usb_get_dev(interface_to_usbdev(dev->interface));
 
 	/* verify that we actually have some data to write */
 	if (!count)
@@ -427,7 +432,7 @@ static ssize_t skel_write(struct file *file, const char *user_buffer,
 		goto error;
 	}
 
-	buf = usb_alloc_coherent(dev->udev, writesize, GFP_KERNEL,
+	buf = usb_alloc_coherent(udev, writesize, GFP_KERNEL,
 				 &urb->transfer_dma);
 	if (!buf) {
 		retval = -ENOMEM;
@@ -441,15 +446,15 @@ static ssize_t skel_write(struct file *file, const char *user_buffer,
 
 	/* this lock makes sure we don't submit URBs to gone devices */
 	mutex_lock(&dev->io_mutex);
-	if (!dev->interface) {		/* disconnect() was called */
+	if (!dev->connected) {		/* disconnect() was called */
 		mutex_unlock(&dev->io_mutex);
 		retval = -ENODEV;
 		goto error;
 	}
 
 	/* initialize the urb properly */
-	usb_fill_bulk_urb(urb, dev->udev,
-			  usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr),
+	usb_fill_bulk_urb(urb, udev,
+			  usb_sndbulkpipe(udev, dev->bulk_out_endpointAddr),
 			  buf, writesize, skel_write_bulk_callback, dev);
 	urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 	usb_anchor_urb(urb, &dev->submitted);
@@ -477,7 +482,7 @@ error_unanchor:
 	usb_unanchor_urb(urb);
 error:
 	if (urb) {
-		usb_free_coherent(dev->udev, writesize, buf, urb->transfer_dma);
+		usb_free_coherent(udev, writesize, buf, urb->transfer_dma);
 		usb_free_urb(urb);
 	}
 	up(&dev->limit_sem);
@@ -529,9 +534,10 @@ static int skel_probe(struct usb_interface *interface,
 	init_usb_anchor(&dev->submitted);
 	init_completion(&dev->bulk_in_completion);
 
-	dev->udev = usb_get_dev(interface_to_usbdev(interface));
-	dev->interface = interface;
+	usb_get_dev(interface_to_usbdev(interface));
+	dev->interface = usb_get_intf(interface);
 	dev->in_use = false;
+	dev->connected = true;
 
 	/* set up the endpoint information */
 	/* use only the first bulk-in and bulk-out endpoints */
@@ -610,7 +616,7 @@ static void skel_disconnect(struct usb_interface *interface)
 
 	/* prevent more I/O from starting */
 	mutex_lock(&dev->io_mutex);
-	dev->interface = NULL;
+	dev->connected = false;
 	mutex_unlock(&dev->io_mutex);
 
 	usb_kill_anchored_urbs(&dev->submitted);


The connected flag could be also replaced by a "intf->condition ==
USB_INTERFACE_BOUND", which can be hided by a macro.

Regards,
Stefani



  parent reply	other threads:[~2012-06-08  7:18 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-06 16:27 [PATCH] fix usb skeleton driver stefani
2012-06-06 16:27 ` [PATCH 01/11] fix wrong label in skel_open stefani
2012-06-06 18:52   ` Oliver Neukum
2012-06-06 19:59     ` Stefani Seibold
2012-06-06 16:27 ` [PATCH 02/11] code cleanup stefani
2012-06-06 18:57   ` Oliver Neukum
2012-06-06 16:27 ` [PATCH 03/11] remove dead code stefani
2012-06-06 16:27 ` [PATCH 04/11] remove usb_interface pointer stefani
2012-06-06 18:59   ` Oliver Neukum
2012-06-06 20:04     ` Stefani Seibold
2012-06-06 20:19       ` Alan Stern
2012-06-06 22:54   ` Greg KH
2012-06-07  8:07     ` Stefani Seibold
2012-06-07 11:51     ` Stefani Seibold
2012-06-07 14:28       ` Alan Stern
2012-06-07 15:03         ` Stefani Seibold
2012-06-07 15:27           ` Alan Stern
2012-06-07 19:50             ` Stefani Seibold
2012-06-07 20:42               ` Alan Stern
2012-06-08  7:18               ` Stefani Seibold [this message]
2012-06-08  8:28                 ` RFC: remove usb_device pointer from usb_skeleton.c Oliver Neukum
2012-06-08 13:46                 ` Alan Stern
2012-06-06 16:27 ` [PATCH 05/11] remove unneeded forward declaration stefani
2012-06-06 16:27 ` [PATCH 06/11] introduce fsync function stefani
2012-06-06 16:27 ` [PATCH 07/11] remove pr_err() noise in skel_open stefani
2012-06-06 16:27 ` [PATCH 08/11] Handle a non blocking read without blocking stefani
2012-06-06 16:27 ` [PATCH 09/11] Synchronize disconnect() handler with open() and release(), to fix races stefani
2012-06-06 16:27 ` [PATCH 10/11] Introduce single user mode stefani
2012-06-06 16:27 ` [PATCH 11/11] Bump version number and add aditional author stefani
2012-06-06 16:55 ` [PATCH] fix usb skeleton driver Alan Stern
2012-06-06 17:53   ` Stefani Seibold
2012-06-06 18:16     ` Alan Stern
2012-06-06 20:19       ` Stefani Seibold
2012-06-06 20:22         ` Alan Stern
2012-06-07  8:13           ` Stefani Seibold
2012-06-07  7:10         ` Bjørn Mork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1339139935.16819.5.camel@wall-e \
    --to=stefani@seibold.net \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=oneukum@suse.de \
    --cc=stern@rowland.harvard.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.