]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/ocf/src/utils/utils_refcnt.c
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / ocf / src / utils / utils_refcnt.c
index 450092a79b4d473a734497baddbce353498064b7..983a3f5246ccbf5a1ea089e2f7ca6895a1187d5e 100644 (file)
@@ -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);
+}