? src/fs/aufs/q Index: src/fs/aufs/aiops.c =================================================================== RCS file: /server/cvs-server/squid/squid/src/fs/aufs/aiops.c,v retrieving revision 1.12.2.1 diff -u -w -p -r1.12.2.1 aiops.c --- src/fs/aufs/aiops.c 21 Jul 2002 00:30:03 -0000 1.12.2.1 +++ src/fs/aufs/aiops.c 5 Nov 2002 11:16:55 -0000 @@ -185,7 +185,7 @@ squidaio_get_pool(int size) return p; } -static void * +void * squidaio_xmalloc(int size) { void *p; @@ -211,7 +211,7 @@ squidaio_xstrdup(const char *str) return p; } -static void +void squidaio_xfree(void *p, int size) { MemPool *pool; @@ -523,9 +523,6 @@ squidaio_cleanup_request(squidaio_reques squidaio_xstrfree(requestp->path); break; case _AIO_OP_READ: - if (!cancelled && requestp->ret > 0) - xmemcpy(requestp->bufferp, requestp->tmpbufp, requestp->ret); - squidaio_xfree(requestp->tmpbufp, requestp->buflen); break; case _AIO_OP_WRITE: squidaio_xfree(requestp->tmpbufp, requestp->buflen); @@ -596,7 +593,6 @@ squidaio_read(int fd, char *bufp, int bu requestp = memPoolAlloc(squidaio_request_pool); requestp->fd = fd; requestp->bufferp = bufp; - requestp->tmpbufp = (char *) squidaio_xmalloc(bufs); requestp->buflen = bufs; requestp->offset = offset; requestp->whence = whence; @@ -613,7 +609,7 @@ static void squidaio_do_read(squidaio_request_t * requestp) { lseek(requestp->fd, requestp->offset, requestp->whence); - requestp->ret = read(requestp->fd, requestp->tmpbufp, requestp->buflen); + requestp->ret = read(requestp->fd, requestp->bufferp, requestp->buflen); requestp->err = errno; } Index: src/fs/aufs/async_io.c =================================================================== RCS file: /server/cvs-server/squid/squid/src/fs/aufs/async_io.c,v retrieving revision 1.10.2.2 diff -u -w -p -r1.10.2.2 async_io.c --- src/fs/aufs/async_io.c 23 Aug 2002 22:31:53 -0000 1.10.2.2 +++ src/fs/aufs/async_io.c 5 Nov 2002 11:16:55 -0000 @@ -53,6 +53,7 @@ typedef struct squidaio_ctrl_t { AIOCB *done_handler; void *done_handler_data; squidaio_result_t result; + int len; char *bufp; FREE *free_func; dlink_node node; @@ -147,7 +148,7 @@ aioClose(int fd) void aioCancel(int fd) { - squidaio_ctrl_t *curr; + squidaio_ctrl_t *ctrlp; AIOCB *done_handler; void *their_data; dlink_node *m, *next; @@ -156,23 +157,29 @@ aioCancel(int fd) squidaio_counts.cancel++; for (m = used_list.head; m; m = next) { next = m->next; - curr = m->data; - if (curr->fd != fd) + ctrlp = m->data; + if (ctrlp->fd != fd) continue; - squidaio_cancel(&curr->result); + squidaio_cancel(&ctrlp->result); - if ((done_handler = curr->done_handler)) { - their_data = curr->done_handler_data; - curr->done_handler = NULL; - curr->done_handler_data = NULL; + if ((done_handler = ctrlp->done_handler)) { + their_data = ctrlp->done_handler_data; + ctrlp->done_handler = NULL; + ctrlp->done_handler_data = NULL; debug(32, 2) ("this be aioCancel\n"); if (cbdataValid(their_data)) - done_handler(fd, their_data, -2, -2); + done_handler(fd, their_data, NULL, -2, -2); cbdataUnlock(their_data); + /* free data if requested to aioWrite() */ + if (ctrlp->free_func) + ctrlp->free_func(ctrlp->bufp); + /* free temporary read buffer */ + if (ctrlp->operation == _AIO_READ) + squidaio_xfree(ctrlp->bufp, ctrlp->len); } dlinkDelete(m, &used_list); - memPoolFree(squidaio_ctrl_pool, curr); + memPoolFree(squidaio_ctrl_pool, ctrlp); } } @@ -206,7 +213,7 @@ aioWrite(int fd, int offset, char *bufp, void -aioRead(int fd, int offset, char *bufp, int len, AIOCB * callback, void *callback_data) +aioRead(int fd, int offset, int len, AIOCB * callback, void *callback_data) { squidaio_ctrl_t *ctrlp; int seekmode; @@ -218,6 +225,8 @@ aioRead(int fd, int offset, char *bufp, ctrlp->done_handler = callback; ctrlp->done_handler_data = callback_data; ctrlp->operation = _AIO_READ; + ctrlp->len = len; + ctrlp->bufp = squidaio_xmalloc(len); if (offset >= 0) seekmode = SEEK_SET; else { @@ -226,7 +235,7 @@ aioRead(int fd, int offset, char *bufp, } cbdataLock(callback_data); ctrlp->result.data = ctrlp; - squidaio_read(fd, bufp, len, offset, seekmode, &ctrlp->result); + squidaio_read(fd, ctrlp->bufp, len, offset, seekmode, &ctrlp->result); dlinkAdd(ctrlp, &ctrlp->node, &used_list); return; } /* aioRead */ @@ -309,14 +318,24 @@ aioCheckCallbacks(SwapDir * SD) ctrlp->done_handler_data = NULL; if (cbdataValid(their_data)) { retval = 1; /* Return that we've actually done some work */ - done_handler(ctrlp->fd, their_data, + done_handler(ctrlp->fd, their_data, ctrlp->bufp, ctrlp->result.aio_return, ctrlp->result.aio_errno); + } else { + if (ctrlp->operation == _AIO_OPEN) { + /* The open operation was aborted.. */ + int fd = ctrlp->result.aio_return; + if (fd >= 0) + aioClose(fd); + } } cbdataUnlock(their_data); } /* free data if requested to aioWrite() */ if (ctrlp->free_func) ctrlp->free_func(ctrlp->bufp); + /* free temporary read buffer */ + if (ctrlp->operation == _AIO_READ) + squidaio_xfree(ctrlp->bufp, ctrlp->len); if (ctrlp->operation == _AIO_CLOSE) aioFDWasClosed(ctrlp->fd); memPoolFree(squidaio_ctrl_pool, ctrlp); Index: src/fs/aufs/store_asyncufs.h =================================================================== RCS file: /server/cvs-server/squid/squid/src/fs/aufs/store_asyncufs.h,v retrieving revision 1.9 diff -u -w -p -r1.9 store_asyncufs.h --- src/fs/aufs/store_asyncufs.h 24 Aug 2001 14:29:35 -0000 1.9 +++ src/fs/aufs/store_asyncufs.h 5 Nov 2002 11:16:55 -0000 @@ -34,7 +34,7 @@ struct _squidaio_result_t { typedef struct _squidaio_result_t squidaio_result_t; -typedef void AIOCB(int fd, void *, int aio_return, int aio_errno); +typedef void AIOCB(int fd, void *cbdata, const char *buf, int aio_return, int aio_errno); int squidaio_cancel(squidaio_result_t *); int squidaio_open(const char *, int, mode_t, squidaio_result_t *); @@ -49,6 +49,8 @@ squidaio_result_t *squidaio_poll_done(vo int squidaio_operations_pending(void); int squidaio_sync(void); int squidaio_get_queue_len(void); +void *squidaio_xmalloc(int size); +void squidaio_xfree(void *p, int size); void aioInit(void); void aioDone(void); @@ -56,7 +58,7 @@ void aioCancel(int); void aioOpen(const char *, int, mode_t, AIOCB *, void *); void aioClose(int); void aioWrite(int, int offset, char *, int size, AIOCB *, void *, FREE *); -void aioRead(int, int offset, char *, int size, AIOCB *, void *); +void aioRead(int, int offset, int size, AIOCB *, void *); void aioStat(char *, struct stat *, AIOCB *, void *); void aioUnlink(const char *, AIOCB *, void *); void aioTruncate(const char *, off_t length, AIOCB *, void *); @@ -83,7 +85,7 @@ struct _squidaiostate_t { unsigned int read_kicking:1; unsigned int inreaddone:1; } flags; - const char *read_buf; + char *read_buf; link_list *pending_writes; link_list *pending_reads; }; Index: src/fs/aufs/store_io_aufs.c =================================================================== RCS file: /server/cvs-server/squid/squid/src/fs/aufs/store_io_aufs.c,v retrieving revision 1.15.2.5 diff -u -w -p -r1.15.2.5 store_io_aufs.c --- src/fs/aufs/store_io_aufs.c 11 Aug 2002 23:14:35 -0000 1.15.2.5 +++ src/fs/aufs/store_io_aufs.c 5 Nov 2002 11:16:55 -0000 @@ -18,7 +18,7 @@ static DWCB storeAufsWriteDone; #endif static void storeAufsIOCallback(storeIOState * sio, int errflag); static AIOCB storeAufsOpenDone; -static int storeAufsSomethingPending(storeIOState *); +static int storeAufsNeedCompletetion(storeIOState *); static int storeAufsKickWriteQueue(storeIOState * sio); static CBDUNL storeAufsIOFreeEntry; @@ -141,7 +141,7 @@ storeAufsClose(SwapDir * SD, storeIOStat squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate; debug(79, 3) ("storeAufsClose: dirno %d, fileno %08X, FD %d\n", sio->swap_dirn, sio->swap_filen, aiostate->fd); - if (storeAufsSomethingPending(sio)) { + if (storeAufsNeedCompletetion(sio)) { aiostate->flags.close_request = 1; return; } @@ -168,6 +168,7 @@ storeAufsRead(SwapDir * SD, storeIOState q->offset = offset; q->callback = callback; q->callback_data = callback_data; + cbdataLock(q->callback_data); linklistPush(&(aiostate->pending_reads), q); return; } @@ -180,7 +181,7 @@ storeAufsRead(SwapDir * SD, storeIOState sio->offset = offset; aiostate->flags.reading = 1; #if ASYNC_READ - aioRead(aiostate->fd, offset, buf, size, storeAufsReadDone, sio); + aioRead(aiostate->fd, offset, size, storeAufsReadDone, sio); #else file_read(aiostate->fd, buf, size, offset, storeAufsReadDone, sio); #endif @@ -262,13 +263,15 @@ storeAufsKickReadQueue(storeIOState * si return 0; debug(79, 3) ("storeAufsKickReadQueue: reading queued request of %ld bytes\n", (long int) q->size); + if (cbdataValid(q->callback_data)) storeAufsRead(INDEXSD(sio->swap_dirn), sio, q->buf, q->size, q->offset, q->callback, q->callback_data); + cbdataUnlock(q->callback_data); memPoolFree(aufs_qread_pool, q); return 1; } static void -storeAufsOpenDone(int unused, void *my_data, int fd, int errflag) +storeAufsOpenDone(int unused, void *my_data, const char *unused2, int fd, int errflag) { storeIOState *sio = my_data; squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate; @@ -289,7 +292,7 @@ storeAufsOpenDone(int unused, void *my_d if (FILE_MODE(sio->mode) == O_WRONLY) { if (storeAufsKickWriteQueue(sio)) return; - } else if (FILE_MODE(sio->mode) == O_RDONLY) { + } else if ((FILE_MODE(sio->mode) == O_RDONLY) && !aiostate->flags.close_request) { if (storeAufsKickReadQueue(sio)) return; } @@ -300,7 +303,7 @@ storeAufsOpenDone(int unused, void *my_d #if ASYNC_READ static void -storeAufsReadDone(int fd, void *my_data, int len, int errflag) +storeAufsReadDone(int fd, void *my_data, const char *buf, int len, int errflag) #else static void storeAufsReadDone(int fd, const char *buf, int len, int errflag, void *my_data) @@ -311,6 +314,7 @@ storeAufsReadDone(int fd, const char *bu STRCB *callback = sio->read.callback; void *their_data = sio->read.callback_data; ssize_t rlen; + int inreaddone = aiostate->flags.inreaddone; /* Protect from callback loops */ debug(79, 3) ("storeAufsReadDone: dirno %d, fileno %08X, FD %d, len %d\n", sio->swap_dirn, sio->swap_filen, fd, len); aiostate->flags.inreaddone = 1; @@ -337,11 +341,16 @@ storeAufsReadDone(int fd, const char *bu assert(their_data); sio->read.callback = NULL; sio->read.callback_data = NULL; - if (cbdataValid(their_data)) + if (!aiostate->flags.close_request && cbdataValid(their_data)) { +#if ASYNC_READ + if (rlen > 0) + memcpy(aiostate->read_buf, buf, rlen); +#endif callback(their_data, aiostate->read_buf, rlen); + } cbdataUnlock(their_data); aiostate->flags.inreaddone = 0; - if (aiostate->flags.close_request) + if (aiostate->flags.close_request && !inreaddone) storeAufsIOCallback(sio, errflag); } @@ -403,36 +412,37 @@ storeAufsIOCallback(storeIOState * sio, debug(79, 3) ("storeAufsIOCallback: errflag=%d\n", errflag); sio->callback = NULL; sio->callback_data = NULL; - debug(79, 3) ("%s:%d\n", __FILE__, __LINE__); + debug(79, 9) ("%s:%d\n", __FILE__, __LINE__); if (callback) if (NULL == their_data || cbdataValid(their_data)) callback(their_data, errflag, sio); - debug(79, 3) ("%s:%d\n", __FILE__, __LINE__); + debug(79, 9) ("%s:%d\n", __FILE__, __LINE__); cbdataUnlock(their_data); aiostate->fd = -1; cbdataFree(sio); if (fd < 0) return; - debug(79, 3) ("%s:%d\n", __FILE__, __LINE__); + debug(79, 9) ("%s:%d\n", __FILE__, __LINE__); aioClose(fd); fd_close(fd); store_open_disk_fd--; - debug(79, 3) ("%s:%d\n", __FILE__, __LINE__); + debug(79, 9) ("%s:%d\n", __FILE__, __LINE__); } static int -storeAufsSomethingPending(storeIOState * sio) +storeAufsNeedCompletetion(storeIOState * sio) { squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate; - if (aiostate->flags.reading) - return 1; + if (aiostate->flags.writing) return 1; - if (aiostate->flags.opening) + if (aiostate->flags.opening && FILE_MODE(sio->mode) == O_WRONLY) return 1; if (aiostate->flags.inreaddone) return 1; + + /* Note: Pending read operations are silently cancelled on close */ return 0; } @@ -443,7 +453,24 @@ storeAufsSomethingPending(storeIOState * * to bother with that. */ static void -storeAufsIOFreeEntry(void *sio) +storeAufsIOFreeEntry(void *siop) { - memPoolFree(squidaio_state_pool, ((storeIOState *) sio)->fsstate); + storeIOState *sio = (storeIOState *)siop; + squidaiostate_t *aiostate = (squidaiostate_t *)sio->fsstate; + struct _queued_write *qw; + struct _queued_read *qr; + while ((qw = linklistShift(&aiostate->pending_writes))) { + if (qw->free_func) + qw->free_func(qw->buf); + memPoolFree(aufs_qwrite_pool, qw); + } + while ((qr = linklistShift(&aiostate->pending_reads))) { + cbdataUnlock(qr->callback_data); + memPoolFree(aufs_qread_pool, qr); + } + if (sio->read.callback_data) + cbdataUnlock(sio->read.callback_data); + if (sio->callback_data) + cbdataUnlock(sio->callback_data); + memPoolFree(squidaio_state_pool, aiostate); }