* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2015, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
LASSERT(dir->do_index_ops);
iops = &dir->do_index_ops->dio_it;
- it = iops->init(env, dir, LUDA_64BITHASH, BYPASS_CAPA);
+ it = iops->init(env, dir, LUDA_64BITHASH);
if (IS_ERR(it))
RETURN(PTR_ERR(it));
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 */
fsdb->fsdb_mdt_count ++;
}
- if (mti->mti_stripe_index >= INDEX_MAP_SIZE * 8) {
- LCONSOLE_ERROR_MSG(0x13f, "Server %s requested index %d, "
- "but the max index is %d.\n",
- mti->mti_svname, mti->mti_stripe_index,
- INDEX_MAP_SIZE * 8);
+ /* the last index(0xffff) is reserved for default value. */
+ if (mti->mti_stripe_index >= INDEX_MAP_SIZE * 8 - 1) {
+ LCONSOLE_ERROR_MSG(0x13f, "Server %s requested index %u, "
+ "but index must be less than %u.\n",
+ mti->mti_svname, mti->mti_stripe_index,
+ INDEX_MAP_SIZE * 8 - 1);
GOTO(out_up, rc = -ERANGE);
- }
+ }
if (test_bit(mti->mti_stripe_index, imap)) {
if ((mti->mti_flags & LDD_F_VIRGIN) &&
struct llog_handle *llh,
uint64_t nid, char *uuid)
{
- return record_base(env, llh, NULL, nid, LCFG_ADD_UUID, uuid, 0, 0, 0);
+ return record_base(env, llh, NULL, nid, LCFG_ADD_UUID, uuid,
+ NULL, NULL, NULL);
}
static inline int record_add_conn(const struct lu_env *env,
struct llog_handle *llh,
char *devname, char *uuid)
{
- return record_base(env, llh, devname, 0, LCFG_ADD_CONN, uuid, 0, 0, 0);
+ return record_base(env, llh, devname, 0, LCFG_ADD_CONN, uuid,
+ NULL, NULL, NULL);
}
static inline int record_attach(const struct lu_env *env,
struct llog_handle *llh, char *devname,
char *type, char *uuid)
{
- return record_base(env, llh,devname, 0, LCFG_ATTACH, type, uuid, 0, 0);
+ return record_base(env, llh, devname, 0, LCFG_ATTACH, type, uuid,
+ NULL, NULL);
}
static inline int record_setup(const struct lu_env *env,
char *lov_name, char *ost_uuid,
char *index, char *gen)
{
- return record_base(env,llh,lov_name,0,LCFG_LOV_ADD_OBD,
- ost_uuid, index, gen, 0);
+ return record_base(env, llh, lov_name, 0, LCFG_LOV_ADD_OBD,
+ ost_uuid, index, gen, NULL);
}
static inline int record_mount_opt(const struct lu_env *env,
char *profile, char *lov_name,
char *mdc_name)
{
- return record_base(env,llh,NULL,0,LCFG_MOUNTOPT,
- profile,lov_name,mdc_name,0);
+ return record_base(env, llh, NULL, 0, LCFG_MOUNTOPT,
+ profile, lov_name, mdc_name, NULL);
}
static int record_marker(const struct lu_env *env,
}
/* write the lcfg in all logs for the given fs */
-int mgs_write_log_direct_all(const struct lu_env *env, struct mgs_device *mgs,
- struct fs_db *fsdb, struct mgs_target_info *mti,
- struct llog_cfg_rec *lcr, char *devname,
- char *comment, int server_only)
+static int mgs_write_log_direct_all(const struct lu_env *env,
+ struct mgs_device *mgs,
+ struct fs_db *fsdb,
+ struct mgs_target_info *mti,
+ struct llog_cfg_rec *lcr, char *devname,
+ char *comment, int server_only)
{
struct list_head log_list;
struct mgs_direntry *dirent, *n;
if (server_only && strstr(dirent->mde_name, "-client") != NULL)
goto next;
- if (strncmp(fsname, dirent->mde_name, len) != 0)
+ if (strlen(dirent->mde_name) <= len ||
+ strncmp(fsname, dirent->mde_name, len) != 0 ||
+ dirent->mde_name[len] != '-')
goto next;
CDEBUG(D_MGS, "Changing log %s\n", dirent->mde_name);
RETURN(rc);
if (lcfg->lcfg_command == LCFG_ADD_UUID) {
- uint64_t nodenid = lcfg->lcfg_nid;
+ __u64 nodenid = lcfg->lcfg_nid;
if (strlen(tmti->mti_uuid) == 0) {
/* target uuid not set, this config record is before
tmti->mti_nids[tmti->mti_nid_count] = nodenid;
tmti->mti_nid_count++;
} else {
+ char nidstr[LNET_NIDSTR_SIZE];
+
/* failover node nid */
+ libcfs_nid2str_r(nodenid, nidstr, sizeof(nidstr));
rc = add_param(tmti->mti_params, PARAM_FAILNODE,
- libcfs_nid2str(nodenid));
+ nidstr);
}
RETURN(rc);
*/
while (class_find_param(ptr, PARAM_FAILNODE, &ptr) == 0) {
while (class_parse_nid(ptr, &nid, &ptr) == 0) {
- if (failnodeuuid == NULL) {
- /* We don't know the failover node name,
- so just use the first nid as the uuid */
- rc = name_create(&failnodeuuid,
- libcfs_nid2str(nid), "");
- if (rc)
- return rc;
- }
- CDEBUG(D_MGS, "add nid %s for failover uuid %s, "
- "client %s\n", libcfs_nid2str(nid),
- failnodeuuid, cliname);
+ char nidstr[LNET_NIDSTR_SIZE];
+
+ if (failnodeuuid == NULL) {
+ /* We don't know the failover node name,
+ * so just use the first nid as the uuid */
+ libcfs_nid2str_r(nid, nidstr, sizeof(nidstr));
+ rc = name_create(&failnodeuuid, nidstr, "");
+ if (rc != 0)
+ return rc;
+ }
+ CDEBUG(D_MGS, "add nid %s for failover uuid %s, "
+ "client %s\n",
+ libcfs_nid2str_r(nid, nidstr, sizeof(nidstr)),
+ failnodeuuid, cliname);
rc = record_add_uuid(env, llh, nid, failnodeuuid);
/*
* If *ptr is ':', we have added all NIDs for
char *nodeuuid = NULL;
char *mdcuuid = NULL;
char *lmvuuid = NULL;
- char index[6];
- int i, rc;
- ENTRY;
+ char index[6];
+ char nidstr[LNET_NIDSTR_SIZE];
+ int i, rc;
+ ENTRY;
if (mgs_log_is_empty(env, mgs, logname)) {
CERROR("log is empty! Logical error\n");
CDEBUG(D_MGS, "adding mdc for %s to log %s:lmv(%s)\n",
mti->mti_svname, logname, lmvname);
- rc = name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
+ libcfs_nid2str_r(mti->mti_nids[0], nidstr, sizeof(nidstr));
+ rc = name_create(&nodeuuid, nidstr, "");
if (rc)
RETURN(rc);
rc = name_create(&mdcname, mti->mti_svname, "-mdc");
"add mdc");
if (rc)
GOTO(out_end, rc);
- for (i = 0; i < mti->mti_nid_count; i++) {
- CDEBUG(D_MGS, "add nid %s for mdt\n",
- libcfs_nid2str(mti->mti_nids[i]));
+ for (i = 0; i < mti->mti_nid_count; i++) {
+ CDEBUG(D_MGS, "add nid %s for mdt\n",
+ libcfs_nid2str_r(mti->mti_nids[i],
+ nidstr, sizeof(nidstr)));
rc = record_add_uuid(env, llh, mti->mti_nids[i], nodeuuid);
if (rc)
GOTO(out_end, rc);
- }
+ }
rc = record_attach(env, llh, mdcname, LUSTRE_MDC_NAME, lmvuuid);
if (rc)
GOTO(out_end, rc);
- rc = record_setup(env, llh, mdcname, mti->mti_uuid, nodeuuid, 0, 0);
+ rc = record_setup(env, llh, mdcname, mti->mti_uuid, nodeuuid,
+ NULL, NULL);
if (rc)
GOTO(out_end, rc);
rc = mgs_write_log_failnids(env, mti, llh, mdcname);
char *mdtname = NULL;
char *lovname = NULL;
char index_str[16];
+ char nidstr[LNET_NIDSTR_SIZE];
int i, rc;
ENTRY;
if (rc)
RETURN(rc);
- rc = name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
+ libcfs_nid2str_r(mti->mti_nids[0], nidstr, sizeof(nidstr));
+ rc = name_create(&nodeuuid, nidstr, "");
if (rc)
GOTO(out_destory, rc);
for (i = 0; i < mti->mti_nid_count; i++) {
CDEBUG(D_MGS, "add nid %s for mdt\n",
- libcfs_nid2str(mti->mti_nids[i]));
+ libcfs_nid2str_r(mti->mti_nids[i],
+ nidstr, sizeof(nidstr)));
rc = record_add_uuid(env, llh, mti->mti_nids[i], nodeuuid);
if (rc)
GOTO(out_end, rc);
- }
+ }
rc = record_attach(env, llh, ospname, LUSTRE_OSP_NAME, lovuuid);
if (rc)
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)
char *logname, char *suffix, char *lovname,
enum lustre_sec_part sec_part, int flags)
{
- struct llog_handle *llh = NULL;
+ struct llog_handle *llh = NULL;
char *nodeuuid = NULL;
char *oscname = NULL;
char *oscuuid = NULL;
char *lovuuid = NULL;
char *svname = NULL;
- char index[6];
- int i, rc;
+ char index[6];
+ char nidstr[LNET_NIDSTR_SIZE];
+ int i, rc;
+ ENTRY;
- ENTRY;
- CDEBUG(D_INFO, "adding osc for %s to log %s\n",
- mti->mti_svname, logname);
+ CDEBUG(D_INFO, "adding osc for %s to log %s\n",
+ mti->mti_svname, logname);
if (mgs_log_is_empty(env, mgs, logname)) {
- CERROR("log is empty! Logical error\n");
- RETURN (-EINVAL);
- }
+ CERROR("log is empty! Logical error\n");
+ RETURN(-EINVAL);
+ }
- rc = name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
+ libcfs_nid2str_r(mti->mti_nids[0], nidstr, sizeof(nidstr));
+ rc = name_create(&nodeuuid, nidstr, "");
if (rc)
RETURN(rc);
rc = name_create(&svname, mti->mti_svname, "-osc");
* (multiple interfaces), while nids after as failover node nids.
* See mgs_steal_client_llog_handler() LCFG_ADD_UUID.
*/
- for (i = 0; i < mti->mti_nid_count; i++) {
- CDEBUG(D_MGS, "add nid %s\n", libcfs_nid2str(mti->mti_nids[i]));
+ for (i = 0; i < mti->mti_nid_count; i++) {
+ CDEBUG(D_MGS, "add nid %s\n",
+ libcfs_nid2str_r(mti->mti_nids[i],
+ nidstr, sizeof(nidstr)));
rc = record_add_uuid(env, llh, mti->mti_nids[i], nodeuuid);
if (rc)
GOTO(out_end, rc);
- }
+ }
rc = record_attach(env, llh, oscname, LUSTRE_OSC_NAME, lovuuid);
if (rc)
GOTO(out_end, rc);
- rc = record_setup(env, llh, oscname, mti->mti_uuid, nodeuuid, 0, 0);
+ rc = record_setup(env, llh, oscname, mti->mti_uuid, nodeuuid,
+ NULL, NULL);
if (rc)
GOTO(out_end, rc);
rc = mgs_write_log_failnids(env, mti, llh, oscname);
GOTO(out_end, rc);
rc = record_setup(env, llh, mti->mti_svname,
"dev"/*ignored*/, "type"/*ignored*/,
- failout ? "n" : "f", 0/*options*/);
+ failout ? "n" : "f", NULL/*options*/);
if (rc)
GOTO(out_end, rc);
rc = record_marker(env, llh, fsdb, CM_END, mti->mti_svname, "add ost");
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,
if (rc)
goto out;
rc = record_base(env, llh, tgtname, 0, cmd,
- fsname, poolname, ostname, 0);
+ fsname, poolname, ostname, NULL);
if (rc)
goto out;
rc = record_marker(env, llh, fsdb, CM_END, tgtname, comment);
int mgs_nodemap_cmd(const struct lu_env *env, struct mgs_device *mgs,
enum lcfg_command_type cmd, const char *nodemap_name,
- const char *param)
+ char *param)
{
lnet_nid_t nid[2];
__u32 idmap[2];