static void bce_delete(struct bcentry *bce, int flush) { pthread_rwlock_wrlock(&bce->lock); if (bce->type != BCE_DAD) { del_task(&bce->tqe); if (bce->type != BCE_NONCE_BLOCK) xfrm_del_bce(&bce->our_addr, &bce->peer_addr); } if (bce->cleanup) bce->cleanup(bce); if (!flush && (bce->type == BCE_CACHED || bce->type == BCE_CACHE_DYING)) { struct timespec minlft; if (!rr_cn_nonce_lft(bce->nonce_hoa, &minlft)) { bce->type = BCE_NONCE_BLOCK; add_task_abs(&minlft, &bce->tqe, _expire); pthread_rwlock_unlock(&bce->lock); return; } } bcache_count--; hash_delete(&bc_hash, &bce->our_addr, &bce->peer_addr); pthread_rwlock_unlock(&bce->lock); bcache_free(bce); }
static int bd_close(struct open_file *f) { struct i386_devdesc *dev = f->f_devdata; struct open_disk *od = (struct open_disk *)(dev->d_kind.biosdisk.data); BD(dev).bd_open--; if (BD(dev).bd_open == 0) { bcache_free(BD(dev).bd_bcache); BD(dev).bd_bcache = NULL; } bd_closedisk(od); return(0); }
static int efipart_close(struct open_file *f) { struct devdesc *dev; dev = (struct devdesc *)(f->f_devdata); if (dev->d_opendata == NULL) return (EINVAL); dev->d_opendata = NULL; PD(dev).pd_open--; if (PD(dev).pd_open == 0) { bcache_free(PD(dev).pd_bcache); PD(dev).pd_bcache = NULL; } return (0); }