snapshot.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. #include <linux/types.h>
  21. #include <linux/export.h>
  22. #include <linux/ceph/libceph.h>
  23. /*
  24. * Ceph snapshot contexts are reference counted objects, and the
  25. * returned structure holds a single reference. Acquire additional
  26. * references with ceph_get_snap_context(), and release them with
  27. * ceph_put_snap_context(). When the reference count reaches zero
  28. * the entire structure is freed.
  29. */
  30. /*
  31. * Create a new ceph snapshot context large enough to hold the
  32. * indicated number of snapshot ids (which can be 0). Caller has
  33. * to fill in snapc->seq and snapc->snaps[0..snap_count-1].
  34. *
  35. * Returns a null pointer if an error occurs.
  36. */
  37. struct ceph_snap_context *ceph_create_snap_context(u32 snap_count,
  38. gfp_t gfp_flags)
  39. {
  40. struct ceph_snap_context *snapc;
  41. size_t size;
  42. size = sizeof (struct ceph_snap_context);
  43. size += snap_count * sizeof (snapc->snaps[0]);
  44. snapc = kzalloc(size, gfp_flags);
  45. if (!snapc)
  46. return NULL;
  47. refcount_set(&snapc->nref, 1);
  48. snapc->num_snaps = snap_count;
  49. return snapc;
  50. }
  51. EXPORT_SYMBOL(ceph_create_snap_context);
  52. struct ceph_snap_context *ceph_get_snap_context(struct ceph_snap_context *sc)
  53. {
  54. if (sc)
  55. refcount_inc(&sc->nref);
  56. return sc;
  57. }
  58. EXPORT_SYMBOL(ceph_get_snap_context);
  59. void ceph_put_snap_context(struct ceph_snap_context *sc)
  60. {
  61. if (!sc)
  62. return;
  63. if (refcount_dec_and_test(&sc->nref)) {
  64. /*printk(" deleting snap_context %p\n", sc);*/
  65. kfree(sc);
  66. }
  67. }
  68. EXPORT_SYMBOL(ceph_put_snap_context);