* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2015, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
if (strlen(fsname) >= sizeof(fsdb->fsdb_name)) {
CERROR("fsname %s is too long\n", fsname);
- RETURN(NULL);
+ RETURN(ERR_PTR(-EINVAL));
}
OBD_ALLOC_PTR(fsdb);
if (!fsdb)
- RETURN(NULL);
+ RETURN(ERR_PTR(-ENOMEM));
strcpy(fsdb->fsdb_name, fsname);
mutex_init(&fsdb->fsdb_mutex);
if (strcmp(fsname, MGSSELF_NAME) == 0) {
set_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags);
+ fsdb->fsdb_mgs = mgs;
} else {
OBD_ALLOC(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
OBD_ALLOC(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
name_destroy(&fsdb->fsdb_clilov);
name_destroy(&fsdb->fsdb_clilmv);
OBD_FREE_PTR(fsdb);
- RETURN(NULL);
+ RETURN(ERR_PTR(rc));
}
static void mgs_free_fsdb(struct mgs_device *mgs, struct fs_db *fsdb)
CDEBUG(D_MGS, "Creating new db\n");
fsdb = mgs_new_fsdb(env, mgs, name);
/* lock fsdb_mutex until the db is loaded from llogs */
- if (fsdb)
+ if (!IS_ERR(fsdb))
mutex_lock(&fsdb->fsdb_mutex);
mutex_unlock(&mgs->mgs_mutex);
- if (!fsdb)
- RETURN(-ENOMEM);
+ if (IS_ERR(fsdb))
+ RETURN(PTR_ERR(fsdb));
if (!test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) {
/* populate the db from the client llog */
GOTO(out_end, rc);
/* Add mdc(osp) to lod */
- snprintf(index_str, sizeof(mti->mti_stripe_index), "%d",
- mti->mti_stripe_index);
+ snprintf(index_str, sizeof(index_str), "%d", mti->mti_stripe_index);
rc = record_base(env, llh, lovname, 0, LCFG_ADD_MDC, mti->mti_uuid,
index_str, "1", NULL);
if (rc)
GOTO(out_free, rc);
}
rc = mgs_write_log_osc_to_lov(env, mgs, fsdb, mti, logname, "",
- fsdb->fsdb_clilov, LUSTRE_SP_CLI, 0);
+ fsdb->fsdb_clilov, LUSTRE_SP_CLI, flags);
out_free:
name_destroy(&logname);
RETURN(rc);
}
rset = &tgtconf->mtsc_rset;
+ } else if (strcmp(svname, MGSSELF_NAME) == 0) {
+ /* put _mgs related srpc rule directly in mgs ruleset */
+ rset = &fsdb->fsdb_mgs->mgs_lut.lut_sptlrpc_rset;
} else {
rset = &fsdb->fsdb_srpc_gen;
}
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 (!(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 (!deactive_osc) {
+ __u32 index;
+
+ rc = server_name2index(mti->mti_svname, &index, NULL);
+ if (rc < 0)
+ GOTO(end, rc);
+
+ 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);
EXIT;
}
+/* Setup _mgs fsdb and log
+ */
+int mgs__mgs_fsdb_setup(const struct lu_env *env, struct mgs_device *mgs,
+ struct fs_db *fsdb)
+{
+ int rc;
+ ENTRY;
+
+ rc = mgs_find_or_make_fsdb(env, mgs, MGSSELF_NAME, &fsdb);
+
+ RETURN(rc);
+}
+
/* Setup params fsdb and log
*/
int mgs_params_fsdb_setup(const struct lu_env *env, struct mgs_device *mgs,