|
@@ -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 */
|