Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.25-rc7 /ipc/namespace.c

Filename:/ipc/namespace.c
Lines Added:86
Lines Deleted:0
Also changed in: (Previous) 2.6.25-rc6  2.6.25-rc5  2.6.25-rc4  2.6.25-rc3  2.6.25-rc2  2.6.25-rc1 
(Following) 2.6.25-rc8  2.6.25-rc9  2.6.25  2.6.25-git14  2.6.25-git15  2.6.25-git16 

Location
[  2.6.25-rc7
  [  ipc
     o  namespace.c

Patch

diff --git a/ipc/namespace.c b/ipc/namespace.c
new file mode 100644
index 0000000..1b96765
--- /dev/null
+++ b/ipc/namespace.c
@@ -0,0 +1,86 @@
+/*
+ * linux/ipc/namespace.c
+ * Copyright (C) 2006 Pavel Emelyanov <xemul@openvz.org> OpenVZ, SWsoft Inc.
+ */
+
+#include <linux/ipc.h>
+#include <linux/msg.h>
+#include <linux/ipc_namespace.h>
+#include <linux/rcupdate.h>
+#include <linux/nsproxy.h>
+#include <linux/slab.h>
+
+#include "util.h"
+
+static struct ipc_namespace *clone_ipc_ns(struct ipc_namespace *old_ns)
+{
+   struct ipc_namespace *ns;
+
+   ns = kmalloc(sizeof(struct ipc_namespace), GFP_KERNEL);
+   if (ns == NULL)
+      return ERR_PTR(-ENOMEM);
+
+   sem_init_ns(ns);
+   msg_init_ns(ns);
+   shm_init_ns(ns);
+
+   kref_init(&ns->kref);
+   return ns;
+}
+
+struct ipc_namespace *copy_ipcs(unsigned long flags, struct ipc_namespace *ns)
+{
+   struct ipc_namespace *new_ns;
+
+   BUG_ON(!ns);
+   get_ipc_ns(ns);
+
+   if (!(flags & CLONE_NEWIPC))
+      return ns;
+
+   new_ns = clone_ipc_ns(ns);
+
+   put_ipc_ns(ns);
+   return new_ns;
+}
+
+/*
+ * free_ipcs - free all ipcs of one type
+ * @ns:   the namespace to remove the ipcs from
+ * @ids:  the table of ipcs to free
+ * @free: the function called to free each individual ipc
+ *
+ * Called for each kind of ipc when an ipc_namespace exits.
+ */
+void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
+          void (*free)(struct ipc_namespace *, struct kern_ipc_perm *))
+{
+   struct kern_ipc_perm *perm;
+   int next_id;
+   int total, in_use;
+
+   down_write(&ids->rw_mutex);
+
+   in_use = ids->in_use;
+
+   for (total = 0, next_id = 0; total < in_use; next_id++) {
+      perm = idr_find(&ids->ipcs_idr, next_id);
+      if (perm == NULL)
+         continue;
+      ipc_lock_by_ptr(perm);
+      free(ns, perm);
+      total++;
+   }
+   up_write(&ids->rw_mutex);
+}
+
+void free_ipc_ns(struct kref *kref)
+{
+   struct ipc_namespace *ns;
+
+   ns = container_of(kref, struct ipc_namespace, kref);
+   sem_exit_ns(ns);
+   msg_exit_ns(ns);
+   shm_exit_ns(ns);
+   kfree(ns);
+}


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.