I found the cause (unless there is more than one) of the /var problems.
fsck.jfs has been testing whether a file handle is non-zero to determine
if it should update the inode maps and block maps after replaying the
journal.  The problem is that at boot time, the file handle returned from
open is zero!  I guess fsck must be closing stdin before invoking fsck.jfs.

This patch to jfsutils uses a specific flag to determine whether
the partition is to be completed, rather than the non-zero file handle.

Thanks for your patience!
Dave

Index: jfsutils/libfs/log_dump.c
===================================================================
RCS file: /usr/cvs/jfs/jfsutils/libfs/log_dump.c,v
retrieving revision 1.4
diff -u -r1.4 log_dump.c
--- jfsutils/libfs/log_dump.c   2001/10/11 20:25:14     1.4
+++ jfsutils/libfs/log_dump.c   2001/12/20 21:37:48
@@ -583,7 +583,7 @@
     fprintf(outfp, "ldmp_openVol: ldmp_rdwrSuper failed\n" );
     fprintf(outfp, "??????????????????????????????????????????????????????\n");
     ldmp_fsError(READERR,vol, SUPER1_B);
-    vopen[vol].fd = 0;
+    vopen[vol].active = 0;
     return(MINOR_ERROR);
   }
 
@@ -596,7 +596,7 @@
       fprintf(outfp, "??????????????????????????????????????????????????????\n");
       fprintf(outfp, "ldmp_openVol:version number not right %d\n",vol );
       fprintf(outfp, "??????????????????????????????????????????????????????\n");
-      vopen[vol].fd = 0;
+      vopen[vol].active = 0;
       return(MINOR_ERROR);
     }
 
@@ -606,7 +606,7 @@
       fprintf(outfp, "??????????????????????????????????????????????????????\n");
       fprintf(outfp, "ldmp_openVol: log location wrong\n" );
       fprintf(outfp, "??????????????????????????????????????????????????????\n");
-      vopen[vol].fd = 0;
+      vopen[vol].active = 0;
       return(MAJOR_ERROR);
     }
     if ( loglocation != INLINELOG) {
@@ -630,7 +630,7 @@
     fprintf(outfp, "??????????????????????????????????????????????????????\n");
     fprintf(outfp, "ldmp_openVol: magic number not right %d\n",vol );
     fprintf(outfp, "??????????????????????????????????????????????????????\n");
-    vopen[vol].fd = 0;
+    vopen[vol].active = 0;
     return(MINOR_ERROR);
   }
 
@@ -642,7 +642,7 @@
    */
   if (sb.s_state == FM_CLEAN) {
     vopen[vol].status  = FM_CLEAN;
-    vopen[vol].fd = 0;
+    vopen[vol].active = 0;
     return(0);
   }
 
@@ -658,7 +658,7 @@
     fprintf(outfp, "??????????????????????????????????????????????????????\n");
     fprintf(outfp, "ldmp_openVol: bad serial number\n" );
     fprintf(outfp, "??????????????????????????????????????????????????????\n");
-    vopen[vol].fd = 0;
+    vopen[vol].active = 0;
     ldmp_fsError(SERIALNO, vol, SUPER1_B);
     return(MINOR_ERROR);
   }
@@ -859,6 +859,7 @@
         }
 
         loglocation = INLINELOG;
+        vopen[devminor].active = 1;
         vopen[devminor].fd = fd;
         vopen[devminor].log_pxd = sb.s_logpxd;
         vopen[devminor].l2bsize = sb.s_l2bsize;
@@ -1027,7 +1028,7 @@
   /* mark all open volumes in error
    */
   for (k = 0; k < NUMMINOR; k++) {
-    if (vopen[k].fd && vopen[k].status != FM_CLEAN)
+    if (vopen[k].active && vopen[k].status != FM_CLEAN)
       vopen[k].status = FM_LOGREDO;
   }
 
