fellow_cache: support freeing an fcs which contains itself

parent 2258cc41
...@@ -1406,6 +1406,7 @@ static void ...@@ -1406,6 +1406,7 @@ static void
fellow_cache_seg_free(struct buddy_returns *memret, fellow_cache_seg_free(struct buddy_returns *memret,
struct fellow_cache_seg *fcs, unsigned deref) struct fellow_cache_seg *fcs, unsigned deref)
{ {
struct buddy_ptr_extent mem;
CHECK_OBJ_NOTNULL(fcs, FELLOW_CACHE_SEG_MAGIC); CHECK_OBJ_NOTNULL(fcs, FELLOW_CACHE_SEG_MAGIC);
...@@ -1436,8 +1437,7 @@ fellow_cache_seg_free(struct buddy_returns *memret, ...@@ -1436,8 +1437,7 @@ fellow_cache_seg_free(struct buddy_returns *memret,
FCS_INCORE, FCS_DISK); FCS_INCORE, FCS_DISK);
fellow_cache_lru_chgbatch_apply(lcb); fellow_cache_lru_chgbatch_apply(lcb);
} }
if (fcs->alloc.ptr) TAKE(mem, fcs->alloc);
AN(buddy_return_ptr_extent(memret, &fcs->alloc));
AZ(fcs->fcs_onlru); AZ(fcs->fcs_onlru);
assert(fcs->refcnt == deref); assert(fcs->refcnt == deref);
fcs->refcnt = 0; fcs->refcnt = 0;
...@@ -1446,6 +1446,8 @@ fellow_cache_seg_free(struct buddy_returns *memret, ...@@ -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 * 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 * 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