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