-
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.
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 <[email protected]> Reviewed-by: Josh Durgin <[email protected]>
- Loading branch information
Alex Elder
authored and
Sage Weil
committed
May 2, 2013
1 parent
b536f69
commit 4f0dcb1
Showing
3 changed files
with
84 additions
and
26 deletions.
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
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
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,78 @@ | ||
/* | ||
* snapshot.c Ceph snapshot context utility routines (part of libceph) | ||
* | ||
* Copyright (C) 2013 Inktank Storage, Inc. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* version 2 as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
* 02110-1301, USA. | ||
*/ | ||
|
||
#include <stddef.h> | ||
|
||
#include <linux/types.h> | ||
#include <linux/export.h> | ||
#include <linux/ceph/libceph.h> | ||
|
||
/* | ||
* Ceph snapshot contexts are reference counted objects, and the | ||
* returned structure holds a single reference. Acquire additional | ||
* references with ceph_get_snap_context(), and release them with | ||
* ceph_put_snap_context(). When the reference count reaches zero | ||
* the entire structure is freed. | ||
*/ | ||
|
||
/* | ||
* Create a new ceph snapshot context large enough to hold the | ||
* indicated number of snapshot ids (which can be 0). Caller has | ||
* to fill in snapc->seq and snapc->snaps[0..snap_count-1]. | ||
* | ||
* Returns a null pointer if an error occurs. | ||
*/ | ||
struct ceph_snap_context *ceph_create_snap_context(u32 snap_count, | ||
gfp_t gfp_flags) | ||
{ | ||
struct ceph_snap_context *snapc; | ||
size_t size; | ||
|
||
size = sizeof (struct ceph_snap_context); | ||
size += snap_count * sizeof (snapc->snaps[0]); | ||
snapc = kzalloc(size, gfp_flags); | ||
if (!snapc) | ||
return NULL; | ||
|
||
atomic_set(&snapc->nref, 1); | ||
snapc->num_snaps = snap_count; | ||
|
||
return snapc; | ||
} | ||
EXPORT_SYMBOL(ceph_create_snap_context); | ||
|
||
struct ceph_snap_context *ceph_get_snap_context(struct ceph_snap_context *sc) | ||
{ | ||
if (sc) | ||
atomic_inc(&sc->nref); | ||
return sc; | ||
} | ||
EXPORT_SYMBOL(ceph_get_snap_context); | ||
|
||
void ceph_put_snap_context(struct ceph_snap_context *sc) | ||
{ | ||
if (!sc) | ||
return; | ||
if (atomic_dec_and_test(&sc->nref)) { | ||
/*printk(" deleting snap_context %p\n", sc);*/ | ||
kfree(sc); | ||
} | ||
} | ||
EXPORT_SYMBOL(ceph_put_snap_context); |