Blame view

ipc/util.h 4.47 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
023a53557   Nadia Derbey   ipc: integrate ip...
12
  #include <linux/err.h>
7ca7e564e   Nadia Derbey   ipc: store ipcs i...
13

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
  #define SEQ_MULTIPLIER	(IPCMNI)
  
  void sem_init (void);
  void msg_init (void);
  void shm_init (void);
ae5e1b22f   Pavel Emelyanov   namespaces: move ...
19
  struct ipc_namespace;
ed2ddbf88   Pierre Peiffer   IPC: make struct ...
20
21
22
  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...
23
24
25
26
  
  void sem_exit_ns(struct ipc_namespace *ns);
  void msg_exit_ns(struct ipc_namespace *ns);
  void shm_exit_ns(struct ipc_namespace *ns);
7748dbfaa   Nadia Derbey   ipc: unify the sy...
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  /*
   * 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...
45
   *      . routine to call to check permissions for a new ipc object.
7748dbfaa   Nadia Derbey   ipc: unify the sy...
46
47
48
49
50
51
   *        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...
52
53
  	int (*associate) (struct kern_ipc_perm *, int);
  	int (*more_checks) (struct kern_ipc_perm *, struct ipc_params *);
7748dbfaa   Nadia Derbey   ipc: unify the sy...
54
  };
ae7817745   Mike Waychison   [PATCH] ipc: add ...
55
  struct seq_file;
ed2ddbf88   Pierre Peiffer   IPC: make struct ...
56
  struct ipc_ids;
7d69a1f4a   Cedric Le Goater   remove CONFIG_UTS...
57

7ca7e564e   Nadia Derbey   ipc: store ipcs i...
58
  void ipc_init_ids(struct ipc_ids *);
ae7817745   Mike Waychison   [PATCH] ipc: add ...
59
60
  #ifdef CONFIG_PROC_FS
  void __init ipc_init_proc_interface(const char *path, const char *header,
73ea41302   Kirill Korotaev   [PATCH] IPC names...
61
  		int ids, int (*show)(struct seq_file *, void *));
ae7817745   Mike Waychison   [PATCH] ipc: add ...
62
63
64
  #else
  #define ipc_init_proc_interface(path, header, ids, show) do {} while (0)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65

73ea41302   Kirill Korotaev   [PATCH] IPC names...
66
67
68
  #define IPC_SEM_IDS	0
  #define IPC_MSG_IDS	1
  #define IPC_SHM_IDS	2
ce621f5ba   Nadia Derbey   ipc: introduce th...
69
  #define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER)
3e148c799   Nadia Derbey   fix idr_find() lo...
70
  /* must be called with ids->rw_mutex acquired for writing */
7ca7e564e   Nadia Derbey   ipc: store ipcs i...
71
  int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int);
3e148c799   Nadia Derbey   fix idr_find() lo...
72
73
  
  /* must be called with ids->rw_mutex acquired for reading */
7ca7e564e   Nadia Derbey   ipc: store ipcs i...
74
  int ipc_get_maxid(struct ipc_ids *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
76
  
  /* must be called with both locks acquired. */
7ca7e564e   Nadia Derbey   ipc: store ipcs i...
77
  void ipc_rmid(struct ipc_ids *, struct kern_ipc_perm *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78

f4566f048   Nadia Derbey   ipc: fix wrong co...
79
80
  /* must be called with ipcp locked */
  int ipcperms(struct kern_ipc_perm *ipcp, short flg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  
  /* 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...
97
  struct kern_ipc_perm *ipc_lock(struct ipc_ids *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
100
  
  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...
101
  void ipc_update_perm(struct ipc64_perm *in, struct kern_ipc_perm *out);
a5f75e7f2   Pierre Peiffer   IPC: consolidate ...
102
103
  struct kern_ipc_perm *ipcctl_pre_down(struct ipc_ids *ids, int id, int cmd,
  				      struct ipc64_perm *perm, int extra_perm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104

813e67836   Chris Zankel   [PATCH] xtensa: r...
105
  #if defined(__ia64__) || defined(__x86_64__) || defined(__hppa__) || defined(__XTENSA__)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
108
109
110
111
112
113
114
    /* 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...
115

b6b337ad1   Nadia Derbey   ipc: recompute ms...
116
  extern void recompute_msgmni(struct ipc_namespace *);
1b531f213   Nadia Derbey   ipc: remove unnee...
117
  static inline int ipc_buildid(int id, int seq)
280283131   Nadia Derbey   ipc: inline ipc_b...
118
119
120
  {
  	return SEQ_MULTIPLIER * seq + id;
  }
f4566f048   Nadia Derbey   ipc: fix wrong co...
121
122
123
  /*
   * Must be called with ipcp locked
   */
1b531f213   Nadia Derbey   ipc: remove unnee...
124
  static inline int ipc_checkid(struct kern_ipc_perm *ipcp, int uid)
023a53557   Nadia Derbey   ipc: integrate ip...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
  {
  	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...
142
143
144
  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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
  
  #endif