aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/fs/s5fs/s5fs_subr.c3
-rw-r--r--kernel/mm/mobj.c23
2 files changed, 26 insertions, 0 deletions
diff --git a/kernel/fs/s5fs/s5fs_subr.c b/kernel/fs/s5fs/s5fs_subr.c
index 33b03c9..27b6a92 100644
--- a/kernel/fs/s5fs/s5fs_subr.c
+++ b/kernel/fs/s5fs/s5fs_subr.c
@@ -268,6 +268,9 @@ static void s5_free_block(s5fs_t *s5fs, blocknum_t blockno)
else
{
s->s5s_free_blocks[s->s5s_nfree++] = blockno;
+ // only delete in this case b/c in first case we're still using that
+ // block as a "meta" block, just to store free block numbers
+ mobj_delete_pframe(&s5fs->s5f_mobj, blockno);
}
s5_unlock_super(s5fs);
}
diff --git a/kernel/mm/mobj.c b/kernel/mm/mobj.c
index 02aced7..3a591f2 100644
--- a/kernel/mm/mobj.c
+++ b/kernel/mm/mobj.c
@@ -282,6 +282,29 @@ long mobj_free_pframe(mobj_t *o, pframe_t **pfp)
return 0;
}
+void mobj_delete_pframe(mobj_t *o, size_t pagenum)
+{
+ pframe_t *pf;
+ list_iterate(&o->mo_pframes, p, pframe_t, pf_link)
+ {
+ if (p->pf_pagenum == pagenum)
+ pf = p;
+ }
+
+ if (pf)
+ {
+ kmutex_lock(&pf->pf_mutex);
+ list_remove(&pf->pf_link);
+
+ pf->pf_dirty = 0;
+ if (pf->pf_addr)
+ {
+ page_free(pf->pf_addr);
+ pf->pf_addr = NULL;
+ }
+ pframe_free(&pf);
+ }
+}
/*
* Simply flush the memory object
*/