diff options
Diffstat (limited to 'kernel/irq/irqdesc.c')
| -rw-r--r-- | kernel/irq/irqdesc.c | 15 | 
1 files changed, 9 insertions, 6 deletions
| diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index a91f9001103c..fd0996274401 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -288,22 +288,25 @@ static void irq_sysfs_add(int irq, struct irq_desc *desc)  	if (irq_kobj_base) {  		/*  		 * Continue even in case of failure as this is nothing -		 * crucial. +		 * crucial and failures in the late irq_sysfs_init() +		 * cannot be rolled back.  		 */  		if (kobject_add(&desc->kobj, irq_kobj_base, "%d", irq))  			pr_warn("Failed to add kobject for irq %d\n", irq); +		else +			desc->istate |= IRQS_SYSFS;  	}  }  static void irq_sysfs_del(struct irq_desc *desc)  {  	/* -	 * If irq_sysfs_init() has not yet been invoked (early boot), then -	 * irq_kobj_base is NULL and the descriptor was never added. -	 * kobject_del() complains about a object with no parent, so make -	 * it conditional. +	 * Only invoke kobject_del() when kobject_add() was successfully +	 * invoked for the descriptor. This covers both early boot, where +	 * sysfs is not initialized yet, and the case of a failed +	 * kobject_add() invocation.  	 */ -	if (irq_kobj_base) +	if (desc->istate & IRQS_SYSFS)  		kobject_del(&desc->kobj);  } |