aboutsummaryrefslogtreecommitdiff
path: root/kernel/vm/shadow.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/vm/shadow.c')
-rw-r--r--kernel/vm/shadow.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/kernel/vm/shadow.c b/kernel/vm/shadow.c
index 4166597..e0a8674 100644
--- a/kernel/vm/shadow.c
+++ b/kernel/vm/shadow.c
@@ -128,10 +128,10 @@ void shadow_collapse(mobj_t *o)
dbg(DBG_PRINT, "shadow_collapse: refcount bottom: %d\n", so->bottom_mobj->mo_refcount);
- while (shadowed->mo_type == MOBJ_SHADOW)
+ while (shadowed && shadowed->mo_type == MOBJ_SHADOW)
{
- mobj_shadow_t *so_shadowed = MOBJ_TO_SO(shadowed);
- mobj_t *shadowed_shadowed = so_shadowed->shadowed;
+ // mobj_shadow_t *so_shadowed = MOBJ_TO_SO(shadowed);
+ mobj_t *shadowed_shadowed = MOBJ_TO_SO(shadowed)->shadowed;
// if the refcount is not 1, then we can't collapse
if (shadowed_shadowed->mo_refcount != 1)
@@ -157,19 +157,14 @@ void shadow_collapse(mobj_t *o)
pframe_release(&pf_shadow);
}
}
- mobj_unlock(shadowed_shadowed);
-
- if (shadowed_shadowed->mo_type != MOBJ_SHADOW)
- {
- // put the shadowed object
- mobj_put(&shadowed);
- break;
- }
// get the pointer to the shadowed object
mobj_shadow_t *so_shadowed_shadowed = MOBJ_TO_SO(shadowed_shadowed);
so->shadowed = shadowed_shadowed;
+
+ mobj_lock(so->shadowed);
mobj_ref(so->shadowed);
+ mobj_unlock(so->shadowed);
// put the shadowed object
mobj_put(&shadowed);