Print this page
OS-5223 removed shm segment is no longer available
Reviewed by: Bryan Cantrill <bryan@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
        
@@ -18,10 +18,11 @@
  *
  * CDDL HEADER END
  */
 /*
  * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2016 Joyent, Inc.
  */
 
 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T         */
 /*      All Rights Reserved                                     */
 
@@ -1215,11 +1216,28 @@
         IPC_ZONE_USAGE(perm, service) -= 1;
         ASSERT(service->ipcs_count || ((IPC_PROJ_USAGE(perm, service) == 0) &&
             (IPC_ZONE_USAGE(perm, service) == 0)));
 }
 
+/*
+ * Perform actual IPC_RMID, either via ipc_rmid or due to a delayed *_RMID.
+ */
+void
+ipc_rmsvc(ipc_service_t *service, kipc_perm_t *perm)
+{
+        ASSERT(service->ipcs_count > 0);
+        ASSERT(MUTEX_HELD(&service->ipcs_lock));
 
+        ipc_remove(service, perm);
+        mutex_exit(&service->ipcs_lock);
+
+        /* perform any per-service removal actions */
+        service->ipcs_rmid(perm);
+
+        ipc_rele(service, perm);
+}
+
 /*
  * Common code to perform an IPC_RMID.  Returns an errno value on
  * failure, 0 on success.
  */
 int
@@ -1245,18 +1263,12 @@
         }
 
         /*
          * Nothing can fail from this point on.
          */
-        ipc_remove(service, perm);
-        mutex_exit(&service->ipcs_lock);
+        ipc_rmsvc(service, perm);
 
-        /* perform any per-service removal actions */
-        service->ipcs_rmid(perm);
-
-        ipc_rele(service, perm);
-
         return (0);
 }
 
 /*
  * Implementation for shmids, semids, and msgids.  buf is the address