This introduces a second, per-task, blocking notifier chain. The per-task[bits deleted]
chain offers watchers the chance to register with a specific task nstead of
all tasks. It also allows the watcher to associate a block of data with the task
by wrapping the notifier block using containerof().
Both the global, all-tasks chain and the per-task chain are called from the samefunction. The two types of chains share the same set of notification
values, however registration functions and the registered notifier blocks must
be separate.
These notifiers are only safe if notifier blocks are registered with the current
task while in the context of the current task. This ensures that there are no
races between registration, unregistration, and notification.
Signed-off-by: Matt Helsley <matthltc@xxxxxxxxxx>
Cc: Jes Sorensen <jes@xxxxxxx>
Cc: Chandra S. Seetharaman <sekharan@xxxxxxxxxx>
Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
Index: linux-2.6.17-rc6-mm2/kernel/sys.c
===================================================================
--- linux-2.6.17-rc6-mm2.orig/kernel/sys.c
+++ linux-2.6.17-rc6-mm2/kernel/sys.c
@@ -450,13 +450,41 @@ int unregister_task_watcher(struct notif
return blocking_notifier_chain_unregister(&task_watchers, nb);
}
EXPORT_SYMBOL_GPL(unregister_task_watcher);
+static inline int notify_per_task_watchers(unsigned int val,
+ struct task_struct *task)
+{
+ if (get_watch_event(val) != WATCH_TASK_INIT)
+ return raw_notifier_call_chain(&task->notify, val, task);
+ RAW_INIT_NOTIFIER_HEAD(&task->notify);
+ if (task->real_parent)
+ return raw_notifier_call_chain(&task->real_parent->notify,
+ val, task);
+}