Hi Joe,

On Wednesday 09 November 2016 06:41 PM, Joe Lawrence wrote:
On 11/09/2016 12:04 PM, Sudip Mukherjee wrote:
Hi Joe,

On 09/11/16 16:00, Joe Lawrence wrote:
Hi Sudip,

I hit a sysfs_warn_dup inside QEMU running 4.9.0-rc4 (I suspect earlier
versions as well, but this is the first upstream I've run in a while).
This warning looks like something the kernel test robot ran into a few
months ago:

Yes, 0day reported, but I was unable to reproduce it with the config
file that was given. Can you please send me your .config file and I will
try to reproduce this on my setup, and if I am not able to then i will
have to disturb you for debugging and testing.

Can you please test the attached patch and try to reproduce the error...
Sorry I could not test it as i could not build using your .config, I guess its time for me to upgrade gcc.

Regards
Sudip

diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c
index d233688..6755887 100644
--- a/drivers/char/ppdev.c
+++ b/drivers/char/ppdev.c
@@ -86,6 +86,9 @@ struct pp_struct {
        long default_inactivity;
 };
 
+/* should we use PARDEVICE_MAX here */
+static struct device *devices[PARPORT_MAX];
+
 /* pp_struct.flags bitfields */
 #define PP_CLAIMED    (1<<0)
 #define PP_EXCL       (1<<1)
@@ -792,13 +795,29 @@ static unsigned int pp_poll(struct file *file, poll_table 
*wait)
 
 static void pp_attach(struct parport *port)
 {
-       device_create(ppdev_class, port->dev, MKDEV(PP_MAJOR, port->number),
-                     NULL, "parport%d", port->number);
+       struct device *ret;
+
+       if (devices[port->number])
+               return;
+
+       ret = device_create(ppdev_class, port->dev,
+                           MKDEV(PP_MAJOR, port->number), NULL,
+                           "parport%d", port->number);
+       if (IS_ERR(ret)) {
+               pr_err("Failed to create device parport%d\n",
+                      port->number);
+               return;
+       }
+       devices[port->number] = ret;
 }
 
 static void pp_detach(struct parport *port)
 {
+       if (!devices[port->number])
+               return;
+
        device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number));
+       devices[port->number] = NULL;
 }
 
 static int pp_probe(struct pardevice *par_dev)

Reply via email to