/* * See the comment in vfs.h for what is expected of this function. * * When this function returns, the inode refcount should be decremented. * * You probably want to use s5_free_inode() if there are no more links to * the inode, and dont forget to unpin the page */ static void s5fs_delete_vnode(vnode_t *vnode) { pframe_t *p; mmobj_t *fs_mmobj = S5FS_TO_VMOBJ(VNODE_TO_S5FS(vnode)); if (pframe_get(fs_mmobj, S5_INODE_BLOCK(vnode->vn_vno), &p)){ panic("pframe_get failed. What the hell do we do?\n"); } s5_inode_t *inode = ((s5_inode_t *) p->pf_addr) + S5_INODE_OFFSET(vnode->vn_vno); dbg(DBG_S5FS, "decrementing link count on inode %d from %d to %d\n", inode->s5_number, inode->s5_linkcount,inode->s5_linkcount - 1); inode->s5_linkcount--; if (inode->s5_linkcount == 0){ s5_free_inode(vnode); } else { s5_dirty_inode(VNODE_TO_S5FS(vnode), inode); } pframe_unpin(p); }
/* * s5fs_delete_vnode: * s5fs_delete_vnode is called by vput when the * specified vnode_t no longer needs to exist * param *vnode: the pointer to the vnode object */ static void s5fs_delete_vnode(vnode_t *vnode) { dbg(DBG_S5FS, "{\n"); KASSERT(vnode != NULL); KASSERT(vnode->vn_fs != NULL); /* Lock */ kmutex_lock(&vnode->vn_mutex); pframe_t* page = NULL; int ret = pframe_get(S5FS_TO_VMOBJ(FS_TO_S5FS(vnode->vn_fs)), S5_INODE_BLOCK(vnode->vn_vno), &page); KASSERT(ret == 0); KASSERT(page != NULL); s5_inode_t* inode = ((s5_inode_t*)page->pf_addr) + S5_INODE_OFFSET(vnode->vn_vno); inode->s5_linkcount--; s5_dirty_inode(VNODE_TO_S5FS(vnode), inode); KASSERT(VNODE_TO_S5INODE(vnode) == inode); KASSERT(inode->s5_linkcount >= 0); if (inode->s5_linkcount== 0) { s5_free_inode(vnode); } pframe_unpin(page); /* Unlock */ kmutex_unlock(&vnode->vn_mutex); dbg(DBG_S5FS, "}\n"); }