Author: adrian.chadd
Date: Fri Jul 17 17:05:17 2009
New Revision: 14208
Modified:
branches/LUSCA_HEAD/src/fs/aufs/store_io_aufs.c
branches/LUSCA_HEAD/src/fs/coss/store_io_coss.c
branches/LUSCA_HEAD/src/protos.h
branches/LUSCA_HEAD/src/squid.h
branches/LUSCA_HEAD/src/store_io.c
branches/LUSCA_HEAD/src/structs.h
Log:
Enforce the correct free function for the aio and coss per-swapIOState
private data allocations
I'm not quite sure how this worked without crashing but I'm sure memory was
being
free'd back into the wrong memory pool. This commit creates a free function
in
storeIOState which gets called when the sio is free'd. This calls the
correct
FS module free function.
This should resolve issue 29.
Modified: branches/LUSCA_HEAD/src/fs/aufs/store_io_aufs.c
==============================================================================
--- branches/LUSCA_HEAD/src/fs/aufs/store_io_aufs.c (original)
+++ branches/LUSCA_HEAD/src/fs/aufs/store_io_aufs.c Fri Jul 17 17:05:17 2009
@@ -53,8 +53,6 @@
static int storeAufsKickWriteQueue(storeIOState * sio);
static CBDUNL storeAufsIOFreeEntry;
-CBDATA_TYPE(storeIOState);
-
/* === PUBLIC ===========================================================
*/
/* open for reading */
@@ -84,8 +82,7 @@
return NULL;
}
#endif
- CBDATA_INIT_TYPE_FREECB(storeIOState, storeAufsIOFreeEntry);
- sio = cbdataAlloc(storeIOState);
+ sio = storeIOAllocate(storeAufsIOFreeEntry);
sio->fsstate = memPoolAlloc(squidaio_state_pool);
((squidaiostate_t *) (sio->fsstate))->fd = -1;
((squidaiostate_t *) (sio->fsstate))->flags.opening = 1;
@@ -139,8 +136,7 @@
return NULL;
}
#endif
- CBDATA_INIT_TYPE_FREECB(storeIOState, storeAufsIOFreeEntry);
- sio = cbdataAlloc(storeIOState);
+ sio = storeIOAllocate(storeAufsIOFreeEntry);
sio->fsstate = memPoolAlloc(squidaio_state_pool);
((squidaiostate_t *) (sio->fsstate))->fd = -1;
((squidaiostate_t *) (sio->fsstate))->flags.opening = 1;
@@ -532,6 +528,7 @@
squidaiostate_t *aiostate = (squidaiostate_t *) sio->fsstate;
struct _queued_write *qw;
struct _queued_read *qr;
+ assert(aiostate);
while ((qw = dlinkRemoveHead(&aiostate->pending_writes))) {
if (qw->free_func)
qw->free_func(qw->buf);
@@ -546,4 +543,5 @@
if (sio->callback_data)
cbdataUnlock(sio->callback_data);
memPoolFree(squidaio_state_pool, aiostate);
+ sio->fsstate = NULL;
}
Modified: branches/LUSCA_HEAD/src/fs/coss/store_io_coss.c
==============================================================================
--- branches/LUSCA_HEAD/src/fs/coss/store_io_coss.c (original)
+++ branches/LUSCA_HEAD/src/fs/coss/store_io_coss.c Fri Jul 17 17:05:17 2009
@@ -66,7 +66,6 @@
void storeCossCompleteReadOp(CossInfo * cs, CossReadOp * op, int error);
void storeCossKickReadOp(CossInfo * cs, CossReadOp * op);
-CBDATA_TYPE(storeIOState);
CBDATA_TYPE(CossMemBuf);
CBDATA_TYPE(CossPendingReloc);
@@ -289,7 +288,7 @@
assert(cs->rebuild.rebuilding == 0);
coss_stats.create.ops++;
- sio = cbdataAlloc(storeIOState);
+ sio = storeIOAllocate(storeCossIOFreeEntry);
cstate = memPoolAlloc(coss_state_pool);
sio->fsstate = cstate;
sio->offset = 0;
@@ -344,7 +343,7 @@
assert(cs->rebuild.rebuilding == 0);
- sio = cbdataAlloc(storeIOState);
+ sio = storeIOAllocate(storeCossIOFreeEntry);
cstate = memPoolAlloc(coss_state_pool);
debug(79, 3) ("storeCossOpen: %p: offset %d\n", sio, f);
@@ -940,9 +939,7 @@
{
CossInfo *cs = (CossInfo *) sd->fsdata;
CossMemBuf *newmb;
- CBDATA_INIT_TYPE_FREECB(storeIOState, storeCossIOFreeEntry);
CBDATA_INIT_TYPE_FREECB(CossMemBuf, NULL);
- CBDATA_INIT_TYPE_FREECB(storeIOState, storeCossIOFreeEntry);
CBDATA_INIT_TYPE_FREECB(CossPendingReloc, NULL);
/*
* XXX for now we start at the beginning of the disk;
@@ -964,9 +961,11 @@
* Clean up any references from the SIO before it get's released.
*/
static void
-storeCossIOFreeEntry(void *sio)
+storeCossIOFreeEntry(void *data)
{
- memPoolFree(coss_state_pool, ((storeIOState *) sio)->fsstate);
+ storeIOState *sio = data;
+ memPoolFree(coss_state_pool, sio->fsstate);
+ sio->fsstate = NULL;
}
static off_t
Modified: branches/LUSCA_HEAD/src/protos.h
==============================================================================
--- branches/LUSCA_HEAD/src/protos.h (original)
+++ branches/LUSCA_HEAD/src/protos.h Fri Jul 17 17:05:17 2009
@@ -647,6 +647,7 @@
extern void storeReplSetup(void);
/* store_io.c */
+extern storeIOState * storeIOAllocate(FREE *state_free);
extern storeIOState *storeCreate(StoreEntry *, STFNCB *, STIOCB *, void *);
extern storeIOState *storeOpen(StoreEntry *, STFNCB *, STIOCB *, void *);
extern void storeClose(storeIOState *);
Modified: branches/LUSCA_HEAD/src/squid.h
==============================================================================
--- branches/LUSCA_HEAD/src/squid.h (original)
+++ branches/LUSCA_HEAD/src/squid.h Fri Jul 17 17:05:17 2009
@@ -545,6 +545,7 @@
CBDATA_GLOBAL_TYPE(RemovalPolicyWalker);
CBDATA_GLOBAL_TYPE(RemovalPurgeWalker);
CBDATA_GLOBAL_TYPE(ps_state);
+CBDATA_GLOBAL_TYPE(storeIOState);
/* src/MemBuf.c */
extern int buf_read(buf_t *b, int fd, int grow_size);
Modified: branches/LUSCA_HEAD/src/store_io.c
==============================================================================
--- branches/LUSCA_HEAD/src/store_io.c (original)
+++ branches/LUSCA_HEAD/src/store_io.c Fri Jul 17 17:05:17 2009
@@ -17,6 +17,26 @@
OBJH storeIOStats;
+static void
+storeIOFreeCB(void *data)
+{
+ storeIOState *sio = data;
+
+ assert(sio->fsstate);
+ sio->free_state(sio);
+}
+
+storeIOState *
+storeIOAllocate(FREE *state_free)
+{
+ storeIOState *sio;
+
+ CBDATA_INIT_TYPE_FREECB(storeIOState, storeIOFreeCB);
+ sio = cbdataAlloc(storeIOState);
+ sio->free_state = state_free;
+ return sio;
+}
+
/*
* submit a request to create a cache object for writing.
* The StoreEntry structure is sent as a hint to the filesystem
Modified: branches/LUSCA_HEAD/src/structs.h
==============================================================================
--- branches/LUSCA_HEAD/src/structs.h (original)
+++ branches/LUSCA_HEAD/src/structs.h Fri Jul 17 17:05:17 2009
@@ -1663,6 +1663,7 @@
unsigned int closing:1; /* debugging aid */
} flags;
void *fsstate;
+ FREE *free_state;
};
struct _request_t {
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"lusca-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/lusca-commit?hl=en
-~----------~----~----~----~------~----~------~--~---