diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-06 16:11:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-06 16:11:19 -0400 |
commit | 91f8575685e35f3bd021286bc82d26397458f5a9 (patch) | |
tree | 09de8d889758a12071adb9427ed741e27c907aa6 /net/ceph/snapshot.c | |
parent | 2e378f3eebd28feefbb1f9953834a5a19482f053 (diff) | |
parent | b5b09be30cf99f9c699e825629f02e3bce555d44 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
Pull Ceph changes from Alex Elder:
"This is a big pull.
Most of it is culmination of Alex's work to implement RBD image
layering, which is now complete (yay!).
There is also some work from Yan to fix i_mutex behavior surrounding
writes in cephfs, a sync write fix, a fix for RBD images that get
resized while they are mapped, and a few patches from me that resolve
annoying auth warnings and fix several bugs in the ceph auth code."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: (254 commits)
rbd: fix image request leak on parent read
libceph: use slab cache for osd client requests
libceph: allocate ceph message data with a slab allocator
libceph: allocate ceph messages with a slab allocator
rbd: allocate image object names with a slab allocator
rbd: allocate object requests with a slab allocator
rbd: allocate name separate from obj_request
rbd: allocate image requests with a slab allocator
rbd: use binary search for snapshot lookup
rbd: clear EXISTS flag if mapped snapshot disappears
rbd: kill off the snapshot list
rbd: define rbd_snap_size() and rbd_snap_features()
rbd: use snap_id not index to look up snap info
rbd: look up snapshot name in names buffer
rbd: drop obj_request->version
rbd: drop rbd_obj_method_sync() version parameter
rbd: more version parameter removal
rbd: get rid of some version parameters
rbd: stop tracking header object version
rbd: snap names are pointer to constant data
...
Diffstat (limited to 'net/ceph/snapshot.c')
-rw-r--r-- | net/ceph/snapshot.c | 78 |
1 files changed, 78 insertions, 0 deletions
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); | ||