/* 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 }
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; }
/* 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 }
/* 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 }