Blame view
net/ceph/snapshot.c
1.58 KB
04672fe6d
|
1 |
// SPDX-License-Identifier: GPL-2.0-only |
4f0dcb10c
|
2 3 4 5 |
/* * snapshot.c Ceph snapshot context utility routines (part of libceph) * * Copyright (C) 2013 Inktank Storage, Inc. |
4f0dcb10c
|
6 |
*/ |
4f0dcb10c
|
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#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; |
06dfa9639
|
37 |
refcount_set(&snapc->nref, 1); |
4f0dcb10c
|
38 39 40 41 42 43 44 45 46 |
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) |
06dfa9639
|
47 |
refcount_inc(&sc->nref); |
4f0dcb10c
|
48 49 50 51 52 53 54 55 |
return sc; } EXPORT_SYMBOL(ceph_get_snap_context); void ceph_put_snap_context(struct ceph_snap_context *sc) { if (!sc) return; |
06dfa9639
|
56 |
if (refcount_dec_and_test(&sc->nref)) { |
4f0dcb10c
|
57 58 59 60 61 62 |
/*printk(" deleting snap_context %p ", sc);*/ kfree(sc); } } EXPORT_SYMBOL(ceph_put_snap_context); |