rc = mgs_erase_logs(obd, mti->mti_fsname);
LCONSOLE_WARN("%s: Logs for fs %s were removed by user "
"request. All servers must be restarted "
- "in order to regenerate the client log."
+ "in order to regenerate the logs."
"\n", obd->obd_name, mti->mti_fsname);
} else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
rc = mgs_erase_log(obd, mti->mti_svname);
"request.\n",
obd->obd_name, mti->mti_fsname);
}
- mti->mti_flags &= ~LDD_F_WRITECONF;
mti->mti_flags |= LDD_F_UPDATE;
}
GOTO(out, rc);
}
- mti->mti_flags &= ~LDD_F_UPGRADE14;
- /* Turn off the upgrade flag permanently */
+ /* Turn off all other update-related flags; we're done. */
+ mti->mti_flags &= ~(LDD_F_UPGRADE14 |
+ LDD_F_VIRGIN | LDD_F_UPDATE |
+ LDD_F_NEED_INDEX | LDD_F_WRITECONF);
mti->mti_flags |= LDD_F_REWRITE_LDD;
}
/* end COMPAT_146 */
CDEBUG(D_MGS, "updating %s, index=%d\n", mti->mti_svname,
mti->mti_stripe_index);
- /* create the log for the new target
+ /* create or update the target log
and update the client/mdt logs */
rc = mgs_write_log_target(obd, mti);
if (rc) {
}
mti->mti_flags &= ~(LDD_F_VIRGIN | LDD_F_UPDATE |
- LDD_F_NEED_INDEX);
+ LDD_F_NEED_INDEX | LDD_F_WRITECONF);
mti->mti_flags |= LDD_F_REWRITE_LDD;
}
rep_mti = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF,
sizeof(*rep_mti));
memcpy(rep_mti, mti, sizeof(*rep_mti));
+
+ /* Flush logs to disk */
+ fsfilt_sync(obd, obd->u.mgs.mgs_sb);
RETURN(rc);
}
RETURN(0);
}
-
+/* Return codes:
+ 0 newly marked as in use
+ <0 err
+ +EALREADY for update of an old index */
int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
{
struct fs_db *fsdb;
/* write the lcfg in all logs for the given fs */
int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb,
- char *fsname, struct lustre_cfg *lcfg)
+ struct mgs_target_info *mti, struct lustre_cfg *lcfg)
{
struct mgs_obd *mgs = &obd->u.mgs;
struct list_head dentry_list;
struct l_linux_dirent *dirent, *n;
+ char *fsname = mti->mti_fsname;
char *logname;
int rc, len = strlen(fsname);
ENTRY;
if (strncmp(fsname, dirent->lld_name, len) == 0) {
CDEBUG(D_MGS, "Changing log %s\n", dirent->lld_name);
rc = mgs_write_log_direct(obd, fsdb, dirent->lld_name,
- dirent->lld_name, lcfg);
+ mti->mti_svname, lcfg);
}
OBD_FREE(dirent, sizeof(*dirent));
}
if (!mti->mti_params)
RETURN(0);
+ /* FIXME we should cancel out old settings of the same parameters,
+ and skip settings that are the same as old values */
+
while (ptr < end) {
while (*ptr == ' ')
ptr++;
rc = 0;
/* We already processed failovers params for new
targets in mgs_write_log_target */
- if (mti->mti_flags & MTI_F_IOCTL) {
+ if (mti->mti_flags & LDD_F_PARAM_FNID) {
CDEBUG(D_MGS, "Adding failnode\n");
rc = mgs_write_log_add_failnid(obd, fsdb, mti);
}
lcfg = lustre_cfg_new(LCFG_SET_TIMEOUT, &bufs);
lcfg->lcfg_num = timeout;
/* modify all servers and clients */
- rc = mgs_write_log_direct_all(obd, fsdb, mti->mti_fsname,
- lcfg);
+ rc = mgs_write_log_direct_all(obd, fsdb, mti, lcfg);
lustre_cfg_free(lcfg);
GOTO(end_while, rc);
}
/* COMPAT_146 */
if (mti->mti_flags & LDD_F_UPGRADE14) {
if (rc == EALREADY) {
- CDEBUG(D_MGS, "Found index for %s old log, upgrading\n",
- mti->mti_svname);
+ CDEBUG(D_MGS, "Found index %d for %s 1.4 log, upgrading\n",
+ mti->mti_stripe_index, mti->mti_svname);
} else {
LCONSOLE_ERROR("Failed to find %s in the old client "
"log\n", mti->mti_svname);
+ /* Not in client log? Upgrade anyhow...*/
/* RETURN(-EINVAL); */
}
/* end COMPAT_146 */
} else {
if (rc == EALREADY) {
/* Update a target entry in the logs */
- LCONSOLE_WARN("Found index %d for %s, "
- "attempting to write log anyhow\n",
+ LCONSOLE_WARN("Found index %d for %s, updating log\n",
mti->mti_stripe_index, mti->mti_svname);
/* FIXME mark old log sections as invalid,
inc config ver #, add new log sections.
down(&fsdb->fsdb_sem);
- if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
- rc = mgs_write_log_mdt(obd, fsdb, mti);
- } else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
- rc = mgs_write_log_ost(obd, fsdb, mti);
+ if (mti->mti_flags &
+ (LDD_F_VIRGIN | LDD_F_UPGRADE14 | LDD_F_WRITECONF)) {
+ /* Generate a log from scratch */
+ if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
+ rc = mgs_write_log_mdt(obd, fsdb, mti);
+ } else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
+ rc = mgs_write_log_ost(obd, fsdb, mti);
+ } else {
+ CERROR("Unknown target type %#x, can't create log for "
+ "%s\n", mti->mti_flags, mti->mti_svname);
+ }
+ if (rc) {
+ CERROR("Can't write logs for %s (%d)\n",
+ mti->mti_svname, rc);
+ GOTO(out_up, rc);
+ }
} else {
- CERROR("Unknown target type %#x, can't create log for %s\n",
- mti->mti_flags, mti->mti_svname);
- }
- if (rc) {
- CERROR("Can't write logs for %s (%d)\n", mti->mti_svname, rc);
- GOTO(out_up, rc);
+ /* Just update the params from tunefs in mgs_write_log_params */
+ CDEBUG(D_MGS, "Update params for %s\n", mti->mti_svname);
+ mti->mti_flags |= LDD_F_PARAM_FNID;
}
-
+
rc = mgs_write_log_params(obd, fsdb, mti);
out_up:
rc = server_name2index(devname, &mti->mti_stripe_index, NULL);
if (rc < 0)
GOTO(out, rc);
- mti->mti_flags = rc | MTI_F_IOCTL;
+ mti->mti_flags = rc | LDD_F_PARAM_FNID;
strncpy(mti->mti_params, lustre_cfg_string(lcfg, 1),
sizeof(mti->mti_params));
"\t\t\trequired for all targets other than the mgs node\n"
"\t\t--fsname=<filesystem_name> : default is 'lustre'\n"
"\t\t--failnode=<nid>[,<...>] : NID(s) of a failover partner\n"
-#ifndef TUNEFS
- /* Use lctl conf_param on a live system, not tunefs.
- Currently, new/modified params written here are checked
- only on the first mount. */
"\t\t--param <key>=<value> : set a permanent parameter\n"
"\t\t\te.g. --param sys.timeout=40\n"
"\t\t\t --param lov.stripe.size=4194304\n"
-#endif
"\t\t--index=#N : target index (i.e. ost index within the lov)\n"
/* FIXME implement 1.6.x
"\t\t--configdev=<altdevice|file>: store configuration info\n"
break;
case 'e':
mop->mo_ldd.ldd_params[0] = '\0';
+ /* Must update the mgs logs */
+ mop->mo_ldd.ldd_flags |= LDD_F_UPDATE;
break;
case 'f': {
char *nids = convert_hostnames(optarg);
free(nids);
if (rc)
return rc;
+ /* Must update the mgs logs */
+ mop->mo_ldd.ldd_flags |= LDD_F_UPDATE;
break;
}
case 'G':
usage(stdout);
return 1;
case 'i':
+ if (!(mop->mo_ldd.ldd_flags &
+ (LDD_F_UPGRADE14 | LDD_F_VIRGIN |
+ LDD_F_WRITECONF))) {
+ fprintf(stderr, "%s: cannot change the index of"
+ " a registered target\n", progname);
+ return 1;
+ }
if (IS_MDT(&mop->mo_ldd) || IS_OST(&mop->mo_ldd)) {
mop->mo_ldd.ldd_svindex = atol(optarg);
mop->mo_ldd.ldd_flags &= ~LDD_F_NEED_INDEX;
sizeof(mop->mo_mkfsopts) - 1);
break;
case 'L':
+ if (!(mop->mo_ldd.ldd_flags &
+ (LDD_F_UPGRADE14 | LDD_F_VIRGIN |
+ LDD_F_WRITECONF))) {
+ fprintf(stderr, "%s: cannot change the name of"
+ " a registered target\n", progname);
+ return 1;
+ }
if (strlen(optarg) > 8) {
fprintf(stderr, "%s: filesystem name must be "
"<= 8 chars\n", progname);
rc = add_param(mop->mo_ldd.ldd_params, NULL, optarg);
if (rc)
return rc;
+ /* Must update the mgs logs */
+ mop->mo_ldd.ldd_flags |= LDD_F_UPDATE;
break;
case 'q':
verbose--;
goto out;
ldd = &mop.mo_ldd;
+
if (!(IS_MDT(ldd) || IS_OST(ldd) || IS_MGS(ldd))) {
fatal();
fprintf(stderr, "must set target type: MDT,OST,MGS\n");