|
@@ -124,6 +124,26 @@ void __init shm_init (void)
|
|
|
IPC_SHM_IDS, sysvipc_shm_proc_show);
|
|
IPC_SHM_IDS, sysvipc_shm_proc_show);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static inline struct shmid_kernel *shm_obtain_object(struct ipc_namespace *ns, int id)
|
|
|
|
|
+{
|
|
|
|
|
+ struct kern_ipc_perm *ipcp = ipc_obtain_object(&shm_ids(ns), id);
|
|
|
|
|
+
|
|
|
|
|
+ if (IS_ERR(ipcp))
|
|
|
|
|
+ return ERR_CAST(ipcp);
|
|
|
|
|
+
|
|
|
|
|
+ return container_of(ipcp, struct shmid_kernel, shm_perm);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+static inline struct shmid_kernel *shm_obtain_object_check(struct ipc_namespace *ns, int id)
|
|
|
|
|
+{
|
|
|
|
|
+ struct kern_ipc_perm *ipcp = ipc_obtain_object_check(&shm_ids(ns), id);
|
|
|
|
|
+
|
|
|
|
|
+ if (IS_ERR(ipcp))
|
|
|
|
|
+ return ERR_CAST(ipcp);
|
|
|
|
|
+
|
|
|
|
|
+ return container_of(ipcp, struct shmid_kernel, shm_perm);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/*
|
|
/*
|
|
|
* shm_lock_(check_) routines are called in the paths where the rw_mutex
|
|
* shm_lock_(check_) routines are called in the paths where the rw_mutex
|
|
|
* is not necessarily held.
|
|
* is not necessarily held.
|