tgt->ltd_active = activate;
lmv->desc.ld_active_tgt_count += (activate ? 1 : -1);
+
+ tgt->ltd_exp->exp_obd->obd_inactive = !activate;
}
/**
}
case LCFG_PARAM: {
- struct obd_device *obd = lod2obd(lod);
+ struct obd_device *obd;
+ char *param;
+
+ /* Check if it is activate/deactivate mdc
+ * lustre-MDTXXXX-osp-MDTXXXX.active=1 */
+ param = lustre_cfg_buf(lcfg, 1);
+ if (strstr(param, "osp") != NULL &&
+ strstr(param, ".active=") != NULL) {
+ struct lod_tgt_descs *ltd = &lod->lod_mdt_descs;
+ struct lod_tgt_desc *sub_tgt = NULL;
+ char *ptr;
+ char *tmp;
+ int i;
+
+ ptr = strstr(param, ".");
+ *ptr = '\0';
+ obd = class_name2obd(param);
+ if (obd == NULL) {
+ CERROR("%s: can not find %s: rc = %d\n",
+ lod2obd(lod)->obd_name, param, -EINVAL);
+ *ptr = '.';
+ GOTO(out, rc);
+ }
+
+ cfs_foreach_bit(ltd->ltd_tgt_bitmap, i) {
+ struct lod_tgt_desc *tgt;
+
+ tgt = LTD_TGT(ltd, i);
+ if (tgt->ltd_tgt->dd_lu_dev.ld_obd == obd) {
+ sub_tgt = tgt;
+ break;
+ }
+ }
+
+ if (sub_tgt == NULL) {
+ CERROR("%s: can not find %s: rc = %d\n",
+ lod2obd(lod)->obd_name, param, -EINVAL);
+ *ptr = '.';
+ GOTO(out, rc);
+ }
+
+ *ptr = '.';
+ tmp = strstr(param, "=");
+ tmp++;
+ if (*tmp == '1') {
+ struct llog_ctxt *ctxt;
+ obd = sub_tgt->ltd_tgt->dd_lu_dev.ld_obd;
+ ctxt = llog_get_context(obd,
+ LLOG_UPDATELOG_ORIG_CTXT);
+ if (ctxt == NULL) {
+ rc = llog_setup(env, obd, &obd->obd_olg,
+ LLOG_UPDATELOG_ORIG_CTXT,
+ NULL, &llog_common_cat_ops);
+ if (rc < 0)
+ GOTO(out, rc);
+ } else {
+ llog_ctxt_put(ctxt);
+ }
+ rc = lod_sub_prep_llog(env, lod,
+ sub_tgt->ltd_tgt,
+ sub_tgt->ltd_index);
+ if (rc == 0)
+ sub_tgt->ltd_active = 1;
+ } else {
+ lod_sub_fini_llog(env, sub_tgt->ltd_tgt,
+ NULL);
+ sub_tgt->ltd_active = 0;
+ }
+ GOTO(out, rc);
+ }
+
+ obd = lod2obd(lod);
rc = class_process_proc_param(PARAM_LOV, obd->obd_vars,
lcfg, obd);
if (rc > 0)
tgt = MDT_TGT(d, i);
LASSERT(tgt != NULL);
LASSERT(tgt->ltd_tgt != NULL);
+ if (!tgt->ltd_active)
+ continue;
+
ctxt = llog_get_context(tgt->ltd_tgt->dd_lu_dev.ld_obd,
LLOG_UPDATELOG_ORIG_CTXT);
if (ctxt == NULL) {
+ CDEBUG(D_INFO, "%s: %s is not ready.\n",
+ obd->obd_name,
+ tgt->ltd_tgt->dd_lu_dev.ld_obd->obd_name);
rc = -EAGAIN;
break;
}
if (ctxt->loc_handle == NULL) {
+ CDEBUG(D_INFO, "%s: %s is not ready.\n",
+ obd->obd_name,
+ tgt->ltd_tgt->dd_lu_dev.ld_obd->obd_name);
rc = -EAGAIN;
llog_ctxt_put(ctxt);
break;
#include "mdc_internal.h"
#ifdef CONFIG_PROC_FS
+static int mdc_active_seq_show(struct seq_file *m, void *v)
+{
+ struct obd_device *dev = m->private;
+ int rc;
+
+ LPROCFS_CLIMP_CHECK(dev);
+ rc = seq_printf(m, "%d\n", !dev->u.cli.cl_import->imp_deactive);
+ LPROCFS_CLIMP_EXIT(dev);
+ return rc;
+}
+
+static ssize_t mdc_active_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct obd_device *dev;
+ int val, rc;
+
+ dev = ((struct seq_file *)file->private_data)->private;
+ rc = lprocfs_write_helper(buffer, count, &val);
+ if (rc)
+ return rc;
+ if (val < 0 || val > 1)
+ return -ERANGE;
+
+ /* opposite senses */
+ if (dev->u.cli.cl_import->imp_deactive == val)
+ rc = ptlrpc_set_import_active(dev->u.cli.cl_import, val);
+ else
+ CDEBUG(D_CONFIG, "activate %d: ignoring repeat request\n", val);
+
+ return count;
+}
+LPROC_SEQ_FOPS(mdc_active);
static int mdc_max_rpcs_in_flight_seq_show(struct seq_file *m, void *v)
{
.fops = &mdc_pinger_recov_fops },
{ .name = "rpc_stats",
.fops = &mdc_rpc_stats_fops },
+ { .name = "active",
+ .fops = &mdc_active_fops },
{ NULL }
};
#endif /* CONFIG_PROC_FS */
GOTO(end, rc);
}
- if (class_match_param(ptr, PARAM_OSC""PARAM_ACTIVE, &tmp) == 0) {
- /* active=0 means off, anything else means on */
- int flag = (*tmp == '0') ? CM_EXCLUDE : 0;
- int i;
+ if (class_match_param(ptr, PARAM_OSC PARAM_ACTIVE, &tmp) == 0 ||
+ class_match_param(ptr, PARAM_MDC PARAM_ACTIVE, &tmp) == 0) {
+ /* active=0 means off, anything else means on */
+ int flag = (*tmp == '0') ? CM_EXCLUDE : 0;
+ bool deactive_osc = memcmp(ptr, PARAM_OSC PARAM_ACTIVE,
+ strlen(PARAM_OSC PARAM_ACTIVE)) == 0;
+ int i;
+
+ if (!deactive_osc) {
+ __u32 index;
+
+ rc = server_name2index(mti->mti_svname, &index, NULL);
+ if (rc < 0)
+ GOTO(end, rc);
- if (!(mti->mti_flags & LDD_F_SV_TYPE_OST)) {
- LCONSOLE_ERROR_MSG(0x144, "%s: Only OSCs can "
- "be (de)activated.\n",
- mti->mti_svname);
- GOTO(end, rc = -EINVAL);
- }
- LCONSOLE_WARN("Permanently %sactivating %s\n",
- flag ? "de": "re", mti->mti_svname);
- /* Modify clilov */
+ if (index == 0) {
+ LCONSOLE_ERROR_MSG(0x144, "%s: MDC0 can not be"
+ " (de)activated.\n",
+ mti->mti_svname);
+ GOTO(end, rc = -EINVAL);
+ }
+ }
+
+ LCONSOLE_WARN("Permanently %sactivating %s\n",
+ flag ? "de" : "re", mti->mti_svname);
+ /* Modify clilov */
rc = name_create(&logname, mti->mti_fsname, "-client");
- if (rc)
+ if (rc < 0)
GOTO(end, rc);
rc = mgs_modify(env, mgs, fsdb, mti, logname,
- mti->mti_svname, "add osc", flag);
- name_destroy(&logname);
- if (rc)
- goto active_err;
- /* Modify mdtlov */
- /* Add to all MDT logs for CMD */
- for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+ mti->mti_svname,
+ deactive_osc ? "add osc" : "add mdc", flag);
+ name_destroy(&logname);
+ if (rc < 0)
+ goto active_err;
+
+ /* Modify mdtlov */
+ /* Add to all MDT logs for DNE */
+ for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
if (!test_bit(i, fsdb->fsdb_mdt_index_map))
- continue;
+ continue;
rc = name_create_mdt(&logname, mti->mti_fsname, i);
- if (rc)
+ if (rc < 0)
GOTO(end, rc);
rc = mgs_modify(env, mgs, fsdb, mti, logname,
- mti->mti_svname, "add osc", flag);
- name_destroy(&logname);
- if (rc)
- goto active_err;
- }
- active_err:
- if (rc) {
- LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in"
- "log (%d). No permanent "
- "changes were made to the "
- "config log.\n",
- mti->mti_svname, rc);
+ mti->mti_svname,
+ deactive_osc ? "add osc" : "add osp",
+ flag);
+ name_destroy(&logname);
+ if (rc < 0)
+ goto active_err;
+ }
+active_err:
+ if (rc < 0) {
+ LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in"
+ "log (%d). No permanent "
+ "changes were made to the "
+ "config log.\n",
+ mti->mti_svname, rc);
if (test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags))
- LCONSOLE_ERROR_MSG(0x146, "This may be"
- " because the log"
- "is in the old 1.4"
- "style. Consider "
- " --writeconf to "
- "update the logs.\n");
- GOTO(end, rc);
- }
- /* Fall through to osc proc for deactivating live OSC
- on running MDT / clients. */
- }
+ LCONSOLE_ERROR_MSG(0x146, "This may be"
+ " because the log"
+ "is in the old 1.4"
+ "style. Consider "
+ " --writeconf to "
+ "update the logs.\n");
+ GOTO(end, rc);
+ }
+ /* Fall through to osc/mdc proc for deactivating live
+ OSC/OSP on running MDT / clients. */
+ }
/* Below here, let obd's XXX_process_config methods handle it */
/* All lov. in proc */
}
}
}
+
+ /* For mdc activate/deactivate, it affects OSP on MDT as well */
+ if (class_match_param(ptr, PARAM_MDC PARAM_ACTIVE, &tmp) == 0 &&
+ rc == 0) {
+ char suffix[16];
+ char *lodname = NULL;
+ char *param_str = NULL;
+ int i;
+ int index;
+
+ /* replace mdc with osp */
+ memcpy(ptr, PARAM_OSP, strlen(PARAM_OSP));
+ rc = server_name2index(mti->mti_svname, &index, NULL);
+ if (rc < 0) {
+ memcpy(ptr, PARAM_MDC, strlen(PARAM_MDC));
+ GOTO(end, rc);
+ }
+
+ for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+ if (!test_bit(i, fsdb->fsdb_mdt_index_map))
+ continue;
+
+ if (i == index)
+ continue;
+
+ name_destroy(&logname);
+ rc = name_create_mdt(&logname, mti->mti_fsname,
+ i);
+ if (rc < 0)
+ break;
+
+ if (mgs_log_is_empty(env, mgs, logname))
+ continue;
+
+ snprintf(suffix, sizeof(suffix), "-osp-MDT%04x",
+ i);
+ name_destroy(&cname);
+ rc = name_create(&cname, mti->mti_svname,
+ suffix);
+ if (rc < 0)
+ break;
+
+ rc = mgs_wlp_lcfg(env, mgs, fsdb, mti, logname,
+ &mgi->mgi_bufs, cname, ptr);
+ if (rc < 0)
+ break;
+
+ /* Add configuration log for noitfying LOD
+ * to active/deactive the OSP. */
+ name_destroy(¶m_str);
+ rc = name_create(¶m_str, cname,
+ (*tmp == '0') ? ".active=0" :
+ ".active=1");
+ if (rc < 0)
+ break;
+
+ name_destroy(&lodname);
+ rc = name_create(&lodname, logname, "-mdtlov");
+ if (rc < 0)
+ break;
+
+ rc = mgs_wlp_lcfg(env, mgs, fsdb, mti, logname,
+ &mgi->mgi_bufs, lodname,
+ param_str);
+ if (rc < 0)
+ break;
+ }
+ memcpy(ptr, PARAM_MDC, strlen(PARAM_MDC));
+ name_destroy(&lodname);
+ name_destroy(¶m_str);
+ }
+
name_destroy(&logname);
name_destroy(&cname);
GOTO(end, rc);
break;
case LCFG_PARAM:
LASSERT(obd);
- rc = class_process_proc_param(PARAM_OSC, obd->obd_vars,
- lcfg, obd);
+ rc = class_process_proc_param(d->opd_connect_mdt ?
+ PARAM_OSP : PARAM_OSC,
+ obd->obd_vars, lcfg, obd);
if (rc > 0)
rc = 0;
if (rc == -ENOSYS) {
}
run_test 50h "LU-642: activate deactivated OST"
+test_50i() {
+ # prepare MDT/OST, make OSC inactive for OST1
+ [ "$MDSCOUNT" -lt "2" ] && skip_env "$MDSCOUNT < 2, skipping" && return
+
+ [ $(facet_fstype ost1) == zfs ] && import_zpool ost1
+ load_modules
+ do_facet mds2 "$TUNEFS --param mdc.active=0 $(mdsdevname 2)" ||
+ error "tunefs MDT2 failed"
+ start_mds || error "Unable to start MDT"
+ start_ost || error "Unable to start OST1"
+ start_ost2 || error "Unable to start OST2"
+ mount_client $MOUNT || error "client start failed"
+
+ mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
+
+ $LCTL conf_param ${FSNAME}-MDT0000.mdc.active=0 &&
+ error "deactive MDC0 succeeds"
+ # activate MDC for MDT2
+ local TEST="$LCTL get_param -n mdc.${FSNAME}-MDT0001-mdc-[!M]*.active"
+ set_conf_param_and_check client \
+ "$TEST" "${FSNAME}-MDT0001.mdc.active" 1 ||
+ error "Unable to activate MDT2"
+
+ $LFS mkdir -i1 $DIR/$tdir/2 || error "mkdir $DIR/$tdir/2 failed"
+ # create some file
+ createmany -o $DIR/$tdir/2/$tfile-%d 1 || error "create files failed"
+
+ rm -rf $DIR/$tdir/2 || error "unlink dir failed"
+
+ # deactivate MDC for MDT2
+ local TEST="$LCTL get_param -n mdc.${FSNAME}-MDT0001-mdc-[!M]*.active"
+ set_conf_param_and_check client \
+ "$TEST" "${FSNAME}-MDT0001.mdc.active" 0 ||
+ error "Unable to deactivate MDT2"
+
+ $LFS mkdir -i1 $DIR/$tdir/2 &&
+ error "mkdir $DIR/$tdir/2 succeeds after deactive MDT"
+
+ # cleanup
+ umount_client $MOUNT || error "Unable to umount client"
+ stop_mds
+ stop_ost
+ stop_ost 2
+}
+run_test 50i "activate deactivated MDT"
+
test_51() {
local LOCAL_TIMEOUT=20