void free_ipc_ns(struct kref *kref) { struct ipc_namespace *ns; ns = container_of(kref, struct ipc_namespace, kref); /* * 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); }
static void free_ipc_ns(struct ipc_namespace *ns) { sem_exit_ns(ns); msg_exit_ns(ns); shm_exit_ns(ns); put_user_ns(ns->user_ns); ns_free_inum(&ns->ns); kfree(ns); }