diff options
author | Alex Elder <elder@inktank.com> | 2013-04-30 01:44:32 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:20:08 -0400 |
commit | 4f0dcb10cf1454a1c38aeaa04cb2757535e4905e (patch) | |
tree | 1637c6a8961c95bdf02b7326cea79ca9b0b8e07f /net/ceph | |
parent | b536f69a3a589113992c32982bf2981c8225c9da (diff) |
libceph: create source file "net/ceph/snapshot.c"
This creates a new source file "net/ceph/snapshot.c" to contain
utility routines related to ceph snapshot contexts. The main
motivation was to define ceph_create_snap_context() as a common way
to create these structures, but I've moved the definitions of
ceph_get_snap_context() and ceph_put_snap_context() there too.
(The benefit of inlining those is very small, and I'd rather
keep this collection of functions together.)
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/Makefile | 2 | ||||
-rw-r--r-- | net/ceph/snapshot.c | 78 |
2 files changed, 79 insertions, 1 deletions
diff --git a/net/ceph/Makefile b/net/ceph/Makefile index e87ef435e11b..958d9856912c 100644 --- a/net/ceph/Makefile +++ b/net/ceph/Makefile | |||
@@ -11,5 +11,5 @@ libceph-y := ceph_common.o messenger.o msgpool.o buffer.o pagelist.o \ | |||
11 | crypto.o armor.o \ | 11 | crypto.o armor.o \ |
12 | auth_x.o \ | 12 | auth_x.o \ |
13 | ceph_fs.o ceph_strings.o ceph_hash.o \ | 13 | ceph_fs.o ceph_strings.o ceph_hash.o \ |
14 | pagevec.o | 14 | pagevec.o snapshot.o |
15 | 15 | ||
diff --git a/net/ceph/snapshot.c b/net/ceph/snapshot.c new file mode 100644 index 000000000000..154683f5f14c --- /dev/null +++ b/net/ceph/snapshot.c | |||
@@ -0,0 +1,78 @@ | |||
1 | /* | ||
2 | * snapshot.c Ceph snapshot context utility routines (part of libceph) | ||
3 | * | ||
4 | * Copyright (C) 2013 Inktank Storage, Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * version 2 as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | * General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
18 | * 02110-1301, USA. | ||
19 | */ | ||
20 | |||
21 | #include <stddef.h> | ||
22 | |||
23 | #include <linux/types.h> | ||
24 | #include <linux/export.h> | ||
25 | #include <linux/ceph/libceph.h> | ||
26 | |||
27 | /* | ||
28 | * Ceph snapshot contexts are reference counted objects, and the | ||
29 | * returned structure holds a single reference. Acquire additional | ||
30 | * references with ceph_get_snap_context(), and release them with | ||
31 | * ceph_put_snap_context(). When the reference count reaches zero | ||
32 | * the entire structure is freed. | ||
33 | */ | ||
34 | |||
35 | /* | ||
36 | * Create a new ceph snapshot context large enough to hold the | ||
37 | * indicated number of snapshot ids (which can be 0). Caller has | ||
38 | * to fill in snapc->seq and snapc->snaps[0..snap_count-1]. | ||
39 | * | ||
40 | * Returns a null pointer if an error occurs. | ||
41 | */ | ||
42 | struct ceph_snap_context *ceph_create_snap_context(u32 snap_count, | ||
43 | gfp_t gfp_flags) | ||
44 | { | ||
45 | struct ceph_snap_context *snapc; | ||
46 | size_t size; | ||
47 | |||
48 | size = sizeof (struct ceph_snap_context); | ||
49 | size += snap_count * sizeof (snapc->snaps[0]); | ||
50 | snapc = kzalloc(size, gfp_flags); | ||
51 | if (!snapc) | ||
52 | return NULL; | ||
53 | |||
54 | atomic_set(&snapc->nref, 1); | ||
55 | snapc->num_snaps = snap_count; | ||
56 | |||
57 | return snapc; | ||
58 | } | ||
59 | EXPORT_SYMBOL(ceph_create_snap_context); | ||
60 | |||
61 | struct ceph_snap_context *ceph_get_snap_context(struct ceph_snap_context *sc) | ||
62 | { | ||
63 | if (sc) | ||
64 | atomic_inc(&sc->nref); | ||
65 | return sc; | ||
66 | } | ||
67 | EXPORT_SYMBOL(ceph_get_snap_context); | ||
68 | |||
69 | void ceph_put_snap_context(struct ceph_snap_context *sc) | ||
70 | { | ||
71 | if (!sc) | ||
72 | return; | ||
73 | if (atomic_dec_and_test(&sc->nref)) { | ||
74 | /*printk(" deleting snap_context %p\n", sc);*/ | ||
75 | kfree(sc); | ||
76 | } | ||
77 | } | ||
78 | EXPORT_SYMBOL(ceph_put_snap_context); | ||