Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
util.c
Go to the documentation of this file.
1 /*
2  * net/9p/util.c
3  *
4  * This file contains some helper functions
5  *
6  * Copyright (C) 2007 by Latchesar Ionkov <[email protected]>
7  * Copyright (C) 2004 by Eric Van Hensbergen <[email protected]>
8  * Copyright (C) 2002 by Ron Minnich <[email protected]>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2
12  * as published by the Free Software Foundation.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to:
21  * Free Software Foundation
22  * 51 Franklin Street, Fifth Floor
23  * Boston, MA 02111-1301 USA
24  *
25  */
26 
27 #include <linux/module.h>
28 #include <linux/errno.h>
29 #include <linux/fs.h>
30 #include <linux/sched.h>
31 #include <linux/parser.h>
32 #include <linux/idr.h>
33 #include <linux/slab.h>
34 #include <net/9p/9p.h>
35 
43 struct p9_idpool {
45  struct idr pool;
46 };
47 
54 {
55  struct p9_idpool *p;
56 
57  p = kmalloc(sizeof(struct p9_idpool), GFP_KERNEL);
58  if (!p)
59  return ERR_PTR(-ENOMEM);
60 
61  spin_lock_init(&p->lock);
62  idr_init(&p->pool);
63 
64  return p;
65 }
67 
74 {
75  idr_destroy(&p->pool);
76  kfree(p);
77 }
79 
89 {
90  int i = 0;
91  int error;
92  unsigned long flags;
93 
94 retry:
95  if (idr_pre_get(&p->pool, GFP_NOFS) == 0)
96  return -1;
97 
98  spin_lock_irqsave(&p->lock, flags);
99 
100  /* no need to store exactly p, we just need something non-null */
101  error = idr_get_new(&p->pool, p, &i);
102  spin_unlock_irqrestore(&p->lock, flags);
103 
104  if (error == -EAGAIN)
105  goto retry;
106  else if (error)
107  return -1;
108 
109  p9_debug(P9_DEBUG_MUX, " id %d pool %p\n", i, p);
110  return i;
111 }
113 
123 void p9_idpool_put(int id, struct p9_idpool *p)
124 {
125  unsigned long flags;
126 
127  p9_debug(P9_DEBUG_MUX, " id %d pool %p\n", id, p);
128 
129  spin_lock_irqsave(&p->lock, flags);
130  idr_remove(&p->pool, id);
131  spin_unlock_irqrestore(&p->lock, flags);
132 }
134 
141 int p9_idpool_check(int id, struct p9_idpool *p)
142 {
143  return idr_find(&p->pool, id) != NULL;
144 }
146