2019-05-29 17:12:42 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2013-04-30 09:44:32 +04:00
/*
* snapshot . c Ceph snapshot context utility routines ( part of libceph )
*
* Copyright ( C ) 2013 Inktank Storage , Inc .
*/
# 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 ;
2017-03-17 15:10:27 +03:00
refcount_set ( & snapc - > nref , 1 ) ;
2013-04-30 09:44:32 +04:00
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 )
2017-03-17 15:10:27 +03:00
refcount_inc ( & sc - > nref ) ;
2013-04-30 09:44:32 +04:00
return sc ;
}
EXPORT_SYMBOL ( ceph_get_snap_context ) ;
void ceph_put_snap_context ( struct ceph_snap_context * sc )
{
if ( ! sc )
return ;
2017-03-17 15:10:27 +03:00
if ( refcount_dec_and_test ( & sc - > nref ) ) {
2013-04-30 09:44:32 +04:00
/*printk(" deleting snap_context %p\n", sc);*/
kfree ( sc ) ;
}
}
EXPORT_SYMBOL ( ceph_put_snap_context ) ;