Index: jfsutils/libfs/logredo.c
===================================================================
RCS file: /usr/cvs/jfs/jfsutils/libfs/logredo.c,v
retrieving revision 1.3
diff -u -r1.3 logredo.c
--- jfsutils/libfs/logredo.c    2001/10/10 16:46:59     1.3
+++ jfsutils/libfs/logredo.c    2001/12/20 21:37:48
@@ -921,7 +921,7 @@
    * i.e. if they were not previously unmounted cleanly.
    */
   for (k = 0; k < NUMMINOR; k++) {
-    if (!vopen[k].fd)
+    if (!vopen[k].active)
       continue;
 
     /* don't update the maps if the aggregate/lv is
@@ -1061,7 +1061,7 @@
     fsck_send_msg( lrdo_CANTREADFSSUPER, 0, 0 );
 
     fsError(READERR,vol, SUPER1_B);
-    vopen[vol].fd = 0;
+    vopen[vol].active = 0;
     return(FSSUPER_READERROR1);
   }
 
@@ -1071,14 +1071,14 @@
   if (strncmp(sb.s_magic,JFS_MAGIC,(unsigned)strlen(JFS_MAGIC)) == 0) {
     if (sb.s_version != JFS_VERSION) {
       fsck_send_msg( lrdo_FSSUPERBADMAGIC, 0, 0 );
-      vopen[vol].fd = 0;
+      vopen[vol].active = 0;
       return(LOGSUPER_BADVERSION);
     }
 
     if ( loglocation == OUTLINELOG &&
          (sb.s_flag & (JFS_INLINELOG == JFS_INLINELOG) )) {
       fsck_send_msg( lrdo_FSSUPERBADLOGLOC, 0, 0 );
-      vopen[vol].fd = 0;
+      vopen[vol].active = 0;
       return(LOGSUPER_BADLOGLOC);
     }
     if ( loglocation != INLINELOG) {
@@ -1099,7 +1099,7 @@
     vopen[vol].l2agsize = l2agsize;
   } else {
     fsck_send_msg( lrdo_FSSUPERBADMAGIC, 0, 0 );
-    vopen[vol].fd = 0;
+    vopen[vol].active = 0;
     return(LOGSUPER_BADMAGIC);
   }
 
@@ -1113,7 +1113,7 @@
    */
   if (sb.s_state == FM_CLEAN) {
     vopen[vol].status  = FM_CLEAN;
-    vopen[vol].fd = 0;
+    vopen[vol].active = 0;
     return(0);
   }
 
@@ -1128,7 +1128,7 @@
    */
   if (sb.s_logserial != logserial) {
     fsck_send_msg( lrdo_FSSUPERBADLOGSER, 0, 0 );
-    vopen[vol].fd = 0;
+    vopen[vol].active = 0;
     fsError(SERIALNO, vol, SUPER1_B);
     return(LOGSUPER_BADSERIAL);
   }
@@ -1404,6 +1404,7 @@
         }
 
         loglocation = INLINELOG;
+        vopen[devminor].active = 1;
         vopen[devminor].fd = fd;
         vopen[devminor].status = sb.s_state;
         vopen[devminor].log_pxd = sb.s_logpxd;
@@ -1576,7 +1577,7 @@
   /* mark all open volumes in error
    */
   for (k = 0; k < NUMMINOR; k++) {
-    if (vopen[k].fd && vopen[k].status != FM_CLEAN)
+    if (vopen[k].active && vopen[k].status != FM_CLEAN)
       vopen[k].status = FM_LOGREDO;
   }
   return(0);
Index: jfsutils/libfs/logredo.h
===================================================================
RCS file: /usr/cvs/jfs/jfsutils/libfs/logredo.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 logredo.h
--- jfsutils/libfs/logredo.h    2001/08/20 21:22:12     1.1.1.1
+++ jfsutils/libfs/logredo.h    2001/12/20 21:37:48
@@ -205,6 +205,7 @@
 #define NUMMINOR  256
 struct vopen
 {
+  s32  active;          /* 4: non-zero if active aggregate */
   s32  fd;              /* 4: file descriptor for the opened aggregate */
   s32  status;          /* 4: status of  aggregate/volume */
   s64  fssize;          /* 8: fs size, total number of aggre. blks */
_______________________________________________
Jfs-discussion mailing list
[EMAIL PROTECTED]
http://www-124.ibm.com/developerworks/oss/mailman/listinfo/jfs-discussion

Reply via email to