X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Fspdk%2Focf%2Fsrc%2Futils%2Futils_refcnt.c;fp=ceph%2Fsrc%2Fspdk%2Focf%2Fsrc%2Futils%2Futils_refcnt.c;h=983a3f5246ccbf5a1ea089e2f7ca6895a1187d5e;hb=f67539c23b11f3b8a2ecaeeddf7a403ae1c442a8;hp=450092a79b4d473a734497baddbce353498064b7;hpb=64a4c04e6850c6d9086e4c37f57c4eada541b05e;p=ceph.git diff --git a/ceph/src/spdk/ocf/src/utils/utils_refcnt.c b/ceph/src/spdk/ocf/src/utils/utils_refcnt.c index 450092a79..983a3f524 100644 --- a/ceph/src/spdk/ocf/src/utils/utils_refcnt.c +++ b/ceph/src/spdk/ocf/src/utils/utils_refcnt.c @@ -13,26 +13,30 @@ void ocf_refcnt_init(struct ocf_refcnt *rc) rc->cb = NULL; } -void ocf_refcnt_dec(struct ocf_refcnt *rc) +int ocf_refcnt_dec(struct ocf_refcnt *rc) { int val = env_atomic_dec_return(&rc->counter); ENV_BUG_ON(val < 0); if (!val && env_atomic_cmpxchg(&rc->callback, 1, 0)) rc->cb(rc->priv); + + return val; } -bool ocf_refcnt_inc(struct ocf_refcnt *rc) +int ocf_refcnt_inc(struct ocf_refcnt *rc) { + int val; + if (!env_atomic_read(&rc->freeze)) { - env_atomic_inc(&rc->counter); + val = env_atomic_inc_return(&rc->counter); if (!env_atomic_read(&rc->freeze)) - return true; + return val; else ocf_refcnt_dec(rc); } - return false; + return 0; } @@ -59,3 +63,8 @@ void ocf_refcnt_unfreeze(struct ocf_refcnt *rc) int val = env_atomic_dec_return(&rc->freeze); ENV_BUG_ON(val < 0); } + +bool ocf_refcnt_frozen(struct ocf_refcnt *rc) +{ + return !!env_atomic_read(&rc->freeze); +}