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