cnfs.c cleanup

Alex Kiernan alexk at demon.net
Mon Mar 12 10:25:28 UTC 2001



Just going through cleaning up patches which aren't history API
related, this is one which got lost somewhere (or maybe rejected -
shout if so & I'll dump it).

Its really just a clean up I did whilst debugging what turned out to
be a Solaris 7/8 NFSv3 bug - it removes the readwrite/mmap duality
from cnfs (since you have to have working mmap these days) and cleans
up the error and deallocate paths so that there's less duplicate code.

--- ../inn-clean/storage/cnfs/cnfs.c	Mon Feb 12 17:15:56 2001
+++ ./storage/cnfs/cnfs.c	Mon Feb 12 17:10:22 2001
@@ -167,13 +167,73 @@
     }
 }
 
+static bool CNFSflushhead(CYCBUFF *cycbuff) {
+  int			b;
+  CYCBUFFEXTERN		rpx;
+
+  if (!cycbuff->needflush)
+    return TRUE;
+  if (!SMopenmode) {
+    syslog(L_ERROR, "%s: CNFSflushhead: attempted flush whilst read only",
+      LocalLogName);
+    return FALSE;
+  }
+  memset(&rpx, 0, sizeof(CYCBUFFEXTERN));
+  if (cycbuff->magicver == 3) {
+    cycbuff->updated = time(NULL);
+    strncpy(rpx.magic, CNFS_MAGICV3, strlen(CNFS_MAGICV3));
+    strncpy(rpx.name, cycbuff->name, CNFSNASIZ);
+    strncpy(rpx.path, cycbuff->path, CNFSPASIZ);
+    /* Don't use sprintf() directly ... the terminating '\0' causes grief */
+    strncpy(rpx.lena, CNFSofft2hex(cycbuff->len, TRUE), CNFSLASIZ);
+    strncpy(rpx.freea, CNFSofft2hex(cycbuff->free, TRUE), CNFSLASIZ);
+    strncpy(rpx.cyclenuma, CNFSofft2hex(cycbuff->cyclenum, TRUE), CNFSLASIZ);
+    strncpy(rpx.updateda, CNFSofft2hex(cycbuff->updated, TRUE), CNFSLASIZ);
+    strncpy(rpx.metaname, cycbuff->metaname, CNFSNASIZ);
+    strncpy(rpx.orderinmeta, CNFSofft2hex(cycbuff->order, TRUE), CNFSLASIZ);
+    if (cycbuff->currentbuff) {
+	strncpy(rpx.currentbuff, "TRUE", CNFSMASIZ);
+    } else {
+	strncpy(rpx.currentbuff, "FALSE", CNFSMASIZ);
+    }
+    memcpy(cycbuff->bitfield, &rpx, sizeof(CYCBUFFEXTERN));
+#ifdef MMAP_NEEDS_MSYNC
+# ifdef HAVE_MSYNC_3_ARG
+    msync(cycbuff->bitfield, cycbuff->minartoffset, MS_ASYNC);
+# else
+    msync(cycbuff->bitfield, cycbuff->minartoffset);
+# endif
+#endif
+    cycbuff->needflush = FALSE;
+  } else {
+    syslog(L_ERROR, "%s: CNFSflushhead: bogus magicver for %s: %d",
+      LocalLogName, cycbuff->name, cycbuff->magicver);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+static void CNFSshutdowncycbuff(CYCBUFF *cycbuff) {
+    if (cycbuff == (CYCBUFF *)NULL)
+	return;
+    if (cycbuff->needflush) {
+	syslog(L_NOTICE, "%s: CNFSshutdowncycbuff: flushing %s", LocalLogName, cycbuff->name);
+	(void)CNFSflushhead(cycbuff);
+    }
+    if (cycbuff->bitfield != NULL) {
+	munmap(cycbuff->bitfield, cycbuff->minartoffset);
+	cycbuff->bitfield = NULL;
+    }
+    if (cycbuff->fd >= 0)
+	close(cycbuff->fd);
+    cycbuff->fd = -1;
+}
+
 static void CNFScleancycbuff(void) {
     CYCBUFF	*cycbuff, *nextcycbuff;
 
     for (cycbuff = cycbufftab; cycbuff != (CYCBUFF *)NULL;) {
-      if (cycbuff->fd >= 0)
-	close(cycbuff->fd);
-      cycbuff->fd = -1;
+      CNFSshutdowncycbuff(cycbuff);
       nextcycbuff = cycbuff->next;
       DISPOSE(cycbuff);
       cycbuff = nextcycbuff;
@@ -227,60 +287,6 @@
   return NULL;
 }
 
-static bool CNFSflushhead(CYCBUFF *cycbuff) {
-  int			b;
-  CYCBUFFEXTERN		rpx;
-
-  if (!cycbuff->needflush)
-    return TRUE;
-  memset(&rpx, 0, sizeof(CYCBUFFEXTERN));
-  if (cycbuff->bitfield == NULL) {
-    if (CNFSseek(cycbuff->fd, (CYCBUFF_OFF_T) 0, SEEK_SET) < 0) {
-      syslog(L_ERROR, "CNFSflushhead: magic CNFSseek failed: %m");
-      return FALSE;
-    }
-  }
-  if (cycbuff->magicver == 3) {
-    cycbuff->updated = time(NULL);
-    strncpy(rpx.magic, CNFS_MAGICV3, strlen(CNFS_MAGICV3));
-    strncpy(rpx.name, cycbuff->name, CNFSNASIZ);
-    strncpy(rpx.path, cycbuff->path, CNFSPASIZ);
-    /* Don't use sprintf() directly ... the terminating '\0' causes grief */
-    strncpy(rpx.lena, CNFSofft2hex(cycbuff->len, TRUE), CNFSLASIZ);
-    strncpy(rpx.freea, CNFSofft2hex(cycbuff->free, TRUE), CNFSLASIZ);
-    strncpy(rpx.cyclenuma, CNFSofft2hex(cycbuff->cyclenum, TRUE), CNFSLASIZ);
-    strncpy(rpx.updateda, CNFSofft2hex(cycbuff->updated, TRUE), CNFSLASIZ);
-    strncpy(rpx.metaname, cycbuff->metaname, CNFSNASIZ);
-    strncpy(rpx.orderinmeta, CNFSofft2hex(cycbuff->order, TRUE), CNFSLASIZ);
-    if (cycbuff->currentbuff) {
-	strncpy(rpx.currentbuff, "TRUE", CNFSMASIZ);
-    } else {
-	strncpy(rpx.currentbuff, "FALSE", CNFSMASIZ);
-    }
-    if (cycbuff->bitfield == NULL) {
-      if ((b = write(cycbuff->fd, &rpx, sizeof(CYCBUFFEXTERN))) != sizeof(CYCBUFFEXTERN)) {
-	syslog(L_ERROR, "%s: CNFSflushhead: write failed (%d bytes): %m", LocalLogName, b);
-	return FALSE;
-      }
-    } else {
-      memcpy(cycbuff->bitfield, &rpx, sizeof(CYCBUFFEXTERN));
-#ifdef MMAP_NEEDS_MSYNC
-# ifdef HAVE_MSYNC_3_ARG
-      msync(cycbuff->bitfield, cycbuff->minartoffset, MS_ASYNC);
-# else
-      msync(cycbuff->bitfield, cycbuff->minartoffset);
-# endif
-#endif
-    }
-    cycbuff->needflush = FALSE;
-  } else {
-    syslog(L_ERROR, "%s: CNFSflushhead: bogus magicver for %s: %d",
-      LocalLogName, cycbuff->name, cycbuff->magicver);
-    return FALSE;
-  }
-  return TRUE;
-}
-
 static void CNFSflushallheads(void) {
   CYCBUFF	*cycbuff;
 
@@ -300,20 +306,7 @@
     CYCBUFFEXTERN	rpx;
     char		buf[64];
 
-    if (cycbuff->bitfield == NULL) {
-	if (CNFSseek(cycbuff->fd, (CYCBUFF_OFF_T) 0, SEEK_SET) < 0) {
-	    syslog(L_ERROR, "CNFSReadFreeAndCycle: magic lseek failed: %m");
-	    SMseterror(SMERR_UNDEFINED, NULL);
-	    return;
-	}
-	if (read(cycbuff->fd, &rpx, sizeof(CYCBUFFEXTERN)) != sizeof(rpx)) {
-	    syslog(L_ERROR, "CNFSReadFreeAndCycle: magic read failed: %m");
-	    SMseterror(SMERR_UNDEFINED, NULL);
-	    return;
-	}
-    } else {
-	memcpy(&rpx, cycbuff->bitfield, sizeof(CYCBUFFEXTERN));
-    }
+    memcpy(&rpx, cycbuff->bitfield, sizeof(CYCBUFFEXTERN));
     /* Sanity checks are not needed since CNFSinit_disks() has already done. */
     buf[CNFSLASIZ] = '\0';
     strncpy(buf, rpx.freea, CNFSLASIZ);
@@ -531,7 +524,7 @@
 
 static bool CNFSinit_disks(CYCBUFF *cycbuff) {
   char		buf[64];
-  CYCBUFFEXTERN	rpx;
+  CYCBUFFEXTERN	*rpx;
   int		fd, bytes;
   CYCBUFF_OFF_T	tmpo;
   bool		oneshot;
@@ -563,17 +556,15 @@
 	    cycbuff->fd = fd;
 	}
     }
-    if ((tmpo = CNFSseek(cycbuff->fd, (CYCBUFF_OFF_T) 0, SEEK_SET)) < 0) {
-	syslog(L_ERROR, "%s: pre-magic read lseek failed: %m", LocalLogName);
-	return FALSE;
-    }
-    if ((bytes = read(cycbuff->fd, &rpx, sizeof(CYCBUFFEXTERN))) != sizeof(rpx)) {
-	syslog(L_ERROR, "%s: read magic failed %d bytes: %m", LocalLogName, bytes);
-	return FALSE;
-    }
-    if (CNFSseek(cycbuff->fd, tmpo, SEEK_SET) != tmpo) {
-	syslog(L_ERROR, "%s: post-magic read lseek to 0x%s failed: %m",
-	       LocalLogName, CNFSofft2hex(tmpo, FALSE));
+    errno = 0;
+    cycbuff->bitfield = mmap((caddr_t) 0, cycbuff->minartoffset,
+			     SMopenmode ? (PROT_READ | PROT_WRITE) : PROT_READ,
+			     MAP_SHARED, fd, (off_t) 0);
+    if (cycbuff->bitfield == MAP_FAILED || errno != 0) {
+	syslog(L_ERROR,
+	       "%s: CNFSinitdisks: mmap for %s offset %d len %d failed: %m",
+	       LocalLogName, cycbuff->path, 0, cycbuff->minartoffset);
+	cycbuff->bitfield = NULL;
 	return FALSE;
     }
 
@@ -581,19 +572,19 @@
     ** Much of this checking from previous revisions is (probably) bogus
     ** & buggy & particularly icky & unupdated.  Use at your own risk.  :-)
     */
-
-    if (strncmp(rpx.magic, CNFS_MAGICV3, strlen(CNFS_MAGICV3)) == 0) {
+    rpx = (CYCBUFFEXTERN *)cycbuff->bitfield;
+    if (strncmp(rpx->magic, CNFS_MAGICV3, strlen(CNFS_MAGICV3)) == 0) {
 	cycbuff->magicver = 3;
-	if (strncmp(rpx.name, cycbuff->name, CNFSNASIZ) != 0) {
+	if (strncmp(rpx->name, cycbuff->name, CNFSNASIZ) != 0) {
 	    syslog(L_ERROR, "%s: Mismatch 3: read %s for cycbuff %s", LocalLogName,
-		   rpx.name, cycbuff->name);
+		   rpx->name, cycbuff->name);
 	    return FALSE;
 	}
-	if (strncmp(rpx.path, cycbuff->path, CNFSPASIZ) != 0) {
+	if (strncmp(rpx->path, cycbuff->path, CNFSPASIZ) != 0) {
 	    syslog(L_ERROR, "%s: Path mismatch: read %s for cycbuff %s",
-		   LocalLogName, rpx.path, cycbuff->path);
+		   LocalLogName, rpx->path, cycbuff->path);
 	} 
-	strncpy(buf, rpx.lena, CNFSLASIZ);
+	strncpy(buf, rpx->lena, CNFSLASIZ);
 	buf[CNFSLASIZ] = '\0';
 	tmpo = CNFShex2offt(buf);
 	if (tmpo != cycbuff->len) {
@@ -602,18 +593,18 @@
 	    return FALSE;
 	}
 	buf[CNFSLASIZ] = '\0';
-	strncpy(buf, rpx.freea, CNFSLASIZ);
+	strncpy(buf, rpx->freea, CNFSLASIZ);
 	cycbuff->free = CNFShex2offt(buf);
 	buf[CNFSLASIZ] = '\0';
-	strncpy(buf, rpx.updateda, CNFSLASIZ);
+	strncpy(buf, rpx->updateda, CNFSLASIZ);
 	cycbuff->updated = CNFShex2offt(buf);
 	buf[CNFSLASIZ] = '\0';
-	strncpy(buf, rpx.cyclenuma, CNFSLASIZ);
+	strncpy(buf, rpx->cyclenuma, CNFSLASIZ);
 	cycbuff->cyclenum = CNFShex2offt(buf);
-	strncpy(cycbuff->metaname, rpx.metaname, CNFSLASIZ);
-	strncpy(buf, rpx.orderinmeta, CNFSLASIZ);
+	strncpy(cycbuff->metaname, rpx->metaname, CNFSLASIZ);
+	strncpy(buf, rpx->orderinmeta, CNFSLASIZ);
 	cycbuff->order = CNFShex2offt(buf);
-	if (strncmp(rpx.currentbuff, "TRUE", CNFSMASIZ) == 0) {
+	if (strncmp(rpx->currentbuff, "TRUE", CNFSMASIZ) == 0) {
 	    cycbuff->currentbuff = TRUE;
 	} else
 	    cycbuff->currentbuff = FALSE;
@@ -631,16 +622,6 @@
 	if (!CNFSflushhead(cycbuff))
 	    return FALSE;
     }
-    errno = 0;
-    fd = cycbuff->fd;
-    if ((cycbuff->bitfield =
-	 mmap((caddr_t) 0, cycbuff->minartoffset, SMopenmode ? (PROT_READ | PROT_WRITE) : PROT_READ,
-	      MAP_SHARED, fd, (off_t) 0)) == MAP_FAILED || errno != 0) {
-	syslog(L_ERROR,
-	       "%s: CNFSinitdisks: mmap for %s offset %d len %d failed: %m",
-	       LocalLogName, cycbuff->path, 0, cycbuff->minartoffset);
-	return FALSE;
-    }
     if (oneshot)
       break;
   }
@@ -915,22 +896,6 @@
 
 }
 
-/*
-** CNFSmunmapbitfields() -- Call munmap() on all of the bitfields we've
-**	previously mmap()'ed.
-*/
-
-static void CNFSmunmapbitfields(void) {
-    CYCBUFF	*cycbuff;
-
-    for (cycbuff = cycbufftab; cycbuff != (CYCBUFF *)NULL; cycbuff = cycbuff->next) {
-	if (cycbuff->bitfield != NULL) {
-	    munmap(cycbuff->bitfield, cycbuff->minartoffset);
-	    cycbuff->bitfield = NULL;
-	}
-    }
-}
-
 static int CNFSArtMayBeHere(CYCBUFF *cycbuff, CYCBUFF_OFF_T offset, uint32_t cycnum) {
     static time_t       lastupdate = 0;
     CYCBUFF	        *tmp;
@@ -959,20 +924,6 @@
     return CNFSUsedBlock(cycbuff, offset, FALSE, FALSE);
 }
 
-static void CNFSshutdowncycbuff(CYCBUFF *cycbuff) {
-    if (cycbuff == (CYCBUFF *)NULL)
-	return;
-    if (cycbuff->needflush)
-	(void)CNFSflushhead(cycbuff);
-    if (cycbuff->bitfield != NULL) {
-	munmap(cycbuff->bitfield, cycbuff->minartoffset);
-	cycbuff->bitfield = NULL;
-    }
-    if (cycbuff->fd >= 0)
-	close(cycbuff->fd);
-    cycbuff->fd = -1;
-}
-
 bool cnfs_init(SMATTRIBUTE *attr) {
     int			ret;
     METACYCBUFF	*metacycbuff;
@@ -1258,15 +1209,7 @@
     ** XXX water here.  So, to be safe, we double MAX_ART_SIZE and add enough
     ** XXX extra for the pagesize fudge factor and CNFSARTHEADER structure.
     */
-    if (CNFSseek(cycbuff->fd, offset, SEEK_SET) < 0) {
-        SMseterror(SMERR_UNDEFINED, "CNFSseek failed");
-        syslog(L_ERROR, "%s: could not lseek token %s %s:0x%s:%ld: %m",
-		LocalLogName, TokenToText(token), cycbuffname, CNFSofft2hex(offset, FALSE), cycnum);
-        DISPOSE(art);
-	if (!SMpreopen) CNFSshutdowncycbuff(cycbuff);
-        return NULL;
-    }
-    if (read(cycbuff->fd, &cah, sizeof(cah)) != sizeof(cah)) {
+    if (pread(cycbuff->fd, &cah, sizeof(cah), offset) != sizeof(cah)) {
         SMseterror(SMERR_UNDEFINED, "read failed");
         syslog(L_ERROR, "%s: could not read token %s %s:0x%s:%ld: %m",
 		LocalLogName, TokenToText(token), cycbuffname, CNFSofft2hex(offset, FALSE), cycnum);
@@ -1576,11 +1519,7 @@
 	return (ARTHANDLE *)NULL;
 
     offset = middle;
-    if (CNFSseek(cycbuff->fd, offset, SEEK_SET) < 0) {
-	if (!SMpreopen) CNFSshutdowncycbuff(cycbuff);
-	return (ARTHANDLE *)NULL;
-    }
-    if (read(cycbuff->fd, &cah, sizeof(cah)) != sizeof(cah)) {
+    if (pread(cycbuff->fd, &cah, sizeof(cah), offset) != sizeof(cah)) {
 	if (!SMpreopen) CNFSshutdowncycbuff(cycbuff);
 	return (ARTHANDLE *)NULL;
     }
@@ -1764,8 +1703,6 @@
 }
 
 void cnfs_shutdown(void) {
-    CNFSflushallheads();
-    CNFSmunmapbitfields();
     CNFScleancycbuff();
     CNFScleanmetacycbuff();
     CNFScleanexpirerule();

-- 
Alex Kiernan, Principal Engineer, Development, Thus PLC


More information about the inn-patches mailing list