예제 #1
0
파일: node.c 프로젝트: Distrotech/cdrkit
/*
 * NAME:	node->free()
 * DESCRIPTION:	deallocate a b*-tree node
 */
void n_free(node *np)
{
  btree *bt = np->bt;

  BMCLR(bt->map, np->nnum);
  ++bt->hdr.bthFree;

  bt->flags |= HFS_UPDATE_BTHDR;
}
예제 #2
0
/*
 * NAME:	vol->freeblocks()
 * DESCRIPTION:	deallocate a contiguous range of blocks
 */
void v_freeblocks(hfsvol *vol, const ExtDescriptor *blocks)
{
    unsigned int start, len, pt;
    const block *vbm;

    start = blocks->xdrStABN;
    len   = blocks->xdrNumABlks;
    vbm   = vol->vbm;

    vol->mdb.drFreeBks += len;

    for (pt = start; pt < start + len; ++pt)
        BMCLR(vbm, pt);

    vol->flags |= HFS_VOL_UPDATE_MDB | HFS_VOL_UPDATE_VBM;
}
예제 #3
0
파일: node.c 프로젝트: tycho/pearpc
/*
 * NAME:	node->free()
 * DESCRIPTION:	deallocate and remove a b*-tree node
 */
int n_free(node *np)
{
  btree *bt = np->bt;
  node sib;

  if (bt->hdr.bthFNode == np->nnum)
    bt->hdr.bthFNode = np->nd.ndFLink;

  if (bt->hdr.bthLNode == np->nnum)
    bt->hdr.bthLNode = np->nd.ndBLink;

  if (np->nd.ndFLink > 0)
    {
      if (bt_getnode(&sib, bt, np->nd.ndFLink) == -1)
	goto fail;

      sib.nd.ndBLink = np->nd.ndBLink;

      if (bt_putnode(&sib) == -1)
	goto fail;
    }

  if (np->nd.ndBLink > 0)
    {
      if (bt_getnode(&sib, bt, np->nd.ndBLink) == -1)
	goto fail;

      sib.nd.ndFLink = np->nd.ndFLink;

      if (bt_putnode(&sib) == -1)
	goto fail;
    }

  BMCLR(bt->map, np->nnum);
  ++bt->hdr.bthFree;

  bt->flags |= HFS_BT_UPDATE_HDR;

  return 0;

fail:
  return -1;
}