Re: a patch for coss

From: Duane Wessels <wessels@dont-contact.us>
Date: Thu, 29 May 2003 11:35:00 -0600 (MDT)

On Thu, 23 May 2003, Robert Collins wrote:

> I've no objection - but would like to see the patch :}.

Here is the patch with fixed (512 byte) blocksize. I can make it
configurable.

Index: src/fs/coss/async_io.c
===================================================================
RCS file: /squid/squid/src/fs/coss/async_io.c,v
retrieving revision 1.7.2.1
diff -u -w -u -r1.7.2.1 async_io.c
--- src/fs/coss/async_io.c 21 Jul 2002 00:30:03 -0000 1.7.2.1
+++ src/fs/coss/async_io.c 29 May 2003 17:31:35 -0000
@@ -94,7 +94,7 @@

     /* Initiate aio */
     if (aio_read(&qe->aq_e_aiocb) < 0) {
- fatalf("Aiee! aio_read() returned error (%d)!\n", errno);
+ fatalf("Aiee! aio_read() returned error: %s\n", xstrerror());
     }
 }

@@ -140,7 +140,7 @@

     /* Initiate aio */
     if (aio_write(&qe->aq_e_aiocb) < 0) {
- fatalf("Aiee! aio_read() returned error (%d)!\n", errno);
+ fatalf("Aiee! aio_read() returned error: %s\n", xstrerror());
     }
 }

Index: src/fs/coss/store_coss.h
===================================================================
RCS file: /squid/squid/src/fs/coss/store_coss.h,v
retrieving revision 1.6
diff -u -w -u -r1.6 store_coss.h
--- src/fs/coss/store_coss.h 12 Aug 2001 10:20:41 -0000 1.6
+++ src/fs/coss/store_coss.h 29 May 2003 17:31:35 -0000
@@ -91,7 +91,7 @@
 extern STOBJUNLINK storeCossUnlink;
 extern STSYNC storeCossSync;

-extern off_t storeCossAllocate(SwapDir * SD, const StoreEntry * e, int which);
+extern sfileno storeCossAllocate(SwapDir * SD, const StoreEntry * e, int which);
 extern void storeCossAdd(SwapDir *, StoreEntry *);
 extern void storeCossRemove(SwapDir *, StoreEntry *);
 extern void storeCossStartMembuf(SwapDir * SD);
Index: src/fs/coss/store_dir_coss.c
===================================================================
RCS file: /squid/squid/src/fs/coss/store_dir_coss.c,v
retrieving revision 1.30.2.5
diff -u -w -u -r1.30.2.5 store_dir_coss.c
--- src/fs/coss/store_dir_coss.c 9 Jan 2003 03:38:41 -0000 1.30.2.5
+++ src/fs/coss/store_dir_coss.c 29 May 2003 17:31:35 -0000
@@ -336,6 +336,7 @@
     storeHashInsert(e, key); /* do it after we clear KEY_PRIVATE */
     storeCossAdd(SD, e);
     e->swap_filen = storeCossAllocate(SD, e, COSS_ALLOC_NOTIFY);
+ assert(e->swap_filen >= 0);
     return e;
 }

Index: src/fs/coss/store_io_coss.c
===================================================================
RCS file: /squid/squid/src/fs/coss/store_io_coss.c,v
retrieving revision 1.13.2.4
diff -u -w -u -r1.13.2.4 store_io_coss.c
--- src/fs/coss/store_io_coss.c 8 Aug 2002 20:17:41 -0000 1.13.2.4
+++ src/fs/coss/store_io_coss.c 29 May 2003 17:31:35 -0000
@@ -49,6 +49,8 @@
 static CossMemBuf *storeCossCreateMemBuf(SwapDir * SD, size_t start,
     sfileno curfn, int *collision);
 static CBDUNL storeCossIOFreeEntry;
+static off_t storeCossFilenoToOffset(sfileno f);
+static sfileno storeCossOffsetToFileno(off_t o);

 CBDATA_TYPE(storeIOState);
 CBDATA_TYPE(CossMemBuf);
@@ -62,7 +64,7 @@
  * to work..
  * -- Adrian
  */
