aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/virtio_console.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index b70fe96c1ccd..0c8f2aa3074a 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -227,6 +227,41 @@ out:
227 return port; 227 return port;
228} 228}
229 229
230static struct port *find_port_by_devt_in_portdev(struct ports_device *portdev,
231 dev_t dev)
232{
233 struct port *port;
234 unsigned long flags;
235
236 spin_lock_irqsave(&portdev->ports_lock, flags);
237 list_for_each_entry(port, &portdev->ports, list)
238 if (port->cdev.dev == dev)
239 goto out;
240 port = NULL;
241out:
242 spin_unlock_irqrestore(&portdev->ports_lock, flags);
243
244 return port;
245}
246
247static struct port *find_port_by_devt(dev_t dev)
248{
249 struct ports_device *portdev;
250 struct port *port;
251 unsigned long flags;
252
253 spin_lock_irqsave(&pdrvdata_lock, flags);
254 list_for_each_entry(portdev, &pdrvdata.portdevs, list) {
255 port = find_port_by_devt_in_portdev(portdev, dev);
256 if (port)
257 goto out;
258 }
259 port = NULL;
260out:
261 spin_unlock_irqrestore(&pdrvdata_lock, flags);
262 return port;
263}
264
230static struct port *find_port_by_id(struct ports_device *portdev, u32 id) 265static struct port *find_port_by_id(struct ports_device *portdev, u32 id)
231{ 266{
232 struct port *port; 267 struct port *port;
@@ -719,7 +754,7 @@ static int port_fops_open(struct inode *inode, struct file *filp)
719 struct port *port; 754 struct port *port;
720 int ret; 755 int ret;
721 756
722 port = container_of(cdev, struct port, cdev); 757 port = find_port_by_devt(cdev->dev);
723 filp->private_data = port; 758 filp->private_data = port;
724 759
725 /* 760 /*