int VAttachPartitions(void) { int errors = 0; struct mnttab mnt; FILE *mntfile; if (!(mntfile = afs_fopen(MNTTAB, "r"))) { Log("Can't open %s\n", MNTTAB); perror(MNTTAB); exit(-1); } while (!getmntent(mntfile, &mnt)) { /* Ignore non ufs or non read/write partitions */ /* but allow zfs too if we're in the NAMEI environment */ if ( #ifdef AFS_NAMEI_ENV (((strcmp(mnt.mnt_fstype, "ufs") && strcmp(mnt.mnt_fstype, "zfs")))) #else (strcmp(mnt.mnt_fstype, "ufs") != 0) #endif || (strncmp(mnt.mnt_mntopts, "ro,ignore", 9) == 0)) continue; /* If we're going to always attach this partition, do it later. */ if (VIsAlwaysAttach(mnt.mnt_mountp)) continue; #ifndef AFS_NAMEI_ENV if (hasmntopt(&mnt, "logging") != NULL) { Log("This program is compiled without AFS_NAMEI_ENV, and " "partition %s is mounted with the 'logging' option. " "Using the inode fileserver backend with 'logging' UFS " "partitions causes volume corruption, so please either " "mount the partition without logging, or use the namei " "fileserver backend. Aborting...\n", mnt.mnt_mountp); errors++; } #endif /* !AFS_NAMEI_ENV */ if (VCheckPartition(mnt.mnt_mountp, mnt.mnt_special) < 0) errors++; } (void)fclose(mntfile); /* Process the always-attach partitions, if any. */ VAttachPartitions2(); return errors; }
int VAttachPartitions(void) { int errors = 0; struct mnttab mnt; FILE *mntfile; if (!(mntfile = afs_fopen(MNTTAB, "r"))) { Log("Can't open %s\n", MNTTAB); perror(MNTTAB); exit(-1); } while (!getmntent(mntfile, &mnt)) { int logging = 0; /* Ignore non ufs or non read/write partitions */ /* but allow zfs too if we're in the NAMEI environment */ if ( #ifdef AFS_NAMEI_ENV (((strcmp(mnt.mnt_fstype, "ufs") && strcmp(mnt.mnt_fstype, "zfs")))) #else (strcmp(mnt.mnt_fstype, "ufs") != 0) #endif || (strncmp(mnt.mnt_mntopts, "ro,ignore", 9) == 0)) continue; /* Skip this Partition? */ if (VIsNeverAttach(mnt.mnt_mountp)) continue; /* If we're going to always attach this partition, do it later. */ if (VIsAlwaysAttach(mnt.mnt_mountp, NULL)) continue; #ifndef AFS_NAMEI_ENV if (hasmntopt(&mnt, "logging") != NULL) { logging = 1; } #endif /* !AFS_NAMEI_ENV */ if (VCheckPartition(mnt.mnt_mountp, mnt.mnt_special, logging) < 0) errors++; } (void)fclose(mntfile); /* Process the always-attach partitions, if any. */ VAttachPartitions2(); return errors; }
static int DoSalvageVolume(struct SalvageQueueNode * node, int slot) { char childLog[AFSDIR_PATH_MAX]; struct DiskPartition64 * partP; /* do not allow further forking inside salvager */ canfork = 0; /* do not attempt to close parent's logFile handle as * another thread may have held the lock on the FILE * structure when fork was called! */ afs_snprintf(childLog, sizeof(childLog), "%s.%d", AFSDIR_SERVER_SLVGLOG_FILEPATH, getpid()); logFile = afs_fopen(childLog, "a"); if (!logFile) { /* still nothing, use stdout */ logFile = stdout; ShowLog = 0; } if (node->command.sop.parent <= 0) { Log("salvageServer: invalid volume id specified; salvage aborted\n"); return 1; } partP = VGetPartition(node->command.sop.partName, 0); if (!partP) { Log("salvageServer: Unknown or unmounted partition %s; salvage aborted\n", node->command.sop.partName); return 1; } /* obtain a shared salvage lock in the child worker, so if the * salvageserver restarts (and we continue), we will still hold a lock and * prevent standalone salvagers from interfering */ ObtainSharedSalvageLock(); /* Salvage individual volume; don't notify fs */ SalvageFileSys1(partP, node->command.sop.parent); fclose(logFile); return 0; }