Return post modification value from ocf_refcnt_inc/dec
If counter is frozen then increment returns 0. Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
parent
962f9d17d1
commit
0e15c693fd
@ -156,7 +156,7 @@ static inline ocf_core_t ocf_volume_to_core(ocf_volume_t volume)
|
||||
static inline int ocf_io_set_dirty(ocf_cache_t cache,
|
||||
struct ocf_core_io *core_io)
|
||||
{
|
||||
core_io->dirty = ocf_refcnt_inc(&cache->refcnt.dirty);
|
||||
core_io->dirty = !!ocf_refcnt_inc(&cache->refcnt.dirty);
|
||||
return core_io->dirty ? 0 : -EBUSY;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -22,15 +22,16 @@ struct ocf_refcnt
|
||||
/* Initialize reference counter */
|
||||
void ocf_refcnt_init(struct ocf_refcnt *rc);
|
||||
|
||||
/* Try to increment counter. Returns true if successfull, false if freezed */
|
||||
bool ocf_refcnt_inc(struct ocf_refcnt *rc);
|
||||
/* Try to increment counter. Returns counter value (> 0) if successfull, 0
|
||||
* if counter is frozen */
|
||||
int ocf_refcnt_inc(struct ocf_refcnt *rc);
|
||||
|
||||
/* Decrement reference counter */
|
||||
void ocf_refcnt_dec(struct ocf_refcnt *rc);
|
||||
/* Decrement reference counter and return post-decrement value */
|
||||
int ocf_refcnt_dec(struct ocf_refcnt *rc);
|
||||
|
||||
/* Disallow incrementing of underlying counter - attempts to increment counter
|
||||
* will be failing until ocf_refcnt_unfreeze is calleed.
|
||||
* It's ok to call freeze multiple times, in which case counter is freezed
|
||||
* It's ok to call freeze multiple times, in which case counter is frozen
|
||||
* until all freeze calls are offset by a corresponding unfreeze.*/
|
||||
void ocf_refcnt_freeze(struct ocf_refcnt *rc);
|
||||
|
||||
@ -40,7 +41,7 @@ void ocf_refcnt_unfreeze(struct ocf_refcnt *rc);
|
||||
bool ocf_refcnt_frozen(struct ocf_refcnt *rc);
|
||||
|
||||
/* Register callback to be called when reference counter drops to 0.
|
||||
* Must be called after counter is freezed.
|
||||
* Must be called after counter is frozen.
|
||||
* Cannot be called until previously regsitered callback had fired. */
|
||||
void ocf_refcnt_register_zero_cb(struct ocf_refcnt *rc, ocf_refcnt_cb_t cb,
|
||||
void *priv);
|
||||
|
Loading…
Reference in New Issue
Block a user