linux/net/ceph/snapshot.c
<<
>>
Prefs
   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 */
  42struct 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}
  59EXPORT_SYMBOL(ceph_create_snap_context);
  60
  61struct 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}
  67EXPORT_SYMBOL(ceph_get_snap_context);
  68
  69void 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}
  78EXPORT_SYMBOL(ceph_put_snap_context);
  79