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
ceph
buffer.c
Go to the documentation of this file.
1
2
#include <
linux/ceph/ceph_debug.h
>
3
4
#include <linux/module.h>
5
#include <linux/slab.h>
6
7
#include <
linux/ceph/buffer.h
>
8
#include <
linux/ceph/decode.h
>
9
10
struct
ceph_buffer
*
ceph_buffer_new
(
size_t
len,
gfp_t
gfp)
11
{
12
struct
ceph_buffer
*
b
;
13
14
b =
kmalloc
(
sizeof
(*b), gfp);
15
if
(!b)
16
return
NULL
;
17
18
b->
vec
.iov_base =
kmalloc
(len, gfp |
__GFP_NOWARN
);
19
if
(b->
vec
.iov_base) {
20
b->
is_vmalloc
=
false
;
21
}
else
{
22
b->
vec
.iov_base =
__vmalloc
(len, gfp |
__GFP_HIGHMEM
,
PAGE_KERNEL
);
23
if
(!b->
vec
.iov_base) {
24
kfree
(b);
25
return
NULL
;
26
}
27
b->
is_vmalloc
=
true
;
28
}
29
30
kref_init(&b->
kref
);
31
b->
alloc_len
= len;
32
b->
vec
.iov_len = len;
33
dout
(
"buffer_new %p\n"
, b);
34
return
b
;
35
}
36
EXPORT_SYMBOL
(
ceph_buffer_new
);
37
38
void
ceph_buffer_release
(
struct
kref
*
kref
)
39
{
40
struct
ceph_buffer
*
b
=
container_of
(kref,
struct
ceph_buffer
, kref);
41
42
dout
(
"buffer_release %p\n"
, b);
43
if
(b->
vec
.iov_base) {
44
if
(b->
is_vmalloc
)
45
vfree
(b->
vec
.iov_base);
46
else
47
kfree
(b->
vec
.iov_base);
48
}
49
kfree
(b);
50
}
51
EXPORT_SYMBOL
(
ceph_buffer_release
);
52
53
int
ceph_decode_buffer
(
struct
ceph_buffer
**
b
,
void
**
p
,
void
*
end
)
54
{
55
size_t
len
;
56
57
ceph_decode_need
(p, end,
sizeof
(
u32
),
bad
);
58
len = ceph_decode_32(p);
59
dout
(
"decode_buffer len %d\n"
, (
int
)len);
60
ceph_decode_need
(p, end, len,
bad
);
61
*b =
ceph_buffer_new
(len,
GFP_NOFS
);
62
if
(!*b)
63
return
-
ENOMEM
;
64
ceph_decode_copy(p, (*b)->vec.iov_base, len);
65
return
0;
66
bad
:
67
return
-
EINVAL
;
68
}
Generated on Thu Jan 10 2013 14:35:44 for Linux Kernel by
1.8.2