示例#1
0
/* Write */
void
storeAufsWrite(SwapDir * SD, storeIOState * sio, char *buf, size_t size, squid_off_t offset, FREE * free_func)
{
    squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
    debug(79, 3) ("storeAufsWrite: dirno %d, fileno %08X, FD %d\n",
	sio->swap_dirn, sio->swap_filen, aiostate->fd);
    if (aiostate->fd < 0) {
	/* disk file not opened yet */
	struct _queued_write *q;
	assert(aiostate->flags.opening);
	q = memPoolAlloc(aufs_qwrite_pool);
	q->buf = buf;
	q->size = size;
	q->offset = (off_t) offset;
	q->free_func = free_func;
	linklistPush(&(aiostate->pending_writes), q);
	return;
    }
#if ASYNC_WRITE
    if (aiostate->flags.writing) {
	struct _queued_write *q;
	debug(79, 3) ("storeAufsWrite: queuing write\n");
	q = memPoolAlloc(aufs_qwrite_pool);
	q->buf = buf;
	q->size = size;
	q->offset = (off_t) offset;
	q->free_func = free_func;
	linklistPush(&(aiostate->pending_writes), q);
	return;
    }
    aiostate->flags.writing = 1;
    aioWrite(aiostate->fd, (off_t) offset, buf, size, storeAufsWriteDone, sio,
	free_func, INDEX_OF_SD(SD));
    statCounter.syscalls.disk.writes++;
#else
    file_write(aiostate->fd, (off_t) offset, buf, size, storeAufsWriteDone, sio,
	free_func);
    /* file_write() increments syscalls.disk.writes */
#endif
}
示例#2
0
static StoreEntry *
heap_purgeNext(RemovalPurgeWalker * walker)
{
    HeapPurgeData *heap_walker = walker->_data;
    RemovalPolicy *policy = walker->_policy;
    HeapPolicyData *heap = policy->_data;
    StoreEntry *entry;
    heap_key age;
  try_again:
    if (!heap_nodes(heap->heap) > 0)
	return NULL;		/* done */
    age = heap_peepminkey(heap->heap);
    entry = heap_extractmin(heap->heap);
    if (storeEntryLocked(entry)) {
	storeLockObject(entry);
	linklistPush(&heap_walker->locked_entries, entry);
	goto try_again;
    }
    heap_walker->min_age = age;
    SET_POLICY_NODE(entry, NULL);
    return entry;
}
示例#3
0
/* mighty zerocopy */
void
storeAufsZCopy(SwapDir * SD, storeIOState * sio, int targetfd, size_t size, squid_off_t offset, STRCB * callback, void *callback_data)
{
    squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
    assert(sio->zcopy.callback == NULL);
    assert(sio->zcopy.callback_data == NULL);
    assert(!aiostate->flags.zcopying);
    if (aiostate->fd < 0) {
	struct _queued_zcopy *q;
	debug(79, 3) ("storeAufsRead: queueing read because FD < 0\n");
	assert(aiostate->flags.opening);
	assert(aiostate->pending_zcopies == NULL);
	q = memPoolAlloc(aufs_qzcopy_pool);
	q->zc_target_fd = targetfd;
	q->size = size;
	q->offset = (off_t) offset;
	q->callback = callback;
	q->callback_data = callback_data;
	cbdataLock(q->callback_data);
	linklistPush(&(aiostate->pending_zcopies), q);
	return;
    }
    sio->zcopy.callback = callback;
    sio->zcopy.callback_data = callback_data;
    aiostate->zc_target_fd = targetfd;
    cbdataLock(callback_data);
    debug(79, 3) ("storeAufsRead: dirno %d, fileno %08X, FD %d\n",
	sio->swap_dirn, sio->swap_filen, aiostate->fd);
    sio->offset = offset;
    aiostate->flags.zcopying = 1;
#if ASYNC_ZCOPY
    aioZCopy(aiostate->fd, (off_t) offset, size, storeAufsZCopyDone, sio, targetfd, INDEX_OF_SD(SD));
    statCounter.syscalls.disk.zcopies++;
#else
    //FIXME
    assert(0);
#endif
}
示例#4
0
/* Read */
void
storeAufsRead(SwapDir * SD, storeIOState * sio, char *buf, size_t size, squid_off_t offset, STRCB * callback, void *callback_data)
{
    squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
    assert(sio->read.callback == NULL);
    assert(sio->read.callback_data == NULL);
    assert(!aiostate->flags.reading);
    if (aiostate->fd < 0) {
	struct _queued_read *q;
	debug(79, 3) ("storeAufsRead: queueing read because FD < 0\n");
	assert(aiostate->flags.opening);
	assert(aiostate->pending_reads == NULL);
	q = memPoolAlloc(aufs_qread_pool);
	q->buf = buf;
	q->size = size;
	q->offset = (off_t) offset;
	q->callback = callback;
	q->callback_data = callback_data;
	cbdataLock(q->callback_data);
	linklistPush(&(aiostate->pending_reads), q);
	return;
    }
    sio->read.callback = callback;
    sio->read.callback_data = callback_data;
    aiostate->read_buf = buf;
    cbdataLock(callback_data);
    debug(79, 3) ("storeAufsRead: dirno %d, fileno %08X, FD %d\n",
	sio->swap_dirn, sio->swap_filen, aiostate->fd);
    sio->offset = offset;
    aiostate->flags.reading = 1;
#if ASYNC_READ
    aioRead(aiostate->fd, (off_t) offset, size, storeAufsReadDone, sio, INDEX_OF_SD(SD));
    statCounter.syscalls.disk.reads++;
#else
    file_read(aiostate->fd, buf, size, (off_t) offset, storeAufsReadDone, sio);
    /* file_read() increments syscalls.disk.reads */
#endif
}