Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
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);
}