diff options
Diffstat (limited to 'lib/kobject_uevent.c')
| -rw-r--r-- | lib/kobject_uevent.c | 49 | 
1 files changed, 41 insertions, 8 deletions
| diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c index e590523ea476..f237a09a5862 100644 --- a/lib/kobject_uevent.c +++ b/lib/kobject_uevent.c @@ -294,6 +294,26 @@ static void cleanup_uevent_env(struct subprocess_info *info)  }  #endif +static void zap_modalias_env(struct kobj_uevent_env *env) +{ +	static const char modalias_prefix[] = "MODALIAS="; +	int i; + +	for (i = 0; i < env->envp_idx;) { +		if (strncmp(env->envp[i], modalias_prefix, +			    sizeof(modalias_prefix) - 1)) { +			i++; +			continue; +		} + +		if (i != env->envp_idx - 1) +			memmove(&env->envp[i], &env->envp[i + 1], +				sizeof(env->envp[i]) * env->envp_idx - 1); + +		env->envp_idx--; +	} +} +  /**   * kobject_uevent_env - send an uevent with environmental data   * @@ -409,16 +429,29 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,  		}  	} -	/* -	 * Mark "add" and "remove" events in the object to ensure proper -	 * events to userspace during automatic cleanup. If the object did -	 * send an "add" event, "remove" will automatically generated by -	 * the core, if not already done by the caller. -	 */ -	if (action == KOBJ_ADD) +	switch (action) { +	case KOBJ_ADD: +		/* +		 * Mark "add" event so we can make sure we deliver "remove" +		 * event to userspace during automatic cleanup. If +		 * the object did send an "add" event, "remove" will +		 * automatically generated by the core, if not already done +		 * by the caller. +		 */  		kobj->state_add_uevent_sent = 1; -	else if (action == KOBJ_REMOVE) +		break; + +	case KOBJ_REMOVE:  		kobj->state_remove_uevent_sent = 1; +		break; + +	case KOBJ_UNBIND: +		zap_modalias_env(env); +		break; + +	default: +		break; +	}  	mutex_lock(&uevent_sock_mutex);  	/* we will send an event, so request a new sequence number */ |