|
@@ -83,6 +83,30 @@ void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
|
|
up_write(&ids->rw_mutex);
|
|
up_write(&ids->rw_mutex);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void free_ipc_ns(struct ipc_namespace *ns)
|
|
|
|
+{
|
|
|
|
+ /*
|
|
|
|
+ * Unregistering the hotplug notifier at the beginning guarantees
|
|
|
|
+ * that the ipc namespace won't be freed while we are inside the
|
|
|
|
+ * callback routine. Since the blocking_notifier_chain_XXX routines
|
|
|
|
+ * hold a rw lock on the notifier list, unregister_ipcns_notifier()
|
|
|
|
+ * won't take the rw lock before blocking_notifier_call_chain() has
|
|
|
|
+ * released the rd lock.
|
|
|
|
+ */
|
|
|
|
+ unregister_ipcns_notifier(ns);
|
|
|
|
+ sem_exit_ns(ns);
|
|
|
|
+ msg_exit_ns(ns);
|
|
|
|
+ shm_exit_ns(ns);
|
|
|
|
+ kfree(ns);
|
|
|
|
+ atomic_dec(&nr_ipc_ns);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Do the ipcns removal notification after decrementing nr_ipc_ns in
|
|
|
|
+ * order to have a correct value when recomputing msgmni.
|
|
|
|
+ */
|
|
|
|
+ ipcns_notify(IPCNS_REMOVED);
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* put_ipc_ns - drop a reference to an ipc namespace.
|
|
* put_ipc_ns - drop a reference to an ipc namespace.
|
|
* @ns: the namespace to put
|
|
* @ns: the namespace to put
|
|
@@ -108,27 +132,3 @@ void put_ipc_ns(struct ipc_namespace *ns)
|
|
free_ipc_ns(ns);
|
|
free_ipc_ns(ns);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
-void free_ipc_ns(struct ipc_namespace *ns)
|
|
|
|
-{
|
|
|
|
- /*
|
|
|
|
- * Unregistering the hotplug notifier at the beginning guarantees
|
|
|
|
- * that the ipc namespace won't be freed while we are inside the
|
|
|
|
- * callback routine. Since the blocking_notifier_chain_XXX routines
|
|
|
|
- * hold a rw lock on the notifier list, unregister_ipcns_notifier()
|
|
|
|
- * won't take the rw lock before blocking_notifier_call_chain() has
|
|
|
|
- * released the rd lock.
|
|
|
|
- */
|
|
|
|
- unregister_ipcns_notifier(ns);
|
|
|
|
- sem_exit_ns(ns);
|
|
|
|
- msg_exit_ns(ns);
|
|
|
|
- shm_exit_ns(ns);
|
|
|
|
- kfree(ns);
|
|
|
|
- atomic_dec(&nr_ipc_ns);
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Do the ipcns removal notification after decrementing nr_ipc_ns in
|
|
|
|
- * order to have a correct value when recomputing msgmni.
|
|
|
|
- */
|
|
|
|
- ipcns_notify(IPCNS_REMOVED);
|
|
|
|
-}
|
|
|