diff options
-rw-r--r-- | kernel/fs/s5fs/s5fs_subr.c | 3 | ||||
-rw-r--r-- | kernel/mm/mobj.c | 23 |
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 */ |