-off_t
+sfileno
 storeCossAllocate(SwapDir * SD, const StoreEntry * e, int which)
 {
     CossInfo *cs = (CossInfo *) SD->fsdata;
@@ -78,8 +80,6 @@
     else
         checkf = -1;

- retofs = e->swap_filen; /* Just for defaults, or while rebuilding */
-
     if (e->swap_file_sz > 0)
         allocsize = e->swap_file_sz;
     else
@@ -118,7 +118,9 @@
     if (coll == 0) {
         retofs = cs->current_offset;
         cs->current_offset = retofs + allocsize;
- return retofs;
+ /* round up to 512 multiple */
+ cs->current_offset = ((cs->current_offset + 511) >> 9 ) << 9;
+ return storeCossOffsetToFileno(retofs);
     } else {
         debug(79, 3) ("storeCossAllocate: Collision\n");
         return -1;
@@ -159,7 +161,7 @@
     sio->st_size = objectLen(e) + e->mem_obj->swap_hdr_sz;
     sio->swap_dirn = SD->index;
     sio->swap_filen = storeCossAllocate(SD, e, COSS_ALLOC_ALLOCATE);
- debug(79, 3) ("storeCossCreate: offset %d, size %ld, end %ld\n", sio->swap_filen, (long int) sio->st_size, (long int) (sio->swap_filen + sio->st_size));
+ debug(79, 3) ("storeCossCreate: offset %ld, size %ld, end %ld\n", (long int) storeCossFilenoToOffset(sio->swap_filen), (long int) sio->st_size, (long int) (sio->swap_filen + sio->st_size));

     sio->callback = callback;
     sio->file_callback = file_callback;
@@ -211,7 +213,7 @@
     cstate->flags.reading = 0;
     cstate->readbuffer = NULL;
     cstate->reqdiskoffset = -1;
- p = storeCossMemPointerFromDiskOffset(SD, f, NULL);
+ p = storeCossMemPointerFromDiskOffset(SD, storeCossFilenoToOffset(f), NULL);
     /* make local copy so we don't have to lock membuf */
     if (p) {
         cstate->readbuffer = xmalloc(sio->st_size);
@@ -227,7 +229,7 @@
          * a place for the object here, and the file_read() reads the object
          * into the cossmembuf for later writing ..
          */
- cstate->reqdiskoffset = sio->swap_filen;
+ cstate->reqdiskoffset = storeCossFilenoToOffset(sio->swap_filen);
         sio->swap_filen = -1;
         sio->swap_filen = storeCossAllocate(SD, e, COSS_ALLOC_REALLOC);
         if (sio->swap_filen == -1) {
@@ -291,7 +293,7 @@
     cstate->requestbuf = buf;
     cstate->requestoffset = offset;
     if (cstate->readbuffer == NULL) {
- p = storeCossMemPointerFromDiskOffset(SD, sio->swap_filen, NULL);
+ p = storeCossMemPointerFromDiskOffset(SD, storeCossFilenoToOffset(sio->swap_filen), NULL);
         /* Remember we need to translate the block offset to a disk offset! */
         a_file_read(&cs->aq, cs->fd,
             p,
@@ -323,7 +325,7 @@
     assert(sio->e->mem_obj->object_sz != -1);

     debug(79, 3) ("storeCossWrite: offset %ld, len %lu\n", (long int) sio->offset, (unsigned long int) size);
- diskoffset = sio->swap_filen + sio->offset;
+ diskoffset = storeCossFilenoToOffset(sio->swap_filen) + sio->offset;
     dest = storeCossMemPointerFromDiskOffset(SD, diskoffset, &membuf);
     assert(dest != NULL);
     xmemcpy(dest, buf, size);
@@ -355,7 +357,7 @@
     } else {
         if (cstate->readbuffer == NULL) {
             cstate->readbuffer = xmalloc(sio->st_size);
- p = storeCossMemPointerFromDiskOffset(SD, sio->swap_filen, NULL);
+ p = storeCossMemPointerFromDiskOffset(SD, storeCossFilenoToOffset(sio->swap_filen), NULL);
             xmemcpy(cstate->readbuffer, p, sio->st_size);
             storeCossMemBufUnlock(SD, sio);
         }
@@ -412,10 +414,11 @@
     CossMemBuf *t;
     dlink_node *m;
     CossInfo *cs = (CossInfo *) SD->fsdata;
+ off_t o = storeCossFilenoToOffset(e->swap_filen);

     for (m = cs->membufs.head; m; m = m->next) {
         t = m->data;
- if ((e->swap_filen >= t->diskstart) && (e->swap_filen <= t->diskend)) {
+ if ((o >= t->diskstart) && (o <= t->diskend)) {
             debug(79, 3) ("storeCossMemBufLock: locking %p, lockcount %d\n", t, t->lockcount);
             t->lockcount++;
             return;
@@ -430,6 +433,7 @@
     CossMemBuf *t;
     dlink_node *m, *n;
     CossInfo *cs = (CossInfo *) SD->fsdata;
+ off_t o = storeCossFilenoToOffset(e->swap_filen);

     for (m = cs->membufs.head; m; m = n) {
         /*
@@ -439,7 +443,7 @@
          */
         n = m->next;
         t = m->data;
- if ((e->swap_filen >= t->diskstart) && (e->swap_filen <= t->diskend)) {
+ if ((o >= t->diskstart) && (o <= t->diskend)) {
             t->lockcount--;
             debug(79, 3) ("storeCossMemBufUnlock: unlocking %p, lockcount %d\n", t, t->lockcount);
         }
@@ -532,12 +536,14 @@
      * Kill objects from the tail to make space for a new chunk
      */
     for (m = cs->index.tail; m; m = prev) {
+ off_t o;
         prev = m->prev;
         e = m->data;
+ o = storeCossFilenoToOffset(e->swap_filen);
         if (curfn == e->swap_filen)
             *collision = 1; /* Mark an object alloc collision */
- if ((e->swap_filen >= newmb->diskstart) &&
- (e->swap_filen <= newmb->diskend)) {
+ if ((o >= newmb->diskstart) &&
+ (o <= newmb->diskend)) {
             storeRelease(e);
             numreleased++;
         } else
@@ -567,4 +573,17 @@
 storeCossIOFreeEntry(void *sio)
 {
     memPoolFree(coss_state_pool, ((storeIOState *) sio)->fsstate);
+}
+
+static off_t
+storeCossFilenoToOffset(sfileno f)
+{
+ return f << 9;
+}
+
+static sfileno
+storeCossOffsetToFileno(off_t o)
+{
+ assert(0 == (o & 511));
+ return o >> 9;
 }
Received on Thu May 29 2003 - 11:35:08 MDT

This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:19:57 MST