Blame view

ipc/util.h 5.28 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /*
   * linux/ipc/util.h
   * Copyright (C) 1999 Christoph Rohland
   *
624dffcbc   Christian Kujau   correct email add...
5
   * ipc helper functions (c) 1999 Manfred Spraul <manfred@colorfullife.com>
73ea41302   Kirill Korotaev   [PATCH] IPC names...
6
7
   * namespaces support.      2006 OpenVZ, SWsoft Inc.
   *                               Pavel Emelianov <xemul@openvz.org>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
11
   */
  
  #ifndef _IPC_UTIL_H
  #define _IPC_UTIL_H
232086b19   Johannes Weiner   ipc: unbreak 32-b...
12
  #include <linux/unistd.h>
023a53557   Nadia Derbey   ipc: integrate ip...
13
  #include <linux/err.h>
7ca7e564e   Nadia Derbey   ipc: store ipcs i...
14

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
19
  #define SEQ_MULTIPLIER	(IPCMNI)
  
  void sem_init (void);
  void msg_init (void);
  void shm_init (void);
ae5e1b22f   Pavel Emelyanov   namespaces: move ...
20
  struct ipc_namespace;
614b84cf4   Serge E. Hallyn   namespaces: mqueu...
21
  #ifdef CONFIG_POSIX_MQUEUE
7eafd7c74   Serge E. Hallyn   namespaces: ipc n...
22
23
  extern void mq_clear_sbinfo(struct ipc_namespace *ns);
  extern void mq_put_mnt(struct ipc_namespace *ns);
614b84cf4   Serge E. Hallyn   namespaces: mqueu...
24
  #else
7eafd7c74   Serge E. Hallyn   namespaces: ipc n...
25
26
  static inline void mq_clear_sbinfo(struct ipc_namespace *ns) { }
  static inline void mq_put_mnt(struct ipc_namespace *ns) { }
614b84cf4   Serge E. Hallyn   namespaces: mqueu...
27
28
29
  #endif
  
  #ifdef CONFIG_SYSVIPC
ed2ddbf88   Pierre Peiffer   IPC: make struct ...
30
31
32
  void sem_init_ns(struct ipc_namespace *ns);
  void msg_init_ns(struct ipc_namespace *ns);
  void shm_init_ns(struct ipc_namespace *ns);
73ea41302   Kirill Korotaev   [PATCH] IPC names...
33
34
35
36
  
  void sem_exit_ns(struct ipc_namespace *ns);
  void msg_exit_ns(struct ipc_namespace *ns);
  void shm_exit_ns(struct ipc_namespace *ns);
614b84cf4   Serge E. Hallyn   namespaces: mqueu...
37
38
39
40
41
42
43
44
45
  #else
  static inline void sem_init_ns(struct ipc_namespace *ns) { }
  static inline void msg_init_ns(struct ipc_namespace *ns) { }
  static inline void shm_init_ns(struct ipc_namespace *ns) { }
  
  static inline void sem_exit_ns(struct ipc_namespace *ns) { }
  static inline void msg_exit_ns(struct ipc_namespace *ns) { }
  static inline void shm_exit_ns(struct ipc_namespace *ns) { }
  #endif
73ea41302   Kirill Korotaev   [PATCH] IPC names...
46

7748dbfaa   Nadia Derbey   ipc: unify the sy...
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  /*
   * Structure that holds the parameters needed by the ipc operations
   * (see after)
   */
  struct ipc_params {
  	key_t key;
  	int flg;
  	union {
  		size_t size;	/* for shared memories */
  		int nsems;	/* for semaphores */
  	} u;			/* holds the getnew() specific param */
  };
  
  /*
   * Structure that holds some ipc operations. This structure is used to unify
   * the calls to sys_msgget(), sys_semget(), sys_shmget()
   *      . routine to call to create a new ipc object. Can be one of newque,
   *        newary, newseg
f4566f048   Nadia Derbey   ipc: fix wrong co...
65
   *      . routine to call to check permissions for a new ipc object.
7748dbfaa   Nadia Derbey   ipc: unify the sy...
66
67
68
69
70
71
   *        Can be one of security_msg_associate, security_sem_associate,
   *        security_shm_associate
   *      . routine to call for an extra check if needed
   */
  struct ipc_ops {
  	int (*getnew) (struct ipc_namespace *, struct ipc_params *);
03f02c765   Nadia Derbey   Storing ipcs into...
72
73
  	int (*associate) (struct kern_ipc_perm *, int);
  	int (*more_checks) (struct kern_ipc_perm *, struct ipc_params *);
7748dbfaa   Nadia Derbey   ipc: unify the sy...
74
  };
ae7817745   Mike Waychison   [PATCH] ipc: add ...
75
  struct seq_file;
ed2ddbf88   Pierre Peiffer   IPC: make struct ...
76
  struct ipc_ids;
7d69a1f4a   Cedric Le Goater   remove CONFIG_UTS...
77

7ca7e564e   Nadia Derbey   ipc: store ipcs i...
78
  void ipc_init_ids(struct ipc_ids *);
ae7817745   Mike Waychison   [PATCH] ipc: add ...
79
80
  #ifdef CONFIG_PROC_FS
  void __init ipc_init_proc_interface(const char *path, const char *header,
73ea41302   Kirill Korotaev   [PATCH] IPC names...
81
  		int ids, int (*show)(struct seq_file *, void *));
ae7817745   Mike Waychison   [PATCH] ipc: add ...
82
83
84
  #else
  #define ipc_init_proc_interface(path, header, ids, show) do {} while (0)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85

73ea41302   Kirill Korotaev   [PATCH] IPC names...
86
87
88
  #define IPC_SEM_IDS	0
  #define IPC_MSG_IDS	1
  #define IPC_SHM_IDS	2
ce621f5ba   Nadia Derbey   ipc: introduce th...
89
  #define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER)
3e148c799   Nadia Derbey   fix idr_find() lo...
90
  /* must be called with ids->rw_mutex acquired for writing */
7ca7e564e   Nadia Derbey   ipc: store ipcs i...
91
  int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int);
3e148c799   Nadia Derbey   fix idr_find() lo...
92
93
  
  /* must be called with ids->rw_mutex acquired for reading */
7ca7e564e   Nadia Derbey   ipc: store ipcs i...
94
  int ipc_get_maxid(struct ipc_ids *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
  
  /* must be called with both locks acquired. */
7ca7e564e   Nadia Derbey   ipc: store ipcs i...
97
  void ipc_rmid(struct ipc_ids *, struct kern_ipc_perm *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98

f4566f048   Nadia Derbey   ipc: fix wrong co...
99
  /* must be called with ipcp locked */
b0e77598f   Serge E. Hallyn   userns: user name...
100
  int ipcperms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  
  /* for rare, potentially huge allocations.
   * both function can sleep
   */
  void* ipc_alloc(int size);
  void ipc_free(void* ptr, int size);
  
  /*
   * For allocation that need to be freed by RCU.
   * Objects are reference counted, they start with reference count 1.
   * getref increases the refcount, the putref call that reduces the recount
   * to 0 schedules the rcu destruction. Caller must guarantee locking.
   */
  void* ipc_rcu_alloc(int size);
  void ipc_rcu_getref(void *ptr);
  void ipc_rcu_putref(void *ptr);
023a53557   Nadia Derbey   ipc: integrate ip...
117
  struct kern_ipc_perm *ipc_lock(struct ipc_ids *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
119
120
  
  void kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out);
  void ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out);
8f4a3809c   Pierre Peiffer   IPC: introduce ip...
121
  void ipc_update_perm(struct ipc64_perm *in, struct kern_ipc_perm *out);
b0e77598f   Serge E. Hallyn   userns: user name...
122
123
  struct kern_ipc_perm *ipcctl_pre_down(struct ipc_namespace *ns,
  				      struct ipc_ids *ids, int id, int cmd,
a5f75e7f2   Pierre Peiffer   IPC: consolidate ...
124
  				      struct ipc64_perm *perm, int extra_perm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125

31a985fbb   Arnd Bergmann   ipc: use __ARCH_W...
126
  #ifndef __ARCH_WANT_IPC_PARSE_VERSION
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
128
129
130
131
132
133
134
135
    /* On IA-64, we always use the "64-bit version" of the IPC structures.  */ 
  # define ipc_parse_version(cmd)	IPC_64
  #else
  int ipc_parse_version (int *cmd);
  #endif
  
  extern void free_msg(struct msg_msg *msg);
  extern struct msg_msg *load_msg(const void __user *src, int len);
  extern int store_msg(void __user *dest, struct msg_msg *msg, int len);
7748dbfaa   Nadia Derbey   ipc: unify the sy...
136

b6b337ad1   Nadia Derbey   ipc: recompute ms...
137
  extern void recompute_msgmni(struct ipc_namespace *);
1b531f213   Nadia Derbey   ipc: remove unnee...
138
  static inline int ipc_buildid(int id, int seq)
280283131   Nadia Derbey   ipc: inline ipc_b...
139
140
141
  {
  	return SEQ_MULTIPLIER * seq + id;
  }
f4566f048   Nadia Derbey   ipc: fix wrong co...
142
143
144
  /*
   * Must be called with ipcp locked
   */
1b531f213   Nadia Derbey   ipc: remove unnee...
145
  static inline int ipc_checkid(struct kern_ipc_perm *ipcp, int uid)
023a53557   Nadia Derbey   ipc: integrate ip...
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  {
  	if (uid / SEQ_MULTIPLIER != ipcp->seq)
  		return 1;
  	return 0;
  }
  
  static inline void ipc_lock_by_ptr(struct kern_ipc_perm *perm)
  {
  	rcu_read_lock();
  	spin_lock(&perm->lock);
  }
  
  static inline void ipc_unlock(struct kern_ipc_perm *perm)
  {
  	spin_unlock(&perm->lock);
  	rcu_read_unlock();
  }
b2d75cddc   Pavel Emelyanov   ipc: uninline som...
163
164
165
  struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids, int id);
  int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
  			struct ipc_ops *ops, struct ipc_params *params);
665c7741f   Alexey Dobriyan   ipcns: move free_...
166
167
  void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
  		void (*free)(struct ipc_namespace *, struct kern_ipc_perm *));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168
  #endif