-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
* Author: Nathan Rutman <nathan@clusterfs.com>
*/
-#ifndef EXPORT_SYMTAB
-#define EXPORT_SYMTAB
-#endif
#define DEBUG_SUBSYSTEM S_MGS
#define D_MGS D_CONFIG
GOTO(out_pop, rc = PTR_ERR(mnt));
}
- file = dentry_open(dentry, mnt, O_RDONLY);
+ file = ll_dentry_open(dentry, mnt, O_RDONLY, current_cred());
if (IS_ERR(file))
/* dentry_open_it() drops the dentry, mnt refs */
GOTO(out_pop, rc = PTR_ERR(file));
*/
/* It might be better to have a separate db file, instead of parsing the info
out of the client log. This is slow and potentially error-prone. */
-static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
- void *data)
+static int mgs_fsdb_handler(const struct lu_env *env, struct llog_handle *llh,
+ struct llog_rec_hdr *rec, void *data)
{
- struct mgs_fsdb_handler_data *d = (struct mgs_fsdb_handler_data *) data;
+ struct mgs_fsdb_handler_data *d = data;
struct fs_db *fsdb = d->fsdb;
int cfg_len = rec->lrh_len;
char *cfg_buf = (char*) (rec + 1);
/* attach 0:MDC_uml1_mdsA_MNT_client 1:mdc 2:1d834_MNT_client_03f */
if ((lcfg->lcfg_command == LCFG_ATTACH) &&
(strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_MDC_NAME) == 0)) {
- int type;
- rc = libcfs_str2server(lustre_cfg_string(lcfg, 0), &type,
+ rc = server_name2index(lustre_cfg_string(lcfg, 0),
&index, NULL);
- if (rc || type != SVTYPE_MDT) {
+ if (rc != LDD_F_SV_TYPE_MDT) {
CWARN("Unparsable MDC name %s, assuming index 0\n",
lustre_cfg_string(lcfg, 0));
index = 0;
RETURN(rc);
}
-/* fsdb->fsdb_sem is already held in mgs_find_or_make_fsdb*/
+/* fsdb->fsdb_mutex is already held in mgs_find_or_make_fsdb*/
static int mgs_get_fsdb_from_llog(struct obd_device *obd, struct fs_db *fsdb)
{
char *logname;
ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
LASSERT(ctxt != NULL);
name_create(&logname, fsdb->fsdb_name, "-client");
- cfs_down(&fsdb->fsdb_sem);
+ cfs_mutex_lock(&fsdb->fsdb_mutex);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- rc = llog_create(ctxt, &loghandle, NULL, logname);
- if (rc)
- GOTO(out_pop, rc);
+ rc = llog_create(NULL, ctxt, &loghandle, NULL, logname);
+ if (rc)
+ GOTO(out_pop, rc);
- rc = llog_init_handle(loghandle, LLOG_F_IS_PLAIN, NULL);
+ rc = llog_init_handle(NULL, loghandle, LLOG_F_IS_PLAIN, NULL);
if (rc)
GOTO(out_close, rc);
if (llog_get_size(loghandle) <= 1)
cfs_set_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags);
- rc = llog_process(loghandle, mgs_fsdb_handler, (void *) &d, NULL);
- CDEBUG(D_INFO, "get_db = %d\n", rc);
+ rc = llog_process(NULL, loghandle, mgs_fsdb_handler, (void *) &d,
+ NULL);
+ CDEBUG(D_INFO, "get_db = %d\n", rc);
out_close:
- rc2 = llog_close(loghandle);
+ rc2 = llog_close(NULL, loghandle);
if (!rc)
rc = rc2;
out_pop:
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- cfs_up(&fsdb->fsdb_sem);
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
name_destroy(&logname);
llog_ctxt_put(ctxt);
sptlrpc_rule_set_free(&fsdb->fsdb_srpc_gen);
}
-static struct fs_db *mgs_find_fsdb(struct obd_device *obd, char *fsname)
+struct fs_db *mgs_find_fsdb(struct obd_device *obd, char *fsname)
{
struct mgs_obd *mgs = &obd->u.mgs;
struct fs_db *fsdb;
RETURN(NULL);
strcpy(fsdb->fsdb_name, fsname);
- cfs_sema_init(&fsdb->fsdb_sem, 1);
+ cfs_mutex_init(&fsdb->fsdb_mutex);
cfs_set_bit(FSDB_UDESC, &fsdb->fsdb_flags);
if (strcmp(fsname, MGSSELF_NAME) == 0) {
if (rc)
GOTO(err, rc);
+ /* initialise data for NID table */
+ mgs_ir_init_fs(obd, fsdb);
+
lproc_mgs_add_live(obd, fsdb);
}
static void mgs_free_fsdb(struct obd_device *obd, struct fs_db *fsdb)
{
/* wait for anyone with the sem */
- cfs_down(&fsdb->fsdb_sem);
+ cfs_mutex_lock(&fsdb->fsdb_mutex);
lproc_mgs_del_live(obd, fsdb);
cfs_list_del(&fsdb->fsdb_list);
+
+ /* deinitialize fsr */
+ mgs_ir_fini_fs(obd, fsdb);
+
if (fsdb->fsdb_ost_index_map)
OBD_FREE(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
if (fsdb->fsdb_mdt_index_map)
name_destroy(&fsdb->fsdb_mdtlmv);
name_destroy(&fsdb->fsdb_mdc);
mgs_free_fsdb_srpc(fsdb);
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
OBD_FREE_PTR(fsdb);
}
struct mgs_obd *mgs = &obd->u.mgs;
struct fs_db *fsdb;
cfs_list_t *tmp, *tmp2;
- cfs_down(&mgs->mgs_sem);
+ cfs_mutex_lock(&mgs->mgs_mutex);
cfs_list_for_each_safe(tmp, tmp2, &mgs->mgs_fs_db_list) {
fsdb = cfs_list_entry(tmp, struct fs_db, fsdb_list);
mgs_free_fsdb(obd, fsdb);
}
- cfs_up(&mgs->mgs_sem);
+ cfs_mutex_unlock(&mgs->mgs_mutex);
return 0;
}
struct fs_db *fsdb;
int rc = 0;
- cfs_down(&mgs->mgs_sem);
+ cfs_mutex_lock(&mgs->mgs_mutex);
fsdb = mgs_find_fsdb(obd, name);
if (fsdb) {
- cfs_up(&mgs->mgs_sem);
+ cfs_mutex_unlock(&mgs->mgs_mutex);
*dbh = fsdb;
return 0;
}
CDEBUG(D_MGS, "Creating new db\n");
fsdb = mgs_new_fsdb(obd, name);
- cfs_up(&mgs->mgs_sem);
+ cfs_mutex_unlock(&mgs->mgs_mutex);
if (!fsdb)
return -ENOMEM;
if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags))
RETURN(-1);
- if (mti->mti_flags & SVTYPE_OST)
+ if (mti->mti_flags & LDD_F_SV_TYPE_OST)
imap = fsdb->fsdb_ost_index_map;
- else if (mti->mti_flags & SVTYPE_MDT)
+ else if (mti->mti_flags & LDD_F_SV_TYPE_MDT)
imap = fsdb->fsdb_mdt_index_map;
else
RETURN(-EINVAL);
RETURN(rc);
}
- if (mti->mti_flags & SVTYPE_OST) {
+ if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
imap = fsdb->fsdb_ost_index_map;
- } else if (mti->mti_flags & SVTYPE_MDT) {
+ } else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
imap = fsdb->fsdb_mdt_index_map;
if (fsdb->fsdb_mdt_count >= MAX_MDT_COUNT) {
LCONSOLE_ERROR_MSG(0x13f, "The max mdt count"
if (rc == -1)
RETURN(-ERANGE);
mti->mti_stripe_index = rc;
- if (mti->mti_flags & SVTYPE_MDT)
+ if (mti->mti_flags & LDD_F_SV_TYPE_MDT)
fsdb->fsdb_mdt_count ++;
}
cfs_set_bit(mti->mti_stripe_index, imap);
cfs_clear_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags);
- server_make_name(mti->mti_flags, mti->mti_stripe_index,
+ server_make_name(mti->mti_flags & ~LDD_F_VIRGIN, mti->mti_stripe_index,
mti->mti_fsname, mti->mti_svname);
CDEBUG(D_MGS, "Set index for %s to %d\n", mti->mti_svname,
int mml_modified;
};
-static int mgs_modify_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
- void *data)
+static int mgs_modify_handler(const struct lu_env *env,
+ struct llog_handle *llh,
+ struct llog_rec_hdr *rec, void *data)
{
- struct mgs_modify_lookup *mml = (struct mgs_modify_lookup *)data;
+ struct mgs_modify_lookup *mml = data;
struct cfg_marker *marker;
struct lustre_cfg *lcfg = (struct lustre_cfg *)(rec + 1);
int cfg_len = rec->lrh_len - sizeof(struct llog_rec_hdr) -
/* Header and tail are added back to lrh_len in
llog_lvfs_write_rec */
rec->lrh_len = cfg_len;
- rc = llog_write_rec(llh, rec, NULL, 0, (void *)lcfg,
- rec->lrh_index);
+ rc = llog_write_rec(NULL, llh, rec, NULL, 0, (void *)lcfg,
+ rec->lrh_index);
if (!rc)
mml->mml_modified++;
}
ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
LASSERT(ctxt != NULL);
- rc = llog_create(ctxt, &loghandle, NULL, logname);
+ rc = llog_create(NULL, ctxt, &loghandle, NULL, logname);
if (rc)
GOTO(out_pop, rc);
- rc = llog_init_handle(loghandle, LLOG_F_IS_PLAIN, NULL);
+ rc = llog_init_handle(NULL, loghandle, LLOG_F_IS_PLAIN, NULL);
if (rc)
GOTO(out_close, rc);
mml->mml_marker.cm_flags = flags;
mml->mml_marker.cm_canceltime = flags ? cfs_time_current_sec() : 0;
mml->mml_modified = 0;
- rc = llog_process(loghandle, mgs_modify_handler, (void *)mml, NULL);
+ rc = llog_process(NULL, loghandle, mgs_modify_handler, (void *)mml,
+ NULL);
if (!rc && !mml->mml_modified)
rc = -ENODEV;
OBD_FREE_PTR(mml);
out_close:
- rc2 = llog_close(loghandle);
+ rc2 = llog_close(NULL, loghandle);
if (!rc)
rc = rc2;
out_pop:
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
/* idx = -1 means append */
- rc = llog_write_rec(llh, &rec, NULL, 0, (void *)lcfg, -1);
+ rc = llog_write_rec(NULL, llh, &rec, NULL, 0, (void *)lcfg, -1);
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
if (rc)
CERROR("failed %d\n", rc);
GOTO(out, rc = -ENODEV);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- rc = llog_create(ctxt, llh, NULL, name);
- if (rc == 0)
- llog_init_handle(*llh, LLOG_F_IS_PLAIN, &cfg_uuid);
- else
- *llh = NULL;
+ rc = llog_create(NULL, ctxt, llh, NULL, name);
+ if (rc == 0)
+ llog_init_handle(NULL, *llh, LLOG_F_IS_PLAIN, &cfg_uuid);
+ else
+ *llh = NULL;
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
llog_ctxt_put(ctxt);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- rc = llog_close(*llh);
+ rc = llog_close(NULL, *llh);
*llh = NULL;
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
LASSERT(ctxt != NULL);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- rc = llog_create(ctxt, &llh, NULL, name);
+ rc = llog_create(NULL, ctxt, &llh, NULL, name);
if (rc == 0) {
- llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL);
- rc = llog_get_size(llh);
- llog_close(llh);
+ llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL);
+ rc = llog_get_size(llh);
+ llog_close(NULL, llh);
}
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
llog_ctxt_put(ctxt);
static int mgs_write_log_mdc_to_mdt(struct obd_device *, struct fs_db *,
struct mgs_target_info *, char *);
+static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb,
+ struct mgs_target_info *mti,
+ char *logname, char *suffix, char *lovname,
+ enum lustre_sec_part sec_part, int flags);
+static void name_create_mdt_and_lov(char **logname, char **lovname,
+ struct fs_db *fsdb, int i);
-static int mgs_steal_llog_handler(struct llog_handle *llh,
- struct llog_rec_hdr *rec,
- void *data)
+static int mgs_steal_llog_handler(const struct lu_env *env,
+ struct llog_handle *llh,
+ struct llog_rec_hdr *rec, void *data)
{
struct obd_device * obd;
struct mgs_target_info *mti, *tmti;
if (!strncmp(marker->cm_comment,"add osc",7) &&
(marker->cm_flags & CM_START)){
got_an_osc_or_mdc = 1;
+ strncpy(tmti->mti_svname, marker->cm_tgtname,
+ sizeof(tmti->mti_svname));
rc = record_start_log(obd, &mdt_llh, mti->mti_svname);
rc = record_marker(obd, mdt_llh, fsdb, CM_START,
mti->mti_svname,"add osc(copied)");
memset(tmti, 0, sizeof(*tmti));
RETURN(rc);
}
+
+ if (lcfg->lcfg_command == LCFG_LOV_ADD_OBD) {
+ int index;
+ char mdt_index[9];
+ char *logname, *lovname;
+
+ name_create_mdt_and_lov(&logname, &lovname, fsdb,
+ mti->mti_stripe_index);
+ sprintf(mdt_index, "-MDT%04x", mti->mti_stripe_index);
+
+ if (sscanf(lustre_cfg_buf(lcfg, 2), "%d", &index) != 1) {
+ name_destroy(&logname);
+ name_destroy(&lovname);
+ RETURN(-EINVAL);
+ }
+
+ tmti->mti_stripe_index = index;
+ mgs_write_log_osc_to_lov(obd, fsdb, tmti, logname,
+ mdt_index, lovname,
+ LUSTRE_SP_MDT, 0);
+ name_destroy(&logname);
+ name_destroy(&lovname);
+ RETURN(rc);
+ }
RETURN(rc);
}
-/* fsdb->fsdb_sem is already held in mgs_write_log_target*/
+/* fsdb->fsdb_mutex is already held in mgs_write_log_target*/
/* stealed from mgs_get_fsdb_from_llog*/
static int mgs_steal_llog_for_mdt_from_client(struct obd_device *obd,
char *client_name,
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- rc = llog_create(ctxt, &loghandle, NULL, client_name);
+ rc = llog_create(NULL, ctxt, &loghandle, NULL, client_name);
if (rc)
GOTO(out_pop, rc);
- rc = llog_init_handle(loghandle, LLOG_F_IS_PLAIN, NULL);
+ rc = llog_init_handle(NULL, loghandle, LLOG_F_IS_PLAIN, NULL);
if (rc)
GOTO(out_close, rc);
- rc = llog_process(loghandle, mgs_steal_llog_handler, (void *)comp, NULL);
+ rc = llog_process(NULL, loghandle, mgs_steal_llog_handler,
+ (void *)comp, NULL);
CDEBUG(D_MGS, "steal llog re = %d\n", rc);
out_close:
- rc2 = llog_close(loghandle);
+ rc2 = llog_close(NULL, loghandle);
if (!rc)
rc = rc2;
out_pop:
lovdesc->ld_default_stripe_count = 1;
lovdesc->ld_pattern = LOV_PATTERN_RAID0;
lovdesc->ld_default_stripe_size = 1024 * 1024;
- lovdesc->ld_default_stripe_offset = 0;
+ lovdesc->ld_default_stripe_offset = -1;
lovdesc->ld_qos_maxage = QOS_DEFAULT_MAXAGE;
sprintf((char*)lovdesc->ld_uuid.uuid, "%s_UUID", lovname);
/* can these be the same? */
int i, rc;
ENTRY;
- if (mgs_log_is_empty(obd, mti->mti_svname)) {
+ if (mgs_log_is_empty(obd, logname)) {
CERROR("log is empty! Logical error\n");
RETURN (-EINVAL);
}
RETURN(rc);
}
-static inline void name_create_sv(char **buf, char *fsname, char *type, int i)
+static inline void name_create_mdt(char **logname, char *fsname, int i)
{
- char sv_index[9];
+ char mdt_index[9];
- sprintf(sv_index, "-%s%04x", type, i);
- name_create(buf, fsname, sv_index);
-}
-
-static inline void name_create_mdt(char **buf, char *fsname, int i)
-{
- name_create_sv(buf, fsname, "MDT", i);
+ sprintf(mdt_index, "-MDT%04x", i);
+ name_create(logname, fsname, mdt_index);
}
static void name_create_mdt_and_lov(char **logname, char **lovname,
mti->mti_svname, logname);
if (mgs_log_is_empty(obd, logname)) {
- /* The first item in the log must be the lov, so we have
- somewhere to add our osc. */
- rc = mgs_write_log_lov(obd, fsdb, mti, logname, lovname);
+ CERROR("log is empty! Logical error\n");
+ RETURN (-EINVAL);
}
name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
/* Append ost info to the client log */
name_create(&logname, mti->mti_fsname, "-client");
+ if (mgs_log_is_empty(obd, logname)) {
+ /* Start client log */
+ rc = mgs_write_log_lov(obd, fsdb, mti, logname,
+ fsdb->fsdb_clilov);
+ rc = mgs_write_log_lmv(obd, fsdb, mti, logname,
+ fsdb->fsdb_clilmv);
+ }
mgs_write_log_osc_to_lov(obd, fsdb, mti, logname, "",
- fsdb->fsdb_clilov, LUSTRE_SP_CLI, 0);
+ fsdb->fsdb_clilov, LUSTRE_SP_CLI, flags);
name_destroy(&logname);
RETURN(rc);
}
}
/* Create mdc/osc client name (e.g. lustre-OST0001-osc) */
- if (mti->mti_flags & SVTYPE_MDT) {
+ if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
name_create(&cliname, mti->mti_svname, "-mdc");
- } else if (mti->mti_flags & SVTYPE_OST) {
+ } else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
name_create(&cliname, mti->mti_svname, "-osc");
} else {
RETURN(-EINVAL);
name_destroy(&logname);
name_destroy(&cliname);
- if (mti->mti_flags & SVTYPE_OST) {
+ if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
/* Add OST failover nids to the MDT logs as well */
int i;
RETURN(rc);
}
-/** write_log_param helper to add or modify a parameter change lcfg record
- * in a config log.
- * @logname log to add lcfg to (e.g. client, mdt, ost)
- * @bufs empty bufs for temp usage
- * @tgtname target obd device this param is meant to affect
- * @ptr ptr to param=val
- */
static int mgs_wlp_lcfg(struct obd_device *obd, struct fs_db *fsdb,
struct mgs_target_info *mti,
char *logname, struct lustre_cfg_bufs *bufs,
/* write global variable settings into log */
static int mgs_write_log_sys(struct obd_device *obd, struct fs_db *fsdb,
- struct mgs_target_info *mti, char *sys, char *ptr)
-{
- struct lustre_cfg_bufs bufs;
- struct lustre_cfg *lcfg;
- char *tmp;
- char sep;
- int cmd, val;
- int rc;
-
- if (class_match_param(ptr, PARAM_TIMEOUT, &tmp) == 0)
- cmd = LCFG_SET_TIMEOUT;
- else if (class_match_param(ptr, PARAM_LDLM_TIMEOUT, &tmp) == 0)
- cmd = LCFG_SET_LDLM_TIMEOUT;
- /* Check for known params here so we can return error to lctl */
- else if ((class_match_param(ptr, PARAM_AT_MIN, &tmp) == 0)
- || (class_match_param(ptr, PARAM_AT_MAX, &tmp) == 0)
- || (class_match_param(ptr, PARAM_AT_EXTRA, &tmp) == 0)
- || (class_match_param(ptr, PARAM_AT_EARLY_MARGIN, &tmp) == 0)
- || (class_match_param(ptr, PARAM_AT_HISTORY, &tmp) == 0))
- cmd = LCFG_PARAM;
- else
- return -EINVAL;
-
- /* separate the value */
- val = simple_strtoul(tmp, NULL, 0);
- if (*tmp == '\0')
- CDEBUG(D_MGS, "global '%s' removed\n", sys);
- else
- CDEBUG(D_MGS, "global '%s' val=%d\n", sys, val);
-
- lustre_cfg_bufs_reset(&bufs, NULL);
- lustre_cfg_bufs_set_string(&bufs, 1, sys);
- lcfg = lustre_cfg_new(cmd, &bufs);
- lcfg->lcfg_num = val;
- /* truncate the comment to the parameter name */
- ptr = tmp - 1;
- sep = *ptr;
- *ptr = '\0';
- /* modify all servers and clients */
- rc = mgs_write_log_direct_all(obd, fsdb, mti,
- *tmp == '\0' ? NULL : lcfg,
- mti->mti_fsname, sys);
- *ptr = sep;
- lustre_cfg_free(lcfg);
- return rc;
+ struct mgs_target_info *mti, char *sys, char *ptr)
+{
+ struct lustre_cfg_bufs bufs;
+ struct lustre_cfg *lcfg;
+ char *tmp, sep;
+ int rc, cmd, convert = 1;
+
+ if (class_match_param(ptr, PARAM_TIMEOUT, &tmp) == 0) {
+ cmd = LCFG_SET_TIMEOUT;
+ } else if (class_match_param(ptr, PARAM_LDLM_TIMEOUT, &tmp) == 0) {
+ cmd = LCFG_SET_LDLM_TIMEOUT;
+ /* Check for known params here so we can return error to lctl */
+ } else if ((class_match_param(ptr, PARAM_AT_MIN, &tmp) == 0) ||
+ (class_match_param(ptr, PARAM_AT_MAX, &tmp) == 0) ||
+ (class_match_param(ptr, PARAM_AT_EXTRA, &tmp) == 0) ||
+ (class_match_param(ptr, PARAM_AT_EARLY_MARGIN, &tmp) == 0) ||
+ (class_match_param(ptr, PARAM_AT_HISTORY, &tmp) == 0)) {
+ cmd = LCFG_PARAM;
+ } else if (class_match_param(ptr, PARAM_JOBID_VAR, &tmp) == 0) {
+ convert = 0; /* Don't convert string value to integer */
+ cmd = LCFG_PARAM;
+ } else {
+ return -EINVAL;
+ }
+
+ if (mgs_param_empty(ptr))
+ CDEBUG(D_MGS, "global '%s' removed\n", sys);
+ else
+ CDEBUG(D_MGS, "global '%s' val=%s\n", sys, tmp);
+
+ lustre_cfg_bufs_reset(&bufs, NULL);
+ lustre_cfg_bufs_set_string(&bufs, 1, sys);
+ if (!convert && *tmp != '\0')
+ lustre_cfg_bufs_set_string(&bufs, 2, tmp);
+ lcfg = lustre_cfg_new(cmd, &bufs);
+ lcfg->lcfg_num = convert ? simple_strtoul(tmp, NULL, 0) : 0;
+ /* truncate the comment to the parameter name */
+ ptr = tmp - 1;
+ sep = *ptr;
+ *ptr = '\0';
+ /* modify all servers and clients */
+ rc = mgs_write_log_direct_all(obd, fsdb, mti,
+ *tmp == '\0' ? NULL : lcfg,
+ mti->mti_fsname, sys);
+ if (rc == 0 && *tmp != '\0') {
+ switch (cmd) {
+ case LCFG_SET_TIMEOUT:
+ if (!obd_timeout_set || lcfg->lcfg_num > obd_timeout)
+ class_process_config(lcfg);
+ break;
+ case LCFG_SET_LDLM_TIMEOUT:
+ if (!ldlm_timeout_set || lcfg->lcfg_num > ldlm_timeout)
+ class_process_config(lcfg);
+ break;
+ default:
+ break;
+ }
+ }
+ *ptr = sep;
+ lustre_cfg_free(lcfg);
+ return rc;
}
static int mgs_srpc_set_param_disk(struct obd_device *obd,
/* obsolete old one */
mgs_modify(obd, fsdb, mti, logname, mti->mti_svname, comment, CM_SKIP);
- if (!mgs_param_empty(param)) {
- /* write the new one */
- rc = mgs_write_log_direct(obd, fsdb, logname, lcfg,
- mti->mti_svname, comment);
- if (rc)
- CERROR("err %d writing log %s\n", rc, logname);
- }
+ /* write the new one */
+ rc = mgs_write_log_direct(obd, fsdb, logname, lcfg,
+ mti->mti_svname, comment);
+ if (rc)
+ CERROR("err %d writing log %s\n", rc, logname);
+
out:
name_destroy(&logname);
out_lcfg:
char *param)
{
char *copy;
- int rc, copy_size, del;
+ int rc, copy_size;
ENTRY;
#ifndef HAVE_GSS
return -ENOMEM;
memcpy(copy, param, copy_size);
- del = mgs_param_empty(param);
- if (!del) {
- rc = mgs_srpc_set_param_mem(fsdb, mti->mti_svname, param);
- if (rc)
- goto out_free;
- }
+ rc = mgs_srpc_set_param_mem(fsdb, mti->mti_svname, param);
+ if (rc)
+ goto out_free;
/* previous steps guaranteed the syntax is correct */
rc = mgs_srpc_set_param_disk(obd, fsdb, mti, copy);
int msrd_skip;
};
-static int mgs_srpc_read_handler(struct llog_handle *llh,
- struct llog_rec_hdr *rec,
- void *data)
+static int mgs_srpc_read_handler(const struct lu_env *env,
+ struct llog_handle *llh,
+ struct llog_rec_hdr *rec, void *data)
{
- struct mgs_srpc_read_data *msrd = (struct mgs_srpc_read_data *) data;
+ struct mgs_srpc_read_data *msrd = data;
struct cfg_marker *marker;
struct lustre_cfg *lcfg = (struct lustre_cfg *)(rec + 1);
char *svname, *param;
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- rc = llog_create(ctxt, &llh, NULL, logname);
+ rc = llog_create(NULL, ctxt, &llh, NULL, logname);
if (rc)
GOTO(out_pop, rc);
- rc = llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL);
+ rc = llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL);
if (rc)
GOTO(out_close, rc);
msrd.msrd_fsdb = fsdb;
msrd.msrd_skip = 0;
- rc = llog_process(llh, mgs_srpc_read_handler, (void *) &msrd, NULL);
+ rc = llog_process(NULL, llh, mgs_srpc_read_handler, (void *) &msrd,
+ NULL);
out_close:
- llog_close(llh);
+ llog_close(NULL, llh);
out_pop:
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
out:
RETURN(rc);
}
-/** write_log_params helper for server logs (MDT or OST)
- * Figures out which server logs to modify, adds lcfg to each one.
- * Understands "match all" wildcard (lustre-OST*)
- * @param svtype MDT or OST
- * @param bufs empty lcfg bufs to use
- * @param ptr pointer to param=val string
- */
-static int mgs_wlp_server(struct obd_device *obd, struct fs_db *fsdb,
- struct mgs_target_info *mti, int svtype,
- struct lustre_cfg_bufs *bufs,
- char *ptr)
-{
- int rc = 0, type, i;
- __u32 idx;
-
- if (strncmp(mti->mti_svname, mti->mti_fsname, MTI_NAME_MAXLEN) == 0)
- /* device is unspecified completely? */
- type = svtype | SVTYPE_ALL;
- else
- rc = libcfs_str2server(mti->mti_svname, &type, &idx, NULL);
- if (rc < 0)
- return rc;
-
- if (type & SVTYPE_ALL) {
- char *logname;
-
- for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
- if (!cfs_test_bit(i, type & SVTYPE_MDT ?
- fsdb->fsdb_mdt_index_map :
- fsdb->fsdb_ost_index_map))
- continue;
- name_create_sv(&logname, mti->mti_fsname,
- type & SVTYPE_MDT ? "MDT" : "OST", i);
- rc = mgs_wlp_lcfg(obd, fsdb, mti,
- logname, bufs,
- logname, ptr);
- name_destroy(&logname);
- }
- } else {
- if (mgs_log_is_empty(obd, mti->mti_svname))
- return -ENODEV;
- rc = mgs_wlp_lcfg(obd, fsdb, mti,
- mti->mti_svname, bufs,
- mti->mti_svname, ptr);
- }
- return rc;
-}
-
/* Permanent settings of all parameters by writing into the appropriate
* configuration logs.
* A parameter with null value ("<param>='\0'") means to erase it out of
* the logs.
- * @param ptr pointer to param=value string
*/
static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
struct mgs_target_info *mti, char *ptr)
struct lustre_cfg_bufs bufs;
char *logname;
char *tmp;
- int rc = 0;
+ int rc = 0, rc2 = 0;
ENTRY;
/* For various parameter settings, we have to figure out which logs
if (class_match_param(ptr, PARAM_MGSNODE, NULL) == 0)
GOTO(end, rc);
+ /* Processed in ost/mdt */
+ if (class_match_param(ptr, PARAM_NETWORK, NULL) == 0)
+ GOTO(end, rc);
+
/* Processed in mgs_write_log_ost */
if (class_match_param(ptr, PARAM_FAILMODE, NULL) == 0) {
if (mti->mti_flags & LDD_F_PARAM) {
GOTO(end, rc);
}
- if (class_find_param(ptr, PARAM_FAILNODE, NULL) == 0) {
+ if (class_match_param(ptr, PARAM_FAILNODE, NULL) == 0) {
/* Add a failover nidlist */
rc = 0;
/* We already processed failovers params for new
int flag = (*tmp == '0') ? CM_EXCLUDE : 0;
int i;
- if (!(mti->mti_flags & SVTYPE_OST)) {
+ if (!(mti->mti_flags & LDD_F_SV_TYPE_OST)) {
LCONSOLE_ERROR_MSG(0x144, "%s: Only OSCs can "
"be (de)activated.\n",
mti->mti_svname);
}
active_err:
if (rc) {
- LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in "
+ LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in"
"log (%d). No permanent "
"changes were made to the "
"config log.\n",
char *mdtlovname;
CDEBUG(D_MGS, "lov param %s\n", ptr);
- if (!(mti->mti_flags & SVTYPE_MDT)) {
+ if (!(mti->mti_flags & LDD_F_SV_TYPE_MDT)) {
LCONSOLE_ERROR_MSG(0x147, "LOV params must be "
"set on the MDT, not %s. "
"Ignoring.\n",
name_create(&cname, mti->mti_fsname, "-client");
/* Add the client type to match the obdname in
class_config_llog_handler */
- } else if (mti->mti_flags & SVTYPE_MDT) {
+ } else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
/* COMPAT_146 */
if (fsdb->fsdb_mdc)
name_create(&cname, fsdb->fsdb_mdc, "");
else
name_create(&cname, mti->mti_svname,
"-mdc");
- } else if (mti->mti_flags & SVTYPE_OST) {
+ } else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
/* COMPAT_146 */
if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) {
LCONSOLE_ERROR_MSG(0x148, "Upgraded "
cname, ptr);
/* osc params affect the MDT as well */
- if (!rc && (mti->mti_flags & SVTYPE_OST)) {
+ if (!rc && (mti->mti_flags & LDD_F_SV_TYPE_OST)) {
int i;
for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
GOTO(end, rc);
}
- /* All mdt., mdd. params in proc */
- if ((class_match_param(ptr, PARAM_MDT, NULL) == 0) ||
- (class_match_param(ptr, PARAM_MDD, NULL) == 0)) {
+ /* All mdt. params in proc */
+ if (class_match_param(ptr, PARAM_MDT, NULL) == 0) {
+ int i;
+ __u32 idx;
+
CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
- rc = mgs_wlp_server(obd, fsdb, mti, SVTYPE_MDT,
- &bufs, ptr);
+ if (strncmp(mti->mti_svname, mti->mti_fsname,
+ MTI_NAME_MAXLEN) == 0)
+ /* device is unspecified completely? */
+ rc = LDD_F_SV_TYPE_MDT | LDD_F_SV_ALL;
+ else
+ rc = server_name2index(mti->mti_svname, &idx, NULL);
+ if (rc < 0)
+ goto active_err;
+ if ((rc & LDD_F_SV_TYPE_MDT) == 0)
+ goto active_err;
+ if (rc & LDD_F_SV_ALL) {
+ for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+ if (!cfs_test_bit(i,
+ fsdb->fsdb_mdt_index_map))
+ continue;
+ name_create_mdt(&logname, mti->mti_fsname, i);
+ rc = mgs_wlp_lcfg(obd, fsdb, mti,
+ logname, &bufs,
+ logname, ptr);
+ name_destroy(&logname);
+ if (rc)
+ goto active_err;
+ }
+ } else {
+ rc = mgs_wlp_lcfg(obd, fsdb, mti,
+ mti->mti_svname, &bufs,
+ mti->mti_svname, ptr);
+ if (rc)
+ goto active_err;
+ }
GOTO(end, rc);
}
- /* All ost. params in proc */
- if (class_match_param(ptr, PARAM_OST, NULL) == 0) {
+ /* All mdd., ost. params in proc */
+ if ((class_match_param(ptr, PARAM_MDD, NULL) == 0) ||
+ (class_match_param(ptr, PARAM_OST, NULL) == 0)) {
CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
- rc = mgs_wlp_server(obd, fsdb, mti, SVTYPE_OST,
- &bufs, ptr);
+ if (mgs_log_is_empty(obd, mti->mti_svname))
+ GOTO(end, rc = -ENODEV);
+
+ rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname,
+ &bufs, mti->mti_svname, ptr);
GOTO(end, rc);
}
LCONSOLE_WARN("Ignoring unrecognized param '%s'\n", ptr);
+ rc2 = -ENOSYS;
end:
if (rc)
CERROR("err %d on param '%s'\n", rc, ptr);
- RETURN(rc);
+ RETURN(rc ?: rc2);
}
/* Not implementing automatic failover nid addition at this time. */
the failover list. Modify mti->params for rewriting back at
server_register_target(). */
- cfs_down(&fsdb->fsdb_sem);
+ cfs_mutex_lock(&fsdb->fsdb_mutex);
rc = mgs_write_log_add_failnid(obd, fsdb, mti);
- cfs_up(&fsdb->fsdb_sem);
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
RETURN(rc);
#endif
}
}
- cfs_down(&fsdb->fsdb_sem);
+ cfs_mutex_lock(&fsdb->fsdb_mutex);
if (mti->mti_flags &
(LDD_F_VIRGIN | LDD_F_UPGRADE14 | LDD_F_WRITECONF)) {
/* Generate a log from scratch */
- if (mti->mti_flags & SVTYPE_MDT) {
+ if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
rc = mgs_write_log_mdt(obd, fsdb, mti);
- } else if (mti->mti_flags & SVTYPE_OST) {
+ } 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 "
OBD_FREE(buf, strlen(mti->mti_params) + 1);
out_up:
- cfs_up(&fsdb->fsdb_sem);
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
RETURN(rc);
}
CDEBUG(D_MGS, "found old, unupdated client log\n");
}
- if (mti->mti_flags & SVTYPE_MDT) {
+ if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
if (mgs_log_is_empty(obd, mti->mti_svname)) {
LCONSOLE_ERROR_MSG(0x14b, "The old MDT log %s is "
"missing. Was tunefs.lustre "
LASSERT(ctxt != NULL);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- rc = llog_create(ctxt, &llh, NULL, name);
- if (rc == 0) {
- llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL);
- rc = llog_destroy(llh);
+ rc = llog_create(NULL, ctxt, &llh, NULL, name);
+ if (rc == 0) {
+ llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL);
+ rc = llog_destroy(NULL, llh);
llog_free_handle(llh);
}
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
int mgs_erase_logs(struct obd_device *obd, char *fsname)
{
struct mgs_obd *mgs = &obd->u.mgs;
- static struct fs_db *fsdb;
+ struct fs_db *fsdb;
cfs_list_t dentry_list;
struct l_linux_dirent *dirent, *n;
int rc, len = strlen(fsname);
RETURN(rc);
}
- cfs_down(&mgs->mgs_sem);
+ cfs_mutex_lock(&mgs->mgs_mutex);
/* Delete the fs db */
fsdb = mgs_find_fsdb(obd, fsname);
OBD_FREE(dirent, sizeof(*dirent));
}
- cfs_up(&mgs->mgs_sem);
+ cfs_mutex_unlock(&mgs->mgs_mutex);
RETURN(rc);
}
struct fs_db *fsdb;
struct mgs_target_info *mti;
char *devname, *param;
- char *ptr;
- __u32 index = 0;
- int rc = 0, type = 0;
+ char *ptr, *tmp;
+ __u32 index;
+ int rc = 0;
ENTRY;
print_lustre_cfg(lcfg);
+ /* lustre, lustre-mdtlov, lustre-client, lustre-MDT0000 */
+ devname = lustre_cfg_string(lcfg, 0);
param = lustre_cfg_string(lcfg, 1);
- /* format is lustre-OST0000.osc.max_dirty_mb=32 */
- ptr = strchr(param, '.');
- if (!ptr) {
+ if (!devname) {
+ /* Assume device name embedded in param:
+ lustre-OST0000.osc.max_dirty_mb=32 */
+ ptr = strchr(param, '.');
+ if (ptr) {
+ devname = param;
+ *ptr = 0;
+ param = ptr + 1;
+ }
+ }
+ if (!devname) {
LCONSOLE_ERROR_MSG(0x14d, "No target specified: %s\n", param);
- RETURN(-ENOENT);
+ RETURN(-ENOSYS);
}
- devname = param;
- *ptr = '\0';
- param = ptr + 1;
- CDEBUG(D_MGS, "device='%s' param='%s'\n", devname, param);
/* Extract fsname */
+ ptr = strrchr(devname, '-');
memset(fsname, 0, MTI_NAME_MAXLEN);
- /* Check to see if we're a particular device */
- if (libcfs_str2server(devname, &type, &index, &ptr) == 0) {
+ if (ptr && (server_name2index(ptr, &index, NULL) >= 0)) {
/* param related to llite isn't allowed to set by OST or MDT */
if (strncmp(param, PARAM_LLITE, sizeof(PARAM_LLITE)) == 0)
RETURN(-EINVAL);
- while (*(--ptr) != '-') ; /* I know it has a - */
+
strncpy(fsname, devname, ptr - devname);
} else {
/* assume devname is the fsname */
strncpy(fsname, devname, MTI_NAME_MAXLEN);
}
- fsname[MTI_NAME_MAXLEN - 1] = '\0';
+ fsname[MTI_NAME_MAXLEN - 1] = 0;
CDEBUG(D_MGS, "setparam fs='%s' device='%s'\n", fsname, devname);
rc = mgs_find_or_make_fsdb(obd, fsname, &fsdb);
RETURN(rc);
if (!cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags) &&
cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) {
- LCONSOLE_ERROR("setparam: Unknown filesystem '%s'.\n", fsname);
+ CERROR("No filesystem targets for %s. cfg_device from lctl "
+ "is '%s'\n", fsname, devname);
mgs_free_fsdb(obd, fsdb);
- RETURN(-ENOENT);
+ RETURN(-EINVAL);
}
/* Create a fake mti to hold everything */
strncpy(mti->mti_fsname, fsname, MTI_NAME_MAXLEN);
strncpy(mti->mti_svname, devname, MTI_NAME_MAXLEN);
strncpy(mti->mti_params, param, sizeof(mti->mti_params));
- mti->mti_stripe_index = index;
- mti->mti_flags = type | LDD_F_PARAM;
+ rc = server_name2index(mti->mti_svname, &mti->mti_stripe_index, &tmp);
+ if (rc < 0)
+ /* Not a valid server; may be only fsname */
+ rc = 0;
+ else
+ /* Strip -osc or -mdc suffix from svname */
+ if (server_make_name(rc, mti->mti_stripe_index, mti->mti_fsname,
+ mti->mti_svname))
+ GOTO(out, rc = -EINVAL);
+
+ mti->mti_flags = rc | LDD_F_PARAM;
- cfs_down(&fsdb->fsdb_sem);
+ cfs_mutex_lock(&fsdb->fsdb_mutex);
rc = mgs_write_log_param(obd, fsdb, mti, mti->mti_params);
- cfs_up(&fsdb->fsdb_sem);
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
/*
* Revoke lock so everyone updates. Should be alright if
* so we don't really need to hold the lock while we're
* writing (above).
*/
- mgs_revoke_lock(obd, fsdb);
+ mgs_revoke_lock(obd, fsdb, CONFIG_T_CONFIG);
out:
OBD_FREE_PTR(mti);
RETURN(rc);
}
}
- cfs_down(&fsdb->fsdb_sem);
+ cfs_mutex_lock(&fsdb->fsdb_mutex);
if (canceled_label != NULL) {
OBD_ALLOC_PTR(mti);
cmd, fsname, poolname, ostname, label);
name_destroy(&logname);
- cfs_up(&fsdb->fsdb_sem);
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
/* request for update */
- mgs_revoke_lock(obd, fsdb);
+ mgs_revoke_lock(obd, fsdb, CONFIG_T_CONFIG);
EXIT;
out: