11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * linux/ipc/util.h 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Christoph Rohland 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5624dffcbcf87b9c501b13256416a82487be962bcChristian Kujau * ipc helper functions (c) 1999 Manfred Spraul <manfred@colorfullife.com> 673ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaev * namespaces support. 2006 OpenVZ, SWsoft Inc. 773ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaev * Pavel Emelianov <xemul@openvz.org> 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _IPC_UTIL_H 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _IPC_UTIL_H 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13232086b19964d0e13359d30d74b11ca31b0751cbJohannes Weiner#include <linux/unistd.h> 14023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey#include <linux/err.h> 157ca7e564e049d8b350ec9d958ff25eaa24226352Nadia Derbey 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SEQ_MULTIPLIER (IPCMNI) 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18239521f31d7496a5322ee664ed8bbd1027b98c4bManfred Spraulvoid sem_init(void); 19239521f31d7496a5322ee664ed8bbd1027b98c4bManfred Spraulvoid msg_init(void); 20239521f31d7496a5322ee664ed8bbd1027b98c4bManfred Spraulvoid shm_init(void); 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22ae5e1b22f17983da929a0d0178896269e19da186Pavel Emelyanovstruct ipc_namespace; 23ae5e1b22f17983da929a0d0178896269e19da186Pavel Emelyanov 24614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallyn#ifdef CONFIG_POSIX_MQUEUE 257eafd7c74c3f2e67c27621b987b28397110d643fSerge E. Hallynextern void mq_clear_sbinfo(struct ipc_namespace *ns); 267eafd7c74c3f2e67c27621b987b28397110d643fSerge E. Hallynextern void mq_put_mnt(struct ipc_namespace *ns); 27614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallyn#else 287eafd7c74c3f2e67c27621b987b28397110d643fSerge E. Hallynstatic inline void mq_clear_sbinfo(struct ipc_namespace *ns) { } 297eafd7c74c3f2e67c27621b987b28397110d643fSerge E. Hallynstatic inline void mq_put_mnt(struct ipc_namespace *ns) { } 30614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallyn#endif 31614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallyn 32614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallyn#ifdef CONFIG_SYSVIPC 33ed2ddbf88c0ddeeae4c78bb306a116dfd867c55cPierre Peiffervoid sem_init_ns(struct ipc_namespace *ns); 34ed2ddbf88c0ddeeae4c78bb306a116dfd867c55cPierre Peiffervoid msg_init_ns(struct ipc_namespace *ns); 35ed2ddbf88c0ddeeae4c78bb306a116dfd867c55cPierre Peiffervoid shm_init_ns(struct ipc_namespace *ns); 3673ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaev 3773ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaevvoid sem_exit_ns(struct ipc_namespace *ns); 3873ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaevvoid msg_exit_ns(struct ipc_namespace *ns); 3973ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaevvoid shm_exit_ns(struct ipc_namespace *ns); 40614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallyn#else 41614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallynstatic inline void sem_init_ns(struct ipc_namespace *ns) { } 42614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallynstatic inline void msg_init_ns(struct ipc_namespace *ns) { } 43614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallynstatic inline void shm_init_ns(struct ipc_namespace *ns) { } 44614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallyn 45614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallynstatic inline void sem_exit_ns(struct ipc_namespace *ns) { } 46614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallynstatic inline void msg_exit_ns(struct ipc_namespace *ns) { } 47614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallynstatic inline void shm_exit_ns(struct ipc_namespace *ns) { } 48614b84cf4e4a920d2af32b8f147ea1e3b8c27ea6Serge E. Hallyn#endif 4973ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaev 5053dad6d3a8e5ac1af8bacc6ac2134ae1a8b085f1Davidlohr Buesostruct ipc_rcu { 5153dad6d3a8e5ac1af8bacc6ac2134ae1a8b085f1Davidlohr Bueso struct rcu_head rcu; 5253dad6d3a8e5ac1af8bacc6ac2134ae1a8b085f1Davidlohr Bueso atomic_t refcount; 5353dad6d3a8e5ac1af8bacc6ac2134ae1a8b085f1Davidlohr Bueso} ____cacheline_aligned_in_smp; 5453dad6d3a8e5ac1af8bacc6ac2134ae1a8b085f1Davidlohr Bueso 5553dad6d3a8e5ac1af8bacc6ac2134ae1a8b085f1Davidlohr Bueso#define ipc_rcu_to_struct(p) ((void *)(p+1)) 5653dad6d3a8e5ac1af8bacc6ac2134ae1a8b085f1Davidlohr Bueso 577748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey/* 587748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey * Structure that holds the parameters needed by the ipc operations 597748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey * (see after) 607748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey */ 617748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbeystruct ipc_params { 627748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey key_t key; 637748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey int flg; 647748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey union { 657748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey size_t size; /* for shared memories */ 667748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey int nsems; /* for semaphores */ 677748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey } u; /* holds the getnew() specific param */ 687748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey}; 697748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey 707748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey/* 717748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey * Structure that holds some ipc operations. This structure is used to unify 727748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey * the calls to sys_msgget(), sys_semget(), sys_shmget() 737748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey * . routine to call to create a new ipc object. Can be one of newque, 747748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey * newary, newseg 75f4566f04854d78acfc74b9acb029744acde9d033Nadia Derbey * . routine to call to check permissions for a new ipc object. 767748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey * Can be one of security_msg_associate, security_sem_associate, 777748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey * security_shm_associate 787748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey * . routine to call for an extra check if needed 797748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey */ 807748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbeystruct ipc_ops { 8146c0a8ca3e841b14a1d981e2116eaf2d1c7f2235Paul McQuade int (*getnew)(struct ipc_namespace *, struct ipc_params *); 8246c0a8ca3e841b14a1d981e2116eaf2d1c7f2235Paul McQuade int (*associate)(struct kern_ipc_perm *, int); 8346c0a8ca3e841b14a1d981e2116eaf2d1c7f2235Paul McQuade int (*more_checks)(struct kern_ipc_perm *, struct ipc_params *); 847748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey}; 857748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey 86ae7817745eef3b4ed3c2e36cb403e0c50f17d4e4Mike Waychisonstruct seq_file; 87ed2ddbf88c0ddeeae4c78bb306a116dfd867c55cPierre Peifferstruct ipc_ids; 887d69a1f4a72b18876c99c697692b78339d491568Cedric Le Goater 897ca7e564e049d8b350ec9d958ff25eaa24226352Nadia Derbeyvoid ipc_init_ids(struct ipc_ids *); 90ae7817745eef3b4ed3c2e36cb403e0c50f17d4e4Mike Waychison#ifdef CONFIG_PROC_FS 91ae7817745eef3b4ed3c2e36cb403e0c50f17d4e4Mike Waychisonvoid __init ipc_init_proc_interface(const char *path, const char *header, 9273ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaev int ids, int (*show)(struct seq_file *, void *)); 93ae7817745eef3b4ed3c2e36cb403e0c50f17d4e4Mike Waychison#else 94ae7817745eef3b4ed3c2e36cb403e0c50f17d4e4Mike Waychison#define ipc_init_proc_interface(path, header, ids, show) do {} while (0) 95ae7817745eef3b4ed3c2e36cb403e0c50f17d4e4Mike Waychison#endif 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9773ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaev#define IPC_SEM_IDS 0 9873ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaev#define IPC_MSG_IDS 1 9973ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaev#define IPC_SHM_IDS 2 10073ea41302bab5e02c9e86ab15c509494a550f1dbKirill Korotaev 101ce621f5ba52f30dd59aef4fb50276faee04ef9cfNadia Derbey#define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER) 10203f595668017f1a1fb971c02fc37140bc6e7bb1cStanislav Kinsbursky#define ipcid_to_seqx(id) ((id) / SEQ_MULTIPLIER) 103daf948c7d1a080041ae19aca07625efec670695aDavidlohr Bueso#define IPCID_SEQ_MAX min_t(int, INT_MAX/SEQ_MULTIPLIER, USHRT_MAX) 104ce621f5ba52f30dd59aef4fb50276faee04ef9cfNadia Derbey 105d9a605e40b1376eb02b067d7690580255a0df68fDavidlohr Bueso/* must be called with ids->rwsem acquired for writing */ 1067ca7e564e049d8b350ec9d958ff25eaa24226352Nadia Derbeyint ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int); 1073e148c79938aa39035669c1cfa3ff60722134535Nadia Derbey 108d9a605e40b1376eb02b067d7690580255a0df68fDavidlohr Bueso/* must be called with ids->rwsem acquired for reading */ 1097ca7e564e049d8b350ec9d958ff25eaa24226352Nadia Derbeyint ipc_get_maxid(struct ipc_ids *); 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* must be called with both locks acquired. */ 1127ca7e564e049d8b350ec9d958ff25eaa24226352Nadia Derbeyvoid ipc_rmid(struct ipc_ids *, struct kern_ipc_perm *); 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 114f4566f04854d78acfc74b9acb029744acde9d033Nadia Derbey/* must be called with ipcp locked */ 115b0e77598f87107001a00b8a4ece9c95e4254ccc4Serge E. Hallynint ipcperms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flg); 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* for rare, potentially huge allocations. 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both function can sleep 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 120239521f31d7496a5322ee664ed8bbd1027b98c4bManfred Spraulvoid *ipc_alloc(int size); 121239521f31d7496a5322ee664ed8bbd1027b98c4bManfred Spraulvoid ipc_free(void *ptr, int size); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * For allocation that need to be freed by RCU. 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Objects are reference counted, they start with reference count 1. 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * getref increases the refcount, the putref call that reduces the recount 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to 0 schedules the rcu destruction. Caller must guarantee locking. 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 129239521f31d7496a5322ee664ed8bbd1027b98c4bManfred Spraulvoid *ipc_rcu_alloc(int size); 1306062a8dc0517bce23e3c2f7d2fea5e22411269a3Rik van Rielint ipc_rcu_getref(void *ptr); 13153dad6d3a8e5ac1af8bacc6ac2134ae1a8b085f1Davidlohr Buesovoid ipc_rcu_putref(void *ptr, void (*func)(struct rcu_head *head)); 13253dad6d3a8e5ac1af8bacc6ac2134ae1a8b085f1Davidlohr Buesovoid ipc_rcu_free(struct rcu_head *head); 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 134023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbeystruct kern_ipc_perm *ipc_lock(struct ipc_ids *, int); 1354d2bff5eb86e8d7b4a20934cccb93bdeebed3558Davidlohr Buesostruct kern_ipc_perm *ipc_obtain_object(struct ipc_ids *ids, int id); 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out); 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out); 1391efdb69b0bb41dec8ee3e2cac0a0f167837d0919Eric W. Biedermanint ipc_update_perm(struct ipc64_perm *in, struct kern_ipc_perm *out); 140444d0f621b64716f7868dcbde448e0c66ece4e61Davidlohr Buesostruct kern_ipc_perm *ipcctl_pre_down_nolock(struct ipc_namespace *ns, 141444d0f621b64716f7868dcbde448e0c66ece4e61Davidlohr Bueso struct ipc_ids *ids, int id, int cmd, 142444d0f621b64716f7868dcbde448e0c66ece4e61Davidlohr Bueso struct ipc64_perm *perm, int extra_perm); 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 144c1d7e01d7877a397655277a920aeaa3830ed9461Will Deacon#ifndef CONFIG_ARCH_WANT_IPC_PARSE_VERSION 14546c0a8ca3e841b14a1d981e2116eaf2d1c7f2235Paul McQuade/* On IA-64, we always use the "64-bit version" of the IPC structures. */ 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define ipc_parse_version(cmd) IPC_64 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 148239521f31d7496a5322ee664ed8bbd1027b98c4bManfred Spraulint ipc_parse_version(int *cmd); 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void free_msg(struct msg_msg *msg); 1524e9b45a19241354daec281d7a785739829b52359Mathias Krauseextern struct msg_msg *load_msg(const void __user *src, size_t len); 1534a674f34ba04a002244edaf891b5da7fc1473ae8Stanislav Kinsburskyextern struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst); 1544e9b45a19241354daec281d7a785739829b52359Mathias Krauseextern int store_msg(void __user *dest, struct msg_msg *msg, size_t len); 1557748dbfaa010b12d5fb9ddf80199534c565c6bceNadia Derbey 156b6b337ad1c1d6fe11b09b35d75464b84b3e11f07Nadia Derbeyextern void recompute_msgmni(struct ipc_namespace *); 157b6b337ad1c1d6fe11b09b35d75464b84b3e11f07Nadia Derbey 1581b531f213661657d6e1c55cf5c97f649d630c227Nadia Derbeystatic inline int ipc_buildid(int id, int seq) 15928028313134e9f11e49f74a4beaa47c91e5ebf06Nadia Derbey{ 16028028313134e9f11e49f74a4beaa47c91e5ebf06Nadia Derbey return SEQ_MULTIPLIER * seq + id; 16128028313134e9f11e49f74a4beaa47c91e5ebf06Nadia Derbey} 16228028313134e9f11e49f74a4beaa47c91e5ebf06Nadia Derbey 1631b531f213661657d6e1c55cf5c97f649d630c227Nadia Derbeystatic inline int ipc_checkid(struct kern_ipc_perm *ipcp, int uid) 164023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey{ 1657bb4deff61bdab3338534841cb6d0508314a41d6Davidlohr Bueso return uid / SEQ_MULTIPLIER != ipcp->seq; 166023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey} 167023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey 1681ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Buesostatic inline void ipc_lock_object(struct kern_ipc_perm *perm) 169023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey{ 170023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey spin_lock(&perm->lock); 171023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey} 172023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey 1731ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Buesostatic inline void ipc_unlock_object(struct kern_ipc_perm *perm) 174023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey{ 175023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey spin_unlock(&perm->lock); 176023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey} 177023a53557ea0e987b002e9a844242ef0b0aa1eb3Nadia Derbey 1781ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Buesostatic inline void ipc_assert_locked_object(struct kern_ipc_perm *perm) 17916df3674efe39f3ab63e7052f1244dd3d50e7f84Davidlohr Bueso{ 1801ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Bueso assert_spin_locked(&perm->lock); 1811ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Bueso} 1821ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Bueso 1831ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Buesostatic inline void ipc_unlock(struct kern_ipc_perm *perm) 1841ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Bueso{ 185cf9d5d78d05bca96df7618dfc3a5ee4414dcae58Davidlohr Bueso ipc_unlock_object(perm); 1861ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Bueso rcu_read_unlock(); 1871ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Bueso} 1881ca7003ab41152d673d9e359632283d05294f3d6Davidlohr Bueso 1890f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini/* 1900f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini * ipc_valid_object() - helper to sort out IPC_RMID races for codepaths 1910f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini * where the respective ipc_ids.rwsem is not being held down. 1920f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini * Checks whether the ipc object is still around or if it's gone already, as 1930f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini * ipc_rmid() may have already freed the ID while the ipc lock was spinning. 1940f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini * Needs to be called with kern_ipc_perm.lock held -- exception made for one 1950f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini * checkpoint case at sys_semtimedop() as noted in code commentary. 1960f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini */ 1970f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquinistatic inline bool ipc_valid_object(struct kern_ipc_perm *perm) 1980f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini{ 19972a8ff2f9245128c254387c58f948f1f0152ea46Rafael Aquini return !perm->deleted; 2000f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini} 2010f3d2b0135f4bdbfe47a99753923a64efd373d11Rafael Aquini 2024d2bff5eb86e8d7b4a20934cccb93bdeebed3558Davidlohr Buesostruct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id); 203b2d75cddc83a349ef5633f609b9734b6b957f90fPavel Emelyanovint ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, 204eb66ec44f867834de054544b09b573de3a7ae456Mathias Krause const struct ipc_ops *ops, struct ipc_params *params); 205665c7741fb63c7ceeb515f1d1ed8b016efe65bf3Alexey Dobriyanvoid free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids, 206665c7741fb63c7ceeb515f1d1ed8b016efe65bf3Alexey Dobriyan void (*free)(struct ipc_namespace *, struct kern_ipc_perm *)); 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 208