Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
9p
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 <lucho@ionkov.net>
7
* Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
8
* Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
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
{
44
spinlock_t
lock
;
45
struct
idr
pool
;
46
};
47
53
struct
p9_idpool
*
p9_idpool_create
(
void
)
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
}
66
EXPORT_SYMBOL
(
p9_idpool_create
);
67
73
void
p9_idpool_destroy
(
struct
p9_idpool
*
p
)
74
{
75
idr_destroy
(&p->
pool
);
76
kfree
(p);
77
}
78
EXPORT_SYMBOL
(
p9_idpool_destroy
);
79
88
int
p9_idpool_get
(
struct
p9_idpool
*
p
)
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
}
112
EXPORT_SYMBOL
(
p9_idpool_get
);
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
}
133
EXPORT_SYMBOL
(
p9_idpool_put
);
134
141
int
p9_idpool_check
(
int
id
,
struct
p9_idpool
*
p
)
142
{
143
return
idr_find
(&p->
pool
,
id
) !=
NULL
;
144
}
145
EXPORT_SYMBOL
(
p9_idpool_check
);
146
Generated on Thu Jan 10 2013 13:19:38 for Linux Kernel by
1.8.2