Пример #1
0
static void
storeAufsOpenDone(int unused, void *my_data, const char *unused2, int fd, int errflag)
{
    storeIOState *sio = my_data;
    squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
    debug(79, 3) ("storeAufsOpenDone: FD %d, errflag %d\n", fd, errflag);
    Opening_FD--;
    aiostate->flags.opening = 0;
    if (errflag || fd < 0) {
	errno = errflag;
	debug(79, 0) ("storeAufsOpenDone: %s\n", xstrerror());
	debug(79, 1) ("\t%s\n", storeAufsDirFullPath(INDEXSD(sio->swap_dirn), sio->swap_filen, NULL));
	storeAufsIOCallback(sio, DISK_ERROR);
	return;
    }
    store_open_disk_fd++;
    aiostate->fd = fd;
    commSetCloseOnExec(fd);
    fd_open(fd, FD_FILE, storeAufsDirFullPath(INDEXSD(sio->swap_dirn), sio->swap_filen, NULL));
    if (FILE_MODE(sio->mode) == O_WRONLY) {
	if (storeAufsKickWriteQueue(sio))
	    return;
    } else if ((FILE_MODE(sio->mode) == O_RDONLY) && !aiostate->flags.close_request) {
	if (storeAufsKickReadQueue(sio))
	    return;
#ifdef CC_FRAMEWORK
	if (storeAufsKickZCopyQueue(sio))
	    return;
#endif

    }
    if (aiostate->flags.close_request)
	storeAufsIOCallback(sio, errflag);
    debug(79, 3) ("storeAufsOpenDone: exiting\n");
}
Пример #2
0
static int
storeAufsKickWriteQueue(storeIOState * sio)
{
    squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
    struct _queued_write *q = linklistShift(&aiostate->pending_writes);
    if (NULL == q)
	return 0;
    debug(79, 3) ("storeAufsKickWriteQueue: writing queued chunk of %ld bytes\n",
	(long int) q->size);
    storeAufsWrite(INDEXSD(sio->swap_dirn), sio, q->buf, q->size, q->offset, q->free_func);
    memPoolFree(aufs_qwrite_pool, q);
    return 1;
}
Пример #3
0
static int
storeAufsKickZCopyQueue(storeIOState * sio)
{
    squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
    struct _queued_zcopy *q = linklistShift(&(aiostate->pending_zcopies));
    if (NULL == q)
	return 0;
    debug(79, 3) ("storeAufsKickReadQueue: zcopying queued request of %ld bytes\n",(long int) q->size);
    if (cbdataValid(q->callback_data))
	storeAufsZCopy(INDEXSD(sio->swap_dirn), sio, q->zc_target_fd, q->size, q->offset, q->callback, q->callback_data);
    cbdataUnlock(q->callback_data);
    memPoolFree(aufs_qzcopy_pool, q);
    return 1;
}
Пример #4
0
static void
storeDiskdReadDone(diomsg * M)
{
    storeIOState *sio = M->callback_data;
    STRCB *callback = sio->read.callback;
    SwapDir *sd = INDEXSD(sio->swap_dirn);
    diskdstate_t *diskdstate = sio->fsstate;
    diskdinfo_t *diskdinfo = sd->fsdata;
    void *their_data = sio->read.callback_data;
    char *their_buf = diskdstate->read_buf;
    char *sbuf;
    size_t len;
    int valid;
    statCounter.syscalls.disk.reads++;
    diskdstate->flags.reading = 0;
    if (diskdstate->flags.close_request) {
	debug(79, 2) ("storeDiskReadDone: closing, so ignore!\n");
	return;
    }
    valid = cbdataValid(sio->read.callback_data);
    cbdataUnlock(sio->read.callback_data);
    debug(79, 3) ("storeDiskdReadDone: dirno %d, fileno %08x status %d\n",
	sio->swap_dirn, sio->swap_filen, M->status);
    if (M->status < 0) {
	diskd_stats.read.fail++;
	storeDiskdIOCallback(sio, DISK_ERROR);
	return;
    }
    diskd_stats.read.success++;
    sbuf = diskdinfo->shm.buf + M->shm_offset;
    len = M->status;
    sio->offset += len;
    assert(callback);
    assert(their_data);
    sio->read.callback = NULL;
    sio->read.callback_data = NULL;
    if (valid) {
	assert(!diskdstate->flags.close_request);
	/*
	 * Only copy the data if the callback is still valid,
	 * if it isn't valid then the request should have been
	 * aborted.
	 *   -- adrian
	 */
	xmemcpy(their_buf, sbuf, len);	/* yucky copy */
	callback(their_data, their_buf, len);
    }
}
Пример #5
0
void
storeRecycle(StoreEntry * e)
{
    if (e->swap_dirn >= 0 && !storeEntryLocked(e)) {
	SwapDir *SD = INDEXSD(e->swap_dirn);

	/* Expire the object */
	storeExpireNow(e);
	storeReleaseRequest(e);

	/* Make the cache_dir forget about it */
	SD->obj.recycle(SD, e);
    }
    /* Finally make the store layer forget about this object */
    storeRelease(e);
}
Пример #6
0
static void
storeUfsIOCallback(storeIOState * sio, int errflag)
{
    ufsstate_t *ufsstate = (ufsstate_t *) sio->fsstate;
    debug(79, 3) ("storeUfsIOCallback: errflag=%d\n", errflag);
    if (ufsstate->fd > -1) {
	SwapDir *SD = INDEXSD(sio->swap_dirn);
	ufsinfo_t *ufsinfo = (ufsinfo_t *) SD->fsdata;
	file_close(ufsstate->fd);
	store_open_disk_fd--;
	ufsinfo->open_files--;
    }
    if (cbdataValid(sio->callback_data))
	sio->callback(sio->callback_data, errflag, sio);
    cbdataUnlock(sio->callback_data);
    sio->callback_data = NULL;
    sio->callback = NULL;
    cbdataFree(sio);
}
Пример #7
0
void
storeUnlink(StoreEntry * e)
{
    SwapDir *SD = INDEXSD(e->swap_dirn);
    SD->obj.unlink(SD, e);
}