--------------------- PatchSet 580 Date: 2000/09/16 23:25:21 Author: hno Branch: hno-devel Tag: (none) Log: Write queue kicking in non-async mode could trigger a loop detection if a lot of data was received while the disk FD was being opened. Members: src/fs/aufs/store_asyncufs.h:1.1.6.3.2.8->1.1.6.3.2.9 src/fs/aufs/store_io_aufs.c:1.1.6.6.2.7->1.1.6.6.2.8 Index: squid/src/fs/aufs/store_asyncufs.h =================================================================== RCS file: /cvsroot/squid-sf//squid/src/fs/aufs/store_asyncufs.h,v retrieving revision 1.1.6.3.2.8 retrieving revision 1.1.6.3.2.9 diff -u -r1.1.6.3.2.8 -r1.1.6.3.2.9 --- squid/src/fs/aufs/store_asyncufs.h 16 Sep 2000 22:16:58 -0000 1.1.6.3.2.8 +++ squid/src/fs/aufs/store_asyncufs.h 16 Sep 2000 23:25:21 -0000 1.1.6.3.2.9 @@ -79,6 +79,8 @@ unsigned int reading:1; unsigned int writing:1; unsigned int opening:1; + unsigned int write_kicking:1; + unsigned int read_kicking:1; } flags; const char *read_buf; link_list *pending_writes; Index: squid/src/fs/aufs/store_io_aufs.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/fs/aufs/store_io_aufs.c,v retrieving revision 1.1.6.6.2.7 retrieving revision 1.1.6.6.2.8 diff -u -r1.1.6.6.2.7 -r1.1.6.6.2.8 --- squid/src/fs/aufs/store_io_aufs.c 16 Sep 2000 22:16:58 -0000 1.1.6.6.2.7 +++ squid/src/fs/aufs/store_io_aufs.c 16 Sep 2000 23:25:21 -0000 1.1.6.6.2.8 @@ -221,6 +221,7 @@ linklistPush(&(aiostate->pending_writes), q); return; } +#if ASYNC_WRITE if (aiostate->flags.writing) { struct _queued_write *q; debug(78, 3) ("storeAufsWrite: queuing write\n"); @@ -240,7 +241,6 @@ * XXX Should never give EWOULDBLOCK under normal operations * if it does then the MAGIC1/2 tuning is wrong. */ -#if ASYNC_WRITE aioWrite(aiostate->fd, offset, buf, size, storeAufsWriteDone, sio, free_func); #else @@ -389,10 +389,21 @@ return; } sio->offset += len; - if (storeAufsKickWriteQueue(sio)) - (void) 0; +#if ASYNC_WRITE + if (!storeAufsKickWriteQueue(sio)) + 0; else if (aiostate->flags.close_request) storeAufsIOCallback(sio, errflag); +#else + if (!aiostate->flags.write_kicking) { + aiostate->flags.write_kicking = 1; + while (storeAufsKickWriteQueue(sio)) + (void) 0; + aiostate->flags.write_kicking = 0; + if (aiostate->flags.close_request) + storeAufsIOCallback(sio, errflag); + } +#endif loop_detect--; }