1 Index: squid/src/fs/aufs/aiops.c
2 diff -c squid/src/fs/aufs/aiops.c:1.12.2.1 squid/src/fs/aufs/aiops.c:1.12.2.2
3 *** squid/src/fs/aufs/aiops.c:1.12.2.1 Sat Jul 20 18:30:03 2002
4 --- squid/src/fs/aufs/aiops.c Sat Nov 9 03:42:36 2002
11 squidaio_xmalloc(int size)
19 squidaio_xmalloc(int size)
28 squidaio_xfree(void *p, int size)
36 squidaio_xfree(void *p, int size)
41 squidaio_xstrfree(requestp->path);
44 - if (!cancelled && requestp->ret > 0)
45 - xmemcpy(requestp->bufferp, requestp->tmpbufp, requestp->ret);
46 - squidaio_xfree(requestp->tmpbufp, requestp->buflen);
49 squidaio_xfree(requestp->tmpbufp, requestp->buflen);
53 requestp = memPoolAlloc(squidaio_request_pool);
55 requestp->bufferp = bufp;
56 - requestp->tmpbufp = (char *) squidaio_xmalloc(bufs);
57 requestp->buflen = bufs;
58 requestp->offset = offset;
59 requestp->whence = whence;
63 squidaio_do_read(squidaio_request_t * requestp)
65 lseek(requestp->fd, requestp->offset, requestp->whence);
66 ! requestp->ret = read(requestp->fd, requestp->tmpbufp, requestp->buflen);
67 requestp->err = errno;
71 squidaio_do_read(squidaio_request_t * requestp)
73 lseek(requestp->fd, requestp->offset, requestp->whence);
74 ! requestp->ret = read(requestp->fd, requestp->bufferp, requestp->buflen);
75 requestp->err = errno;
78 Index: squid/src/fs/aufs/async_io.c
79 diff -c squid/src/fs/aufs/async_io.c:1.10.2.2 squid/src/fs/aufs/async_io.c:1.10.2.4
80 *** squid/src/fs/aufs/async_io.c:1.10.2.2 Fri Aug 23 16:31:53 2002
81 --- squid/src/fs/aufs/async_io.c Sun Nov 10 05:06:07 2002
86 void *done_handler_data;
87 squidaio_result_t result;
97 ! squidaio_ctrl_t *curr;
100 dlink_node *m, *next;
105 ! squidaio_ctrl_t *ctrlp;
108 dlink_node *m, *next;
111 squidaio_counts.cancel++;
112 for (m = used_list.head; m; m = next) {
115 ! if (curr->fd != fd)
118 ! squidaio_cancel(&curr->result);
120 ! if ((done_handler = curr->done_handler)) {
121 ! their_data = curr->done_handler_data;
122 ! curr->done_handler = NULL;
123 ! curr->done_handler_data = NULL;
124 ! debug(32, 2) ("this be aioCancel\n");
125 if (cbdataValid(their_data))
126 ! done_handler(fd, their_data, -2, -2);
127 cbdataUnlock(their_data);
129 dlinkDelete(m, &used_list);
130 ! memPoolFree(squidaio_ctrl_pool, curr);
135 squidaio_counts.cancel++;
136 for (m = used_list.head; m; m = next) {
139 ! if (ctrlp->fd != fd)
142 ! squidaio_cancel(&ctrlp->result);
144 ! if ((done_handler = ctrlp->done_handler)) {
145 ! their_data = ctrlp->done_handler_data;
146 ! ctrlp->done_handler = NULL;
147 ! ctrlp->done_handler_data = NULL;
148 ! debug(32, 0) ("this be aioCancel. Danger ahead!\n");
149 if (cbdataValid(their_data))
150 ! done_handler(fd, their_data, NULL, -2, -2);
151 cbdataUnlock(their_data);
152 + /* free data if requested to aioWrite() */
153 + if (ctrlp->free_func)
154 + ctrlp->free_func(ctrlp->bufp);
155 + /* free temporary read buffer */
156 + if (ctrlp->operation == _AIO_READ)
157 + squidaio_xfree(ctrlp->bufp, ctrlp->len);
159 dlinkDelete(m, &used_list);
160 ! memPoolFree(squidaio_ctrl_pool, ctrlp);
169 ! aioRead(int fd, int offset, char *bufp, int len, AIOCB * callback, void *callback_data)
171 squidaio_ctrl_t *ctrlp;
177 ! aioRead(int fd, int offset, int len, AIOCB * callback, void *callback_data)
179 squidaio_ctrl_t *ctrlp;
184 ctrlp->done_handler = callback;
185 ctrlp->done_handler_data = callback_data;
186 ctrlp->operation = _AIO_READ;
188 + ctrlp->bufp = squidaio_xmalloc(len);
195 cbdataLock(callback_data);
196 ctrlp->result.data = ctrlp;
197 ! squidaio_read(fd, bufp, len, offset, seekmode, &ctrlp->result);
198 dlinkAdd(ctrlp, &ctrlp->node, &used_list);
203 cbdataLock(callback_data);
204 ctrlp->result.data = ctrlp;
205 ! squidaio_read(fd, ctrlp->bufp, len, offset, seekmode, &ctrlp->result);
206 dlinkAdd(ctrlp, &ctrlp->node, &used_list);
211 ctrlp->done_handler_data = NULL;
212 if (cbdataValid(their_data)) {
213 retval = 1; /* Return that we've actually done some work */
214 ! done_handler(ctrlp->fd, their_data,
215 ctrlp->result.aio_return, ctrlp->result.aio_errno);
217 cbdataUnlock(their_data);
219 /* free data if requested to aioWrite() */
220 if (ctrlp->free_func)
221 ctrlp->free_func(ctrlp->bufp);
222 if (ctrlp->operation == _AIO_CLOSE)
223 aioFDWasClosed(ctrlp->fd);
224 memPoolFree(squidaio_ctrl_pool, ctrlp);
226 ctrlp->done_handler_data = NULL;
227 if (cbdataValid(their_data)) {
228 retval = 1; /* Return that we've actually done some work */
229 ! done_handler(ctrlp->fd, their_data, ctrlp->bufp,
230 ctrlp->result.aio_return, ctrlp->result.aio_errno);
232 + if (ctrlp->operation == _AIO_OPEN) {
233 + /* The open operation was aborted.. */
234 + int fd = ctrlp->result.aio_return;
239 cbdataUnlock(their_data);
241 /* free data if requested to aioWrite() */
242 if (ctrlp->free_func)
243 ctrlp->free_func(ctrlp->bufp);
244 + /* free temporary read buffer */
245 + if (ctrlp->operation == _AIO_READ)
246 + squidaio_xfree(ctrlp->bufp, ctrlp->len);
247 if (ctrlp->operation == _AIO_CLOSE)
248 aioFDWasClosed(ctrlp->fd);
249 memPoolFree(squidaio_ctrl_pool, ctrlp);
250 Index: squid/src/fs/aufs/store_asyncufs.h
251 diff -c squid/src/fs/aufs/store_asyncufs.h:1.9 squid/src/fs/aufs/store_asyncufs.h:1.9.2.1
252 *** squid/src/fs/aufs/store_asyncufs.h:1.9 Fri Aug 24 08:29:35 2001
253 --- squid/src/fs/aufs/store_asyncufs.h Sat Nov 9 03:42:36 2002
257 typedef struct _squidaio_result_t squidaio_result_t;
259 ! typedef void AIOCB(int fd, void *, int aio_return, int aio_errno);
261 int squidaio_cancel(squidaio_result_t *);
262 int squidaio_open(const char *, int, mode_t, squidaio_result_t *);
265 typedef struct _squidaio_result_t squidaio_result_t;
267 ! typedef void AIOCB(int fd, void *cbdata, const char *buf, int aio_return, int aio_errno);
269 int squidaio_cancel(squidaio_result_t *);
270 int squidaio_open(const char *, int, mode_t, squidaio_result_t *);
274 int squidaio_operations_pending(void);
275 int squidaio_sync(void);
276 int squidaio_get_queue_len(void);
277 + void *squidaio_xmalloc(int size);
278 + void squidaio_xfree(void *p, int size);
284 void aioOpen(const char *, int, mode_t, AIOCB *, void *);
286 void aioWrite(int, int offset, char *, int size, AIOCB *, void *, FREE *);
287 ! void aioRead(int, int offset, char *, int size, AIOCB *, void *);
288 void aioStat(char *, struct stat *, AIOCB *, void *);
289 void aioUnlink(const char *, AIOCB *, void *);
290 void aioTruncate(const char *, off_t length, AIOCB *, void *);
292 void aioOpen(const char *, int, mode_t, AIOCB *, void *);
294 void aioWrite(int, int offset, char *, int size, AIOCB *, void *, FREE *);
295 ! void aioRead(int, int offset, int size, AIOCB *, void *);
296 void aioStat(char *, struct stat *, AIOCB *, void *);
297 void aioUnlink(const char *, AIOCB *, void *);
298 void aioTruncate(const char *, off_t length, AIOCB *, void *);
301 unsigned int read_kicking:1;
302 unsigned int inreaddone:1;
304 ! const char *read_buf;
305 link_list *pending_writes;
306 link_list *pending_reads;
309 unsigned int read_kicking:1;
310 unsigned int inreaddone:1;
313 link_list *pending_writes;
314 link_list *pending_reads;
316 Index: squid/src/fs/aufs/store_io_aufs.c
317 diff -c squid/src/fs/aufs/store_io_aufs.c:1.15.2.5 squid/src/fs/aufs/store_io_aufs.c:1.15.2.9
318 *** squid/src/fs/aufs/store_io_aufs.c:1.15.2.5 Sun Aug 11 17:14:35 2002
319 --- squid/src/fs/aufs/store_io_aufs.c Thu Nov 14 23:33:25 2002
323 static void storeAufsIOCallback(storeIOState * sio, int errflag);
324 static AIOCB storeAufsOpenDone;
325 ! static int storeAufsSomethingPending(storeIOState *);
326 static int storeAufsKickWriteQueue(storeIOState * sio);
327 static CBDUNL storeAufsIOFreeEntry;
331 static void storeAufsIOCallback(storeIOState * sio, int errflag);
332 static AIOCB storeAufsOpenDone;
333 ! static int storeAufsNeedCompletetion(storeIOState *);
334 static int storeAufsKickWriteQueue(storeIOState * sio);
335 static CBDUNL storeAufsIOFreeEntry;
339 squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
340 debug(79, 3) ("storeAufsClose: dirno %d, fileno %08X, FD %d\n",
341 sio->swap_dirn, sio->swap_filen, aiostate->fd);
342 ! if (storeAufsSomethingPending(sio)) {
343 aiostate->flags.close_request = 1;
347 squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
348 debug(79, 3) ("storeAufsClose: dirno %d, fileno %08X, FD %d\n",
349 sio->swap_dirn, sio->swap_filen, aiostate->fd);
350 ! if (storeAufsNeedCompletetion(sio)) {
351 aiostate->flags.close_request = 1;
358 q->callback = callback;
359 q->callback_data = callback_data;
360 + cbdataLock(q->callback_data);
361 linklistPush(&(aiostate->pending_reads), q);
366 sio->offset = offset;
367 aiostate->flags.reading = 1;
369 ! aioRead(aiostate->fd, offset, buf, size, storeAufsReadDone, sio);
371 file_read(aiostate->fd, buf, size, offset, storeAufsReadDone, sio);
374 sio->offset = offset;
375 aiostate->flags.reading = 1;
377 ! aioRead(aiostate->fd, offset, size, storeAufsReadDone, sio);
379 file_read(aiostate->fd, buf, size, offset, storeAufsReadDone, sio);
384 debug(79, 3) ("storeAufsKickReadQueue: reading queued request of %ld bytes\n",
386 ! storeAufsRead(INDEXSD(sio->swap_dirn), sio, q->buf, q->size, q->offset, q->callback, q->callback_data);
387 memPoolFree(aufs_qread_pool, q);
392 ! storeAufsOpenDone(int unused, void *my_data, int fd, int errflag)
394 storeIOState *sio = my_data;
395 squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
398 debug(79, 3) ("storeAufsKickReadQueue: reading queued request of %ld bytes\n",
400 ! if (cbdataValid(q->callback_data))
401 ! storeAufsRead(INDEXSD(sio->swap_dirn), sio, q->buf, q->size, q->offset, q->callback, q->callback_data);
402 ! cbdataUnlock(q->callback_data);
403 memPoolFree(aufs_qread_pool, q);
408 ! storeAufsOpenDone(int unused, void *my_data, const char *unused2, int fd, int errflag)
410 storeIOState *sio = my_data;
411 squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
414 if (FILE_MODE(sio->mode) == O_WRONLY) {
415 if (storeAufsKickWriteQueue(sio))
417 ! } else if (FILE_MODE(sio->mode) == O_RDONLY) {
418 if (storeAufsKickReadQueue(sio))
422 if (FILE_MODE(sio->mode) == O_WRONLY) {
423 if (storeAufsKickWriteQueue(sio))
425 ! } else if ((FILE_MODE(sio->mode) == O_RDONLY) && !aiostate->flags.close_request) {
426 if (storeAufsKickReadQueue(sio))
434 ! storeAufsReadDone(int fd, void *my_data, int len, int errflag)
437 storeAufsReadDone(int fd, const char *buf, int len, int errflag, void *my_data)
442 ! storeAufsReadDone(int fd, void *my_data, const char *buf, int len, int errflag)
445 storeAufsReadDone(int fd, const char *buf, int len, int errflag, void *my_data)
449 STRCB *callback = sio->read.callback;
450 void *their_data = sio->read.callback_data;
452 + int inreaddone = aiostate->flags.inreaddone; /* Protect from callback loops */
453 debug(79, 3) ("storeAufsReadDone: dirno %d, fileno %08X, FD %d, len %d\n",
454 sio->swap_dirn, sio->swap_filen, fd, len);
455 aiostate->flags.inreaddone = 1;
459 sio->read.callback = NULL;
460 sio->read.callback_data = NULL;
461 ! if (cbdataValid(their_data))
462 callback(their_data, aiostate->read_buf, rlen);
463 cbdataUnlock(their_data);
464 aiostate->flags.inreaddone = 0;
465 ! if (aiostate->flags.close_request)
466 storeAufsIOCallback(sio, errflag);
471 sio->read.callback = NULL;
472 sio->read.callback_data = NULL;
473 ! if (!aiostate->flags.close_request && cbdataValid(their_data)) {
476 ! memcpy(aiostate->read_buf, buf, rlen);
478 callback(their_data, aiostate->read_buf, rlen);
480 cbdataUnlock(their_data);
481 aiostate->flags.inreaddone = 0;
482 ! if (aiostate->flags.close_request && !inreaddone)
483 storeAufsIOCallback(sio, errflag);
488 debug(79, 3) ("storeAufsIOCallback: errflag=%d\n", errflag);
489 sio->callback = NULL;
490 sio->callback_data = NULL;
491 ! debug(79, 3) ("%s:%d\n", __FILE__, __LINE__);
493 if (NULL == their_data || cbdataValid(their_data))
494 callback(their_data, errflag, sio);
495 ! debug(79, 3) ("%s:%d\n", __FILE__, __LINE__);
496 cbdataUnlock(their_data);
501 ! debug(79, 3) ("%s:%d\n", __FILE__, __LINE__);
504 store_open_disk_fd--;
505 ! debug(79, 3) ("%s:%d\n", __FILE__, __LINE__);
510 ! storeAufsSomethingPending(storeIOState * sio)
512 squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
513 ! if (aiostate->flags.reading)
515 if (aiostate->flags.writing)
517 ! if (aiostate->flags.opening)
519 if (aiostate->flags.inreaddone)
525 debug(79, 3) ("storeAufsIOCallback: errflag=%d\n", errflag);
526 sio->callback = NULL;
527 sio->callback_data = NULL;
528 ! debug(79, 9) ("%s:%d\n", __FILE__, __LINE__);
530 if (NULL == their_data || cbdataValid(their_data))
531 callback(their_data, errflag, sio);
532 ! debug(79, 9) ("%s:%d\n", __FILE__, __LINE__);
533 cbdataUnlock(their_data);
536 + if (aiostate->flags.opening)
540 ! debug(79, 9) ("%s:%d\n", __FILE__, __LINE__);
543 store_open_disk_fd--;
544 ! debug(79, 9) ("%s:%d\n", __FILE__, __LINE__);
549 ! storeAufsNeedCompletetion(storeIOState * sio)
551 squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
553 if (aiostate->flags.writing)
555 ! if (aiostate->flags.opening && FILE_MODE(sio->mode) == O_WRONLY)
557 ! if (aiostate->flags.reading)
559 if (aiostate->flags.inreaddone)
567 * to bother with that.
570 ! storeAufsIOFreeEntry(void *sio)
572 ! memPoolFree(squidaio_state_pool, ((storeIOState *) sio)->fsstate);
575 * to bother with that.
578 ! storeAufsIOFreeEntry(void *siop)
580 ! storeIOState *sio = (storeIOState *) siop;
581 ! squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
582 ! struct _queued_write *qw;
583 ! struct _queued_read *qr;
584 ! while ((qw = linklistShift(&aiostate->pending_writes))) {
586 ! qw->free_func(qw->buf);
587 ! memPoolFree(aufs_qwrite_pool, qw);
589 ! while ((qr = linklistShift(&aiostate->pending_reads))) {
590 ! cbdataUnlock(qr->callback_data);
591 ! memPoolFree(aufs_qread_pool, qr);
593 ! if (sio->read.callback_data)
594 ! cbdataUnlock(sio->read.callback_data);
595 ! if (sio->callback_data)
596 ! cbdataUnlock(sio->callback_data);
597 ! memPoolFree(squidaio_state_pool, aiostate);