diff options
author | Sage Weil <sage@newdream.net> | 2009-12-05 13:13:33 -0500 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-12-07 15:10:04 -0500 |
commit | dd26d857a7bf1b5b734a23180c19eac3e46db944 (patch) | |
tree | 24b7ef04c08959df09739056b097ccd157e0251f /fs/ceph/buffer.h | |
parent | 2f2ffd35822688a3650e503197b8724f47312748 (diff) |
ceph: use kref for ceph_buffer
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/buffer.h')
-rw-r--r-- | fs/ceph/buffer.h | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/fs/ceph/buffer.h b/fs/ceph/buffer.h index 16b1930acc45..3f541a13094f 100644 --- a/fs/ceph/buffer.h +++ b/fs/ceph/buffer.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef __FS_CEPH_BUFFER_H | 1 | #ifndef __FS_CEPH_BUFFER_H |
2 | #define __FS_CEPH_BUFFER_H | 2 | #define __FS_CEPH_BUFFER_H |
3 | 3 | ||
4 | #include <linux/kref.h> | ||
4 | #include <linux/mm.h> | 5 | #include <linux/mm.h> |
5 | #include <linux/vmalloc.h> | 6 | #include <linux/vmalloc.h> |
6 | #include <linux/types.h> | 7 | #include <linux/types.h> |
@@ -13,7 +14,7 @@ | |||
13 | * sizes. | 14 | * sizes. |
14 | */ | 15 | */ |
15 | struct ceph_buffer { | 16 | struct ceph_buffer { |
16 | atomic_t nref; | 17 | struct kref kref; |
17 | struct kvec vec; | 18 | struct kvec vec; |
18 | size_t alloc_len; | 19 | size_t alloc_len; |
19 | bool is_vmalloc; | 20 | bool is_vmalloc; |
@@ -24,21 +25,16 @@ int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp); | |||
24 | 25 | ||
25 | static inline struct ceph_buffer *ceph_buffer_get(struct ceph_buffer *b) | 26 | static inline struct ceph_buffer *ceph_buffer_get(struct ceph_buffer *b) |
26 | { | 27 | { |
27 | atomic_inc(&b->nref); | 28 | kref_get(&b->kref); |
28 | return b; | 29 | return b; |
29 | } | 30 | } |
30 | 31 | ||
32 | void ceph_buffer_release(struct kref *kref); | ||
33 | |||
31 | static inline void ceph_buffer_put(struct ceph_buffer *b) | 34 | static inline void ceph_buffer_put(struct ceph_buffer *b) |
32 | { | 35 | { |
33 | if (b && atomic_dec_and_test(&b->nref)) { | 36 | if (b) |
34 | if (b->vec.iov_base) { | 37 | kref_put(&b->kref, ceph_buffer_release); |
35 | if (b->is_vmalloc) | ||
36 | vfree(b->vec.iov_base); | ||
37 | else | ||
38 | kfree(b->vec.iov_base); | ||
39 | } | ||
40 | kfree(b); | ||
41 | } | ||
42 | } | 38 | } |
43 | 39 | ||
44 | static inline struct ceph_buffer *ceph_buffer_new_alloc(int len, gfp_t gfp) | 40 | static inline struct ceph_buffer *ceph_buffer_new_alloc(int len, gfp_t gfp) |