-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Sage Weil
committed
Oct 6, 2009
1 parent
23c5a14
commit feff293
Showing
3 changed files
with
90 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: de57606c23afded22202825b3db8a5d61859f198 | ||
refs/heads/master: c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665d |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
|
||
#include "ceph_debug.h" | ||
#include "buffer.h" | ||
|
||
struct ceph_buffer *ceph_buffer_new(gfp_t gfp) | ||
{ | ||
struct ceph_buffer *b; | ||
|
||
b = kmalloc(sizeof(*b), gfp); | ||
if (!b) | ||
return NULL; | ||
atomic_set(&b->nref, 1); | ||
b->vec.iov_base = NULL; | ||
b->vec.iov_len = 0; | ||
b->alloc_len = 0; | ||
return b; | ||
} | ||
|
||
int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp) | ||
{ | ||
b->vec.iov_base = kmalloc(len, gfp | __GFP_NOWARN); | ||
if (b->vec.iov_base) { | ||
b->is_vmalloc = false; | ||
} else { | ||
b->vec.iov_base = __vmalloc(len, gfp, PAGE_KERNEL); | ||
b->is_vmalloc = true; | ||
} | ||
if (!b->vec.iov_base) | ||
return -ENOMEM; | ||
b->alloc_len = len; | ||
b->vec.iov_len = len; | ||
return 0; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
#ifndef __FS_CEPH_BUFFER_H | ||
#define __FS_CEPH_BUFFER_H | ||
|
||
#include <linux/mm.h> | ||
#include <linux/vmalloc.h> | ||
#include <linux/types.h> | ||
#include <linux/uio.h> | ||
|
||
/* | ||
* a simple reference counted buffer. | ||
* | ||
* use kmalloc for small sizes (<= one page), vmalloc for larger | ||
* sizes. | ||
*/ | ||
struct ceph_buffer { | ||
atomic_t nref; | ||
struct kvec vec; | ||
size_t alloc_len; | ||
bool is_vmalloc; | ||
}; | ||
|
||
struct ceph_buffer *ceph_buffer_new(gfp_t gfp); | ||
int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp); | ||
|
||
static inline struct ceph_buffer *ceph_buffer_get(struct ceph_buffer *b) | ||
{ | ||
atomic_inc(&b->nref); | ||
return b; | ||
} | ||
|
||
static inline void ceph_buffer_put(struct ceph_buffer *b) | ||
{ | ||
if (b && atomic_dec_and_test(&b->nref)) { | ||
if (b->vec.iov_base) { | ||
if (b->is_vmalloc) | ||
vfree(b->vec.iov_base); | ||
else | ||
kfree(b->vec.iov_base); | ||
} | ||
kfree(b); | ||
} | ||
} | ||
|
||
static inline struct ceph_buffer *ceph_buffer_new_alloc(int len, gfp_t gfp) | ||
{ | ||
struct ceph_buffer *b = ceph_buffer_new(gfp); | ||
|
||
if (b && ceph_buffer_alloc(b, len, gfp) < 0) { | ||
ceph_buffer_put(b); | ||
b = NULL; | ||
} | ||
return b; | ||
} | ||
|
||
#endif |