fellow_cache: support freeing an fcs which contains itself

parent 2258cc41
......@@ -1406,6 +1406,7 @@ static void
fellow_cache_seg_free(struct buddy_returns *memret,
struct fellow_cache_seg *fcs, unsigned deref)
{
struct buddy_ptr_extent mem;
CHECK_OBJ_NOTNULL(fcs, FELLOW_CACHE_SEG_MAGIC);
......@@ -1436,8 +1437,7 @@ fellow_cache_seg_free(struct buddy_returns *memret,
FCS_INCORE, FCS_DISK);
fellow_cache_lru_chgbatch_apply(lcb);
}
if (fcs->alloc.ptr)
AN(buddy_return_ptr_extent(memret, &fcs->alloc));
TAKE(mem, fcs->alloc);
AZ(fcs->fcs_onlru);
assert(fcs->refcnt == deref);
fcs->refcnt = 0;
......@@ -1446,6 +1446,8 @@ fellow_cache_seg_free(struct buddy_returns *memret,
* at this point, the fcs is not consistent in all cases, e.g. FCS_EVICT
* has no memory - but this is the point where it does no longer exist
*/
if (mem.ptr)
AN(buddy_return_ptr_extent(memret, &mem));
}
/*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment