char *msg =
"Exiting immediately without salvage. Look into the FileLog to find volumes which really need to be salvaged!";
+#ifndef AFS_NT40_ENV
if (useSyslog)
Log(msg);
else
+#endif
printf("%s\n", msg);
Exit(0);
Testing = 1;
if (as->parms[4].items) /* -inodes */
ListInodeOption = 1;
- if (as->parms[5].items || as->parms[20].items) /* -force, -f */
+ if (as->parms[5].items || as->parms[21].items) /* -force, -f */
ForceSalvage = 1;
if (as->parms[6].items) /* -oktozap */
OKToZap = 1;
char *msg =
"Exiting immediately without salvage. Look into the FileLog to find volumes which really need to be salvaged!";
+#ifndef AFS_NT40_ENV
if (useSyslog)
Log(msg);
else
+#endif
printf("%s\n", msg);
Exit(0);
}
-#elif defined(DEMAND_ATTACH_ENABLE)
- if (seenvol && !as->parms[19].items) {
- char * msg =
- "The standalone salvager cannot be run concurrently with a Demand Attach Fileserver. Please use 'salvageserver -client <partition> <volume id>' to manually schedule volume salvages with the salvageserver (new versions of 'bos salvage' automatically do this for you). Or, if you insist on using the standalone salvager, add the -forceDAFS flag to your salvager command line.";
-
- if (useSyslog)
- Log(msg);
- else
- printf("%s\n", msg);
- Exit(1);
- }
#endif
if (get_salvage_lock) {
Log("errors encountered initializing volume package; salvage aborted\n");
Exit(1);
}
+
+ /*
+ * Ok to defer this as Exit will clean up and no real work is done
+ * init'ing volume package
+ */
+ if (seenvol) {
+ char *msg = NULL;
+#ifdef AFS_DEMAND_ATTACH_FS
+ if (!AskDAFS()) {
+ msg =
+ "The DAFS dasalvager cannot be run with a non-DAFS fileserver. Please use 'salvager'.";
+ }
+ if (!msg && !as->parms[20].items) {
+ msg =
+ "The standalone salvager cannot be run concurrently with a Demand Attach Fileserver. Please use 'salvageserver -client <partition> <volume id>' to manually schedule volume salvages with the salvageserver (new versions of 'bos salvage' automatically do this for you). Or, if you insist on using the standalone salvager, add the -forceDAFS flag to your salvager command line.";
+ }
+#else
+ if (AskDAFS()) {
+ msg =
+ "The non-DAFS salvager cannot be run with a Demand Attach Fileserver. Please use 'salvageserver -client <partition> <volume id>' to manually schedule volume salvages with the salvageserver (new versions of 'bos salvage' automatically do this for you). Or, if you insist on using the standalone salvager, run dasalvager with the -forceDAFS flag.";
+ }
+#endif
+
+ if (msg) {
+#ifndef AFS_NT40_ENV
+ if (useSyslog)
+ Log("%s", msg);
+ else
+#endif
+ printf("%s\n", msg);
+ Exit(1);
+ }
+ }
+
DInit(10);
#ifdef AFS_NT40_ENV
if (myjob.cj_number != NOT_CHILD) {
#ifdef FAST_RESTART
cmd_AddParm(ts, "-DontSalvage", CMD_FLAG, CMD_OPTIONAL,
"Don't salvage. This my be set in BosConfig to let the fileserver restart immediately after a crash. Bad volumes will be taken offline");
-#elif defined(DEMAND_ATTACH_ENABLE)
+#elif defined(AFS_DEMAND_ATTACH_FS)
+ cmd_Seek(ts, 20); /* skip DontSalvage */
cmd_AddParm(ts, "-forceDAFS", CMD_FLAG, CMD_OPTIONAL,
"For Demand Attach Fileserver, permit a manual volume salvage outside of the salvageserver");
#endif /* FAST_RESTART */
- cmd_Seek(ts, 20);
+ cmd_Seek(ts, 21); /* skip DontSalvage and forceDAFS if needed */
cmd_AddParm(ts, "-f", CMD_FLAG, CMD_OPTIONAL, "Alias for -force");
err = cmd_Dispatch(argc, argv);
Exit(err);
if (code == SYNC_OK) {
break;
} else if (code == SYNC_DENIED) {
-#ifdef DEMAND_ATTACH_ENABLE
- Log("AskOffline: file server denied offline request; a general salvage may be required.\n");
-#else
- Log("AskOffline: file server denied offline request; a general salvage is required.\n");
-#endif
+ if (AskDAFS())
+ Log("AskOffline: file server denied offline request; a general salvage may be required.\n");
+ else
+ Log("AskOffline: file server denied offline request; a general salvage is required.\n");
Abort("Salvage aborted\n");
} else if (code == SYNC_BAD_COMMAND) {
Log("AskOffline: fssync protocol mismatch (bad command word '%d'); salvage aborting.\n",
FSYNC_VOL_OFF);
-#ifdef DEMAND_ATTACH_ENABLE
- Log("AskOffline: please make sure fileserver, volserver, salvageserver and salvager binaries are same version.\n");
+ if (AskDAFS()) {
+#ifdef AFS_DEMAND_ATTACH_FS
+ Log("AskOffline: please make sure dafileserver, davolserver, salvageserver and dasalvager binaries are same version.\n");
+#else
+ Log("AskOffline: fileserver is DAFS but we are not.\n");
+#endif
+ } else {
+#ifdef AFS_DEMAND_ATTACH_FS
+ Log("AskOffline: fileserver is not DAFS but we are.\n");
#else
- Log("AskOffline: please make sure fileserver, volserver and salvager binaries are same version.\n");
+ Log("AskOffline: please make sure fileserver, volserver and salvager binaries are same version.\n");
#endif
+ }
Abort("Salvage aborted\n");
} else if (i < 2) {
/* try it again */
}
}
+/* don't want to pass around state; remember it here */
+static int isDAFS = -1;
+int
+AskDAFS(void)
+{
+ afs_int32 code, i, ret = 0;
+ SYNC_response res;
+
+ /* we don't care if we race. the answer shouldn't change */
+ if (isDAFS != -1)
+ return isDAFS;
+
+ memset(&res, 0, sizeof(res));
+
+ for (i = 0; i < 3; i++) {
+ code = FSYNC_VolOp(1, NULL,
+ FSYNC_VOL_QUERY_VOP, FSYNC_SALVAGE, &res);
+
+ if (code == SYNC_OK) {
+ ret = 1;
+ break;
+ } else if (code == SYNC_DENIED) {
+ ret = 1;
+ break;
+ } else if (code == SYNC_BAD_COMMAND) {
+ ret = 0;
+ break;
+ } else if (code == SYNC_FAILED) {
+ if (res.hdr.reason == FSYNC_UNKNOWN_VOLID)
+ ret = 1;
+ else
+ ret = 0;
+ } else if (i < 2) {
+ /* try it again */
+ Log("AskDAFS: request to query fileserver failed; trying again...\n");
+ FSYNC_clientFinis();
+ FSYNC_clientInit();
+ }
+ }
+
+ isDAFS = ret;
+ return ret;
+}
+
void
AskOnline(struct SalvInfo *salvinfo, VolumeId volumeId)
{
} else if (code == SYNC_BAD_COMMAND) {
Log("AskOnline: fssync protocol mismatch (bad command word '%d')\n",
FSYNC_VOL_ON);
-#ifdef DEMAND_ATTACH_ENABLE
- Log("AskOnline: please make sure fileserver, volserver, salvageserver and salvager binaries are same version.\n");
-#else
- Log("AskOnline: please make sure fileserver, volserver and salvager binaries are same version.\n");
-#endif
+ Log("AskOnline: please make sure file server binaries are same version.\n");
break;
} else if (i < 2) {
/* try it again */
} else if (code == SYNC_BAD_COMMAND) {
Log("AskOnline: fssync protocol mismatch (bad command word '%d')\n",
FSYNC_VOL_DONE);
-#ifdef DEMAND_ATTACH_ENABLE
- Log("AskOnline: please make sure fileserver, volserver, salvageserver and salvager binaries are same version.\n");
+ if (AskDAFS()) {
+#ifdef AFS_DEMAND_ATTACH_FS
+ Log("AskOnline: please make sure dafileserver, davolserver, salvageserver and dasalvager binaries are same version.\n");
#else
- Log("AskOnline: please make sure fileserver, volserver and salvager binaries are same version.\n");
+ Log("AskOnline: fileserver is DAFS but we are not.\n");
#endif
+ } else {
+#ifdef AFS_DEMAND_ATTACH_FS
+ Log("AskOnline: fileserver is not DAFS but we are.\n");
+#else
+ Log("AskOnline: please make sure fileserver, volserver and salvager binaries are same version.\n");
+#endif
+ }
break;
} else if (i < 2) {
/* try it again */