void shm_exit_ns(struct ipc_namespace *ns) { int i; struct shmid_kernel *shp; mutex_lock(&shm_ids(ns).mutex); for (i = 0; i <= shm_ids(ns).max_id; i++) { shp = shm_lock(ns, i); if (shp == NULL) continue; do_shm_rmid(ns, shp); } mutex_unlock(&shm_ids(ns).mutex); ipc_fini_ids(ns->ids[IPC_SHM_IDS]); kfree(ns->ids[IPC_SHM_IDS]); ns->ids[IPC_SHM_IDS] = NULL; }
void shm_exit_ns(struct ipc_namespace *ns) { struct shmid_kernel *shp; int next_id; int total, in_use; down_write(&shm_ids(ns).rw_mutex); in_use = shm_ids(ns).in_use; for (total = 0, next_id = 0; total < in_use; next_id++) { shp = idr_find(&shm_ids(ns).ipcs_idr, next_id); if (shp == NULL) continue; ipc_lock_by_ptr(&shp->shm_perm); do_shm_rmid(ns, shp); total++; } up_write(&shm_ids(ns).rw_mutex); kfree(ns->ids[IPC_SHM_IDS]); ns->ids[IPC_SHM_IDS] = NULL; }