pid_t                   shm_cprid;
        pid_t                   shm_lprid;
        struct user_struct      *mlock_user;
+
+       /* The task created the shm object.  NULL if the task is dead. */
+       struct task_struct      *shm_creator;
 };
 
 /* shm_mode upper byte flags */
 
        if (IS_ERR(shp))
                return 0;
 
-       if (shp->shm_cprid != task_tgid_vnr(current)) {
+       if (shp->shm_creator != current) {
+               shm_unlock(shp);
+               return 0;
+       }
+
+       /*
+        * Mark it as orphaned to destroy the segment when
+        * kernel.shm_rmid_forced is changed.
+        * It is noop if the following shm_may_destroy() returns true.
+        */
+       shp->shm_creator = NULL;
+
+       /*
+        * Don't even try to destroy it.  If shm_rmid_forced=0 and IPC_RMID
+        * is not set, it shouldn't be deleted here.
+        */
+       if (!ns->shm_rmid_forced) {
                shm_unlock(shp);
                return 0;
        }
 {
        struct ipc_namespace *ns = data;
        struct shmid_kernel *shp = shm_lock(ns, id);
-       struct task_struct *task;
 
        if (IS_ERR(shp))
                return 0;
        /*
         * We want to destroy segments without users and with already
         * exit'ed originating process.
-        *
-        * XXX: the originating process may exist in another pid namespace.
         */
-       task = find_task_by_vpid(shp->shm_cprid);
-       if (task != NULL) {
+       if (shp->shm_creator != NULL) {
                shm_unlock(shp);
                return 0;
        }
        if (!nsp)
                return;
        ns = nsp->ipc_ns;
-       if (!ns || !ns->shm_rmid_forced)
+       if (!ns)
                return;
 
        /* Destroy all already created segments, but not mapped yet */
        shp->shm_segsz = size;
        shp->shm_nattch = 0;
        shp->shm_file = file;
+       shp->shm_creator = current;
        /*
         * shmid gets reported as "inode#" in /proc/pid/maps.
         * proc-ps tools use this. Changing this will break them.