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
-~----------~----~----~----~------~----~------~--~---

Reply via email to