--------------------- PatchSet 1442 Date: 2001/01/30 14:35:20 Author: darius Branch: sfs Tag: (none) Log: Wrapped various bits in cbdataLock/cbdataUnlock calls, to deal with potential for sio to vanish mid-request (and all pending requests now check for validity of sio before proceeding). That gets squid serving pages, but all fs operations are failing atm (which, ironically, was what was causing sio to vanish leading to above). Members: src/fs/sfs/sfs_interface.c:1.1.2.13->1.1.2.14 src/fs/sfs/store_dir_sfs.c:1.1.2.4->1.1.2.5 src/fs/sfs/store_io_sfs.c:1.1.2.4->1.1.2.5 Index: squid/src/fs/sfs/sfs_interface.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/fs/sfs/Attic/sfs_interface.c,v retrieving revision 1.1.2.13 retrieving revision 1.1.2.14 diff -u -r1.1.2.13 -r1.1.2.14 --- squid/src/fs/sfs/sfs_interface.c 29 Jan 2001 14:09:30 -0000 1.1.2.13 +++ squid/src/fs/sfs/sfs_interface.c 30 Jan 2001 14:35:20 -0000 1.1.2.14 @@ -41,19 +41,19 @@ return -1; } } - if (!(req = _sfs_create_requestor(sfsid,rt, io_type))) + if (!(req = _sfs_create_requestor(sfsid,rt, io_type))) { return -1; + } + cbdataLock(dataptr); req->sfsinode = sfsinode; req->dataptr = dataptr; - _sfs_print_request(req); _sfs_submit_request(req); - printf("DEBUG: open request submitted (req %p)\n",req); _sfs_print_request(req); - if (io_type != _SFS_IO_SYNC) + if (io_type != _SFS_IO_SYNC) { return 0; + } _sfs_waitfor_request(req); - printf("DEBUG: response received (req %p)\n",req); - _sfs_print_request(req); + cbdataUnlock(dataptr); ret = req->ret; _sfs_remove_request(req); return ret; @@ -68,12 +68,15 @@ if(!(req = _sfs_create_requestor(sfsfd >> 24, _SFS_OP_CLOSE, io_type))) return -1; + cbdataLock(dataptr); req->sfsfd = sfsfd; req->dataptr = dataptr; _sfs_submit_request(req); - if (io_type != _SFS_IO_SYNC) + if (io_type != _SFS_IO_SYNC) { return 0; + } _sfs_waitfor_request(req); + cbdataUnlock(dataptr); ret = req->ret; _sfs_remove_request(req); return ret; @@ -93,8 +96,10 @@ sfsid_t sfsid; sfsid = sfsfd >> 24; - if(!(req = _sfs_create_requestor(sfsid, _SFS_OP_READ, io_type))) + if(!(req = _sfs_create_requestor(sfsid, _SFS_OP_READ, io_type))) { return -1; + } + cbdataLock(dataptr); req->sfsfd = sfsfd; req->offset = -1; req->buflen = buflen; @@ -103,6 +108,7 @@ if (io_type != _SFS_IO_SYNC) return 0; _sfs_waitfor_request(req); + cbdataUnlock(dataptr); if ((!buf) || (req->ret == 0)) return 0; if (req->ret < 0) @@ -112,8 +118,6 @@ memcpy(buf,req->buf,ret+1); xfree(req->buf); } - /* I think I'm munging things by adding a '\0', but you get that. */ - *((char *)(buf)+ret+1) = '\0'; _sfs_remove_request(req); return ret; } @@ -127,11 +131,13 @@ sfsid_t sfsid; sfsid = sfsfd >> 24; - if (!(req = _sfs_create_requestor(sfsid,_SFS_OP_WRITE, io_type))) + if (!(req = _sfs_create_requestor(sfsid,_SFS_OP_WRITE, io_type))) { return -1; + } + cbdataLock(dataptr); req->sfsfd = sfsfd; if (!(req->buf = xstrdup(buf))) { - /* Panic! */ + cbdataUnlock(dataptr); return -1; } req->buflen = buflen; @@ -140,6 +146,7 @@ if (io_type != _SFS_IO_SYNC) return 0; _sfs_waitfor_request(req); + cbdataUnlock(dataptr); ret = req->ret; if (req->buf) xfree(req->buf); @@ -158,14 +165,17 @@ sfs_requestor *req; int ret; - if (!(req = _sfs_create_requestor(sfsid, _SFS_OP_UNLINK, io_type))) + if (!(req = _sfs_create_requestor(sfsid, _SFS_OP_UNLINK, io_type))) { return -1; + } + cbdataLock(dataptr); req->sfsinode = sfsinode; req->dataptr = dataptr; _sfs_submit_request(req); if (io_type != _SFS_IO_SYNC) return 0; _sfs_waitfor_request(req); + cbdataUnlock(dataptr); ret = req->ret; _sfs_remove_request(req); return ret; Index: squid/src/fs/sfs/store_dir_sfs.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/fs/sfs/Attic/store_dir_sfs.c,v retrieving revision 1.1.2.4 retrieving revision 1.1.2.5 diff -u -r1.1.2.4 -r1.1.2.5 --- squid/src/fs/sfs/store_dir_sfs.c 28 Jan 2001 18:48:48 -0000 1.1.2.4 +++ squid/src/fs/sfs/store_dir_sfs.c 30 Jan 2001 14:35:20 -0000 1.1.2.5 @@ -1,6 +1,6 @@ /* - * $Id: store_dir_sfs.c,v 1.1.2.4 2001/01/28 18:48:48 adri Exp $ + * $Id: store_dir_sfs.c,v 1.1.2.5 2001/01/30 14:35:20 darius Exp $ * * DEBUG: section 47 Store Directory Routines * AUTHOR: Duane Wessels @@ -1469,36 +1469,39 @@ while((req = sfs_getcompleted(sfsinfo->sfsid)) != NULL) { /* Find the sio in question */ sio = req->dataptr; - rtype = req->request_type; - retval = req->ret; + rtype = req->request_type; + retval = req->ret; - /* Remove the requestor from the list */ - _sfs_remove_request(req); + /* Remove the requestor from the list */ + _sfs_remove_request(req); - /* Callback time */ - switch (rtype) { - case _SFS_OP_READ: - storeSfsReadDone(sio, retval); - break; - - case _SFS_OP_WRITE: - storeSfsWriteDone(sio, retval); - break; - - case _SFS_OP_OPEN_READ: - case _SFS_OP_OPEN_WRITE: - case _SFS_OP_CLOSE: - case _SFS_OP_UNLINK: - case _SFS_OP_SYNC: - case _SFS_OP_UMOUNT: - break; - - default: - debug(20, 1) ("storeSfsDirCallback: unknown op %d\n", - req->request_type); - } - /* Tag that we've done an IO */ - ops = 1; + if (cbdataValid(sio)) { + /* Callback time */ + switch (rtype) { + case _SFS_OP_READ: + storeSfsReadDone(sio, retval); + break; + + case _SFS_OP_WRITE: + storeSfsWriteDone(sio, retval); + break; + + case _SFS_OP_OPEN_READ: + case _SFS_OP_OPEN_WRITE: + case _SFS_OP_CLOSE: + case _SFS_OP_UNLINK: + case _SFS_OP_SYNC: + case _SFS_OP_UMOUNT: + break; + + default: + debug(20, 1) ("storeSfsDirCallback: unknown op %d\n", + req->request_type); + } + /* Tag that we've done an IO */ + ops = 1; + cbdataUnlock(sio); + } } return ops; Index: squid/src/fs/sfs/store_io_sfs.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/fs/sfs/Attic/store_io_sfs.c,v retrieving revision 1.1.2.4 retrieving revision 1.1.2.5 diff -u -r1.1.2.4 -r1.1.2.5 --- squid/src/fs/sfs/store_io_sfs.c 30 Jan 2001 13:25:33 -0000 1.1.2.4 +++ squid/src/fs/sfs/store_io_sfs.c 30 Jan 2001 14:35:20 -0000 1.1.2.5 @@ -1,6 +1,6 @@ /* - * $Id: store_io_sfs.c,v 1.1.2.4 2001/01/30 13:25:33 adri Exp $ + * $Id: store_io_sfs.c,v 1.1.2.5 2001/01/30 14:35:20 darius Exp $ * * DEBUG: section 79 Storage Manager SFS Interface * AUTHOR: Duane Wessels @@ -53,6 +53,7 @@ sfsfd_t fd; debug(79, 3) ("storeSfsOpen: fileno %08X\n", f); + sio = NULL; sio = CBDATA_ALLOC(storeIOState, storeSfsIOFreeEntry); sio->fsstate = memPoolAlloc(sfs_state_pool); @@ -91,6 +92,8 @@ sfileno filn; sdirno dirn; + sio = NULL; + /* Allocate a number */ dirn = SD->index; filn = storeSfsDirMapBitAllocate(SD);