Re: [ppdev] sysfs warning on qemu boot

From: Sudip Mukherjee
Date: Fri Nov 11 2016 - 16:14:19 EST


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)