#include <uapi/linux/lustre/lustre_param.h>
#include <lustre_sec.h>
#include <lustre_quota.h>
+#include <lustre_sec.h>
#include "mgs_internal.h"
struct mgs_direntry *de;
char *key;
int rc, key_sz;
+ size_t suffix_len = sizeof(".bak") - 1;
INIT_LIST_HEAD(log_list);
}
/* filter out ".bak" files */
- /* sizeof(".bak") - 1 == 3 */
- if (key_sz >= 3 &&
- !memcmp(".bak", key + key_sz - 3, 3)) {
+ if (key_sz >= suffix_len &&
+ !memcmp(".bak", key + key_sz - suffix_len, suffix_len)) {
CDEBUG(D_MGS, "Skipping backup file %.*s\n",
key_sz, key);
goto next;
int cfg_len = rec->lrh_len;
char *cfg_buf = (char*) (rec + 1);
struct lustre_cfg *lcfg;
- __u32 index;
+ u32 index;
int rc = 0;
ENTRY;
CDEBUG(D_INFO, "cmd %x %s %s\n", lcfg->lcfg_command,
lustre_cfg_string(lcfg, 0), lustre_cfg_string(lcfg, 1));
- /* Figure out ost indicies */
- /* lov_modify_tgts add 0:lov1 1:ost1_UUID 2(index):0 3(gen):1 */
- if (lcfg->lcfg_command == LCFG_LOV_ADD_OBD ||
- lcfg->lcfg_command == LCFG_LOV_DEL_OBD) {
- index = simple_strtoul(lustre_cfg_string(lcfg, 2),
- NULL, 10);
+ /* Figure out ost indicies */
+ /* lov_modify_tgts add 0:lov1 1:ost1_UUID 2(index):0 3(gen):1 */
+ if (lcfg->lcfg_command == LCFG_LOV_ADD_OBD ||
+ lcfg->lcfg_command == LCFG_LOV_DEL_OBD) {
+ rc = kstrtouint(lustre_cfg_string(lcfg, 2), 10, &index);
+ if (rc)
+ RETURN(rc);
+
CDEBUG(D_MGS, "OST index for %s is %u (%s)\n",
lustre_cfg_string(lcfg, 1), index,
lustre_cfg_string(lcfg, 2));
return 0;
}
-int mgs_find_or_make_fsdb(const struct lu_env *env, struct mgs_device *mgs,
- char *name, struct fs_db **dbh)
+/* The caller must hold mgs->mgs_mutex. */
+int mgs_find_or_make_fsdb_nolock(const struct lu_env *env,
+ struct mgs_device *mgs,
+ char *name, struct fs_db **dbh)
{
struct fs_db *fsdb;
int rc = 0;
ENTRY;
- mutex_lock(&mgs->mgs_mutex);
fsdb = mgs_find_fsdb(mgs, name);
if (!fsdb) {
fsdb = mgs_new_fsdb(env, mgs, name);
CDEBUG(D_MGS, "Created new db: rc = %d\n", rc);
}
- mutex_unlock(&mgs->mgs_mutex);
if (!rc)
*dbh = fsdb;
RETURN(rc);
}
+int mgs_find_or_make_fsdb(const struct lu_env *env, struct mgs_device *mgs,
+ char *name, struct fs_db **dbh)
+{
+ int rc;
+ ENTRY;
+
+ mutex_lock(&mgs->mgs_mutex);
+ rc = mgs_find_or_make_fsdb_nolock(env, mgs, name, dbh);
+ mutex_unlock(&mgs->mgs_mutex);
+
+ RETURN(rc);
+}
+
/* 1 = index in use
0 = index unused
-1= empty client log */
RETURN(rc);
}
+enum replace_state {
+ REPLACE_COPY = 0,
+ REPLACE_SKIP,
+ REPLACE_DONE,
+ REPLACE_UUID,
+ REPLACE_SETUP
+};
+
/** This structure is passed to mgs_replace_handler */
-struct mgs_replace_uuid_lookup {
+struct mgs_replace_data {
/* Nids are replaced for this target device */
struct mgs_target_info target;
/* Temporary modified llog */
struct llog_handle *temp_llh;
- /* Flag is set if in target block*/
- int in_target_device;
- /* Nids already added. Just skip (multiple nids) */
- int device_nids_added;
- /* Flag is set if this block should not be copied */
- int skip_it;
+ enum replace_state state;
+ char *failover;
+ char *nodeuuid;
};
/**
* b) is it target block
*
* \param[in] lcfg
- * \param[in] mrul
+ * \param[in] mrd
*
* \retval 0 should not to be skipped
* \retval 1 should to be skipped
*/
static int check_markers(struct lustre_cfg *lcfg,
- struct mgs_replace_uuid_lookup *mrul)
+ struct mgs_replace_data *mrd)
{
struct cfg_marker *marker;
/* Track markers. Find given device */
if (lcfg->lcfg_command == LCFG_MARKER) {
marker = lustre_cfg_buf(lcfg, 1);
- /* Clean llog from records marked as CM_EXCLUDE.
- CM_SKIP records are used for "active" command
+ /* Clean llog from records marked as CM_SKIP.
+ CM_EXCLUDE records are used for "active" command
and can be restored if needed */
- if ((marker->cm_flags & (CM_EXCLUDE | CM_START)) ==
- (CM_EXCLUDE | CM_START)) {
- mrul->skip_it = 1;
+ if ((marker->cm_flags & (CM_SKIP | CM_START)) ==
+ (CM_SKIP | CM_START)) {
+ mrd->state = REPLACE_SKIP;
return 1;
}
- if ((marker->cm_flags & (CM_EXCLUDE | CM_END)) ==
- (CM_EXCLUDE | CM_END)) {
- mrul->skip_it = 0;
+ if ((marker->cm_flags & (CM_SKIP | CM_END)) ==
+ (CM_SKIP | CM_END)) {
+ mrd->state = REPLACE_COPY;
return 1;
}
- if (strcmp(mrul->target.mti_svname, marker->cm_tgtname) == 0) {
+ if (strcmp(mrd->target.mti_svname, marker->cm_tgtname) == 0) {
LASSERT(!(marker->cm_flags & CM_START) ||
!(marker->cm_flags & CM_END));
if (marker->cm_flags & CM_START) {
- mrul->in_target_device = 1;
- mrul->device_nids_added = 0;
+ mrd->state = REPLACE_UUID;
+ mrd->failover = NULL;
} else if (marker->cm_flags & CM_END)
- mrul->in_target_device = 0;
+ mrd->state = REPLACE_COPY;
}
}
* \retval 0 record is not processed.
*/
static int process_command(const struct lu_env *env, struct lustre_cfg *lcfg,
- struct mgs_replace_uuid_lookup *mrul)
+ struct mgs_replace_data *mrd)
{
int nids_added = 0;
lnet_nid_t nid;
char *ptr;
- int rc;
+ int rc = 0;
- if (lcfg->lcfg_command == LCFG_ADD_UUID) {
+ if (mrd->state == REPLACE_UUID &&
+ lcfg->lcfg_command == LCFG_ADD_UUID) {
/* LCFG_ADD_UUID command found. Let's skip original command
and add passed nids */
- ptr = mrul->target.mti_params;
+ ptr = mrd->target.mti_params;
while (class_parse_nid(ptr, &nid, &ptr) == 0) {
+ if (!mrd->nodeuuid) {
+ rc = name_create(&mrd->nodeuuid,
+ libcfs_nid2str(nid), "");
+ if (rc) {
+ CERROR("Can't create uuid for "
+ "nid %s, device %s\n",
+ libcfs_nid2str(nid),
+ mrd->target.mti_svname);
+ return rc;
+ }
+ }
CDEBUG(D_MGS, "add nid %s with uuid %s, "
"device %s\n", libcfs_nid2str(nid),
- mrul->target.mti_params,
- mrul->target.mti_svname);
+ mrd->target.mti_params,
+ mrd->nodeuuid);
rc = record_add_uuid(env,
- mrul->temp_llh, nid,
- mrul->target.mti_params);
+ mrd->temp_llh, nid,
+ mrd->nodeuuid);
if (!rc)
nids_added++;
+
+ if (*ptr == ':') {
+ mrd->failover = ptr;
+ break;
+ }
}
if (nids_added == 0) {
CERROR("No new nids were added, nid %s with uuid %s, "
"device %s\n", libcfs_nid2str(nid),
- mrul->target.mti_params,
- mrul->target.mti_svname);
- RETURN(-ENXIO);
+ mrd->nodeuuid ? mrd->nodeuuid : "NULL",
+ mrd->target.mti_svname);
+ name_destroy(&mrd->nodeuuid);
+ return -ENXIO;
} else {
- mrul->device_nids_added = 1;
+ mrd->state = REPLACE_SETUP;
}
return nids_added;
}
- if (mrul->device_nids_added && lcfg->lcfg_command == LCFG_SETUP) {
+ if (mrd->state == REPLACE_SETUP && lcfg->lcfg_command == LCFG_SETUP) {
/* LCFG_SETUP command found. UUID should be changed */
rc = record_setup(env,
- mrul->temp_llh,
+ mrd->temp_llh,
/* devname the same */
lustre_cfg_string(lcfg, 0),
/* s1 is not changed */
lustre_cfg_string(lcfg, 1),
- /* new uuid should be
- the full nidlist */
- mrul->target.mti_params,
+ mrd->nodeuuid,
/* s3 is not changed */
lustre_cfg_string(lcfg, 3),
/* s4 is not changed */
lustre_cfg_string(lcfg, 4));
+
+ name_destroy(&mrd->nodeuuid);
+ if (rc)
+ return rc;
+
+ if (mrd->failover) {
+ ptr = mrd->failover;
+ while (class_parse_nid(ptr, &nid, &ptr) == 0) {
+ if (mrd->nodeuuid == NULL) {
+ rc = name_create(&mrd->nodeuuid,
+ libcfs_nid2str(nid),
+ "");
+ if (rc)
+ return rc;
+ }
+
+ CDEBUG(D_MGS, "add nid %s for failover %s\n",
+ libcfs_nid2str(nid), mrd->nodeuuid);
+ rc = record_add_uuid(env, mrd->temp_llh, nid,
+ mrd->nodeuuid);
+ if (rc) {
+ name_destroy(&mrd->nodeuuid);
+ return rc;
+ }
+ if (*ptr == ':') {
+ rc = record_add_conn(env,
+ mrd->temp_llh,
+ lustre_cfg_string(lcfg, 0),
+ mrd->nodeuuid);
+ name_destroy(&mrd->nodeuuid);
+ if (rc)
+ return rc;
+ }
+ }
+ if (mrd->nodeuuid) {
+ rc = record_add_conn(env, mrd->temp_llh,
+ lustre_cfg_string(lcfg, 0),
+ mrd->nodeuuid);
+ name_destroy(&mrd->nodeuuid);
+ if (rc)
+ return rc;
+ }
+ }
+ mrd->state = REPLACE_DONE;
return rc ? rc : 1;
}
*
* \param[in] llh log to be processed
* \param[in] rec current record
- * \param[in] data mgs_replace_uuid_lookup structure
+ * \param[in] data mgs_replace_data structure
*
* \retval 0 success
*/
-static int mgs_replace_handler(const struct lu_env *env,
- struct llog_handle *llh,
- struct llog_rec_hdr *rec,
- void *data)
+static int mgs_replace_nids_handler(const struct lu_env *env,
+ struct llog_handle *llh,
+ struct llog_rec_hdr *rec,
+ void *data)
{
- struct mgs_replace_uuid_lookup *mrul;
+ struct mgs_replace_data *mrd;
struct lustre_cfg *lcfg = REC_DATA(rec);
int cfg_len = REC_DATA_LEN(rec);
int rc;
ENTRY;
- mrul = (struct mgs_replace_uuid_lookup *)data;
+ mrd = (struct mgs_replace_data *)data;
if (rec->lrh_type != OBD_CFG_REC) {
CERROR("unhandled lrh_type: %#x, cmd %x %s %s\n",
GOTO(skip_out, rc = 0);
}
- rc = check_markers(lcfg, mrul);
- if (rc || mrul->skip_it)
+ rc = check_markers(lcfg, mrd);
+ if (rc || mrd->state == REPLACE_SKIP)
GOTO(skip_out, rc = 0);
/* Write to new log all commands outside target device block */
- if (!mrul->in_target_device)
+ if (mrd->state == REPLACE_COPY)
GOTO(copy_out, rc = 0);
- /* Skip all other LCFG_ADD_UUID and LCFG_ADD_CONN records
- (failover nids) for this target, assuming that if then
- primary is changing then so is the failover */
- if (mrul->device_nids_added &&
+ if (mrd->state == REPLACE_DONE &&
(lcfg->lcfg_command == LCFG_ADD_UUID ||
- lcfg->lcfg_command == LCFG_ADD_CONN))
+ lcfg->lcfg_command == LCFG_ADD_CONN)) {
+ if (!mrd->failover)
+ CWARN("Previous failover is deleted, but new one is "
+ "not set. This means you configure system "
+ "without failover or passed wrong replace_nids "
+ "command parameters. Device %s, passed nids %s\n",
+ mrd->target.mti_svname, mrd->target.mti_params);
GOTO(skip_out, rc = 0);
+ }
- rc = process_command(env, lcfg, mrul);
+ rc = process_command(env, lcfg, mrd);
if (rc < 0)
RETURN(rc);
RETURN(0);
copy_out:
/* Record is placed in temporary llog as is */
- rc = llog_write(env, mrul->temp_llh, rec, LLOG_NEXT_IDX);
+ rc = llog_write(env, mrd->temp_llh, rec, LLOG_NEXT_IDX);
CDEBUG(D_MGS, "Copied idx=%d, rc=%d, len=%d, cmd %x %s %s\n",
rec->lrh_index, rc, rec->lrh_len, lcfg->lcfg_command,
return rc;
}
-static int mgs_replace_nids_log(const struct lu_env *env,
- struct obd_device *mgs, struct fs_db *fsdb,
- char *logname, char *devname, char *nids)
+static int mgs_replace_log(const struct lu_env *env,
+ struct obd_device *mgs,
+ char *logname, char *devname,
+ llog_cb_t replace_handler, void *data)
{
struct llog_handle *orig_llh, *backup_llh;
struct llog_ctxt *ctxt;
- struct mgs_replace_uuid_lookup *mrul;
+ struct mgs_replace_data *mrd;
struct mgs_device *mgs_dev = lu2mgs_dev(mgs->obd_lu_dev);
static struct obd_uuid cfg_uuid = { .uuid = "config_uuid" };
char *backup;
- int rc, rc2;
+ int rc, rc2, buf_size;
+ time64_t now;
ENTRY;
- CDEBUG(D_MGS, "Replace nids for %s in %s\n", devname, logname);
-
ctxt = llog_get_context(mgs, LLOG_CONFIG_ORIG_CTXT);
LASSERT(ctxt != NULL);
GOTO(out_put, rc = 0);
}
- OBD_ALLOC(backup, strlen(logname) + strlen(".bak") + 1);
+ now = ktime_get_real_seconds();
+
+ /* max time64_t in decimal fits into 20 bytes long string */
+ buf_size = strlen(logname) + 1 + 20 + 1 + strlen(".bak") + 1;
+ OBD_ALLOC(backup, buf_size);
if (backup == NULL)
GOTO(out_put, rc = -ENOMEM);
- sprintf(backup, "%s.bak", logname);
+ snprintf(backup, buf_size, "%s.%llu.bak", logname, now);
rc = llog_backup(env, mgs, ctxt, ctxt, logname, backup);
if (rc == 0) {
if (llog_get_size(backup_llh) <= 1)
GOTO(out_close, rc = 0);
- OBD_ALLOC_PTR(mrul);
- if (!mrul)
+ OBD_ALLOC_PTR(mrd);
+ if (!mrd)
GOTO(out_close, rc = -ENOMEM);
/* devname is only needed information to replace UUID records */
- strlcpy(mrul->target.mti_svname, devname,
- sizeof(mrul->target.mti_svname));
- /* parse nids later */
- strlcpy(mrul->target.mti_params, nids, sizeof(mrul->target.mti_params));
+ if (devname)
+ strlcpy(mrd->target.mti_svname, devname,
+ sizeof(mrd->target.mti_svname));
+ /* data is parsed in llog callback */
+ if (data)
+ strlcpy(mrd->target.mti_params, data,
+ sizeof(mrd->target.mti_params));
/* Copy records to this temporary llog */
- mrul->temp_llh = orig_llh;
+ mrd->temp_llh = orig_llh;
- rc = llog_process(env, backup_llh, mgs_replace_handler,
- (void *)mrul, NULL);
- OBD_FREE_PTR(mrul);
+ rc = llog_process(env, backup_llh, replace_handler,
+ (void *)mrd, NULL);
+ OBD_FREE_PTR(mrd);
out_close:
rc2 = llog_close(NULL, backup_llh);
if (!rc)
}
out_free:
- OBD_FREE(backup, strlen(backup) + 1);
+ OBD_FREE(backup, buf_size);
out_put:
llog_ctxt_put(ctxt);
if (rc)
- CERROR("%s: failed to replace nids in log %s: rc = %d\n",
+ CERROR("%s: failed to replace log %s: rc = %d\n",
mgs->obd_name, logname, rc);
RETURN(rc);
}
+static int mgs_replace_nids_log(const struct lu_env *env,
+ struct obd_device *obd,
+ char *logname, char *devname, char *nids)
+{
+ CDEBUG(D_MGS, "Replace NIDs for %s in %s\n", devname, logname);
+ return mgs_replace_log(env, obd, logname, devname,
+ mgs_replace_nids_handler, nids);
+}
+
/**
* Parse device name and get file system name and/or device index
*
/* Process client llogs */
name_create(&logname, fsname, "-client");
- rc = mgs_replace_nids_log(env, mgs_obd, fsdb, logname, devname, nids);
+ rc = mgs_replace_nids_log(env, mgs_obd, logname, devname, nids);
name_destroy(&logname);
if (rc) {
CERROR("%s: error while replacing NIDs for %s: rc = %d\n",
if (!test_bit(i, fsdb->fsdb_mdt_index_map))
continue;
name_create_mdt(&logname, fsname, i);
- rc = mgs_replace_nids_log(env, mgs_obd, fsdb, logname, devname, nids);
+ rc = mgs_replace_nids_log(env, mgs_obd, logname, devname, nids);
name_destroy(&logname);
if (rc)
GOTO(out, rc);
RETURN(rc);
}
+/**
+ * This is called for every record in llog. Some of records are
+ * skipped, others are copied to new log as is.
+ * Records to be skipped are
+ * marker records marked SKIP
+ * records enclosed between SKIP markers
+ *
+ * \param[in] llh log to be processed
+ * \param[in] rec current record
+ * \param[in] data mgs_replace_data structure
+ *
+ * \retval 0 success
+ **/
+static int mgs_clear_config_handler(const struct lu_env *env,
+ struct llog_handle *llh,
+ struct llog_rec_hdr *rec, void *data)
+{
+ struct mgs_replace_data *mrd;
+ struct lustre_cfg *lcfg = REC_DATA(rec);
+ int cfg_len = REC_DATA_LEN(rec);
+ int rc;
+
+ ENTRY;
+
+ mrd = (struct mgs_replace_data *)data;
+
+ if (rec->lrh_type != OBD_CFG_REC) {
+ CDEBUG(D_MGS, "Config llog Name=%s, Record Index=%u, "
+ "Unhandled Record Type=%#x\n", llh->lgh_name,
+ rec->lrh_index, rec->lrh_type);
+ RETURN(-EINVAL);
+ }
+
+ rc = lustre_cfg_sanity_check(lcfg, cfg_len);
+ if (rc) {
+ CDEBUG(D_MGS, "Config llog Name=%s, Invalid config file.",
+ llh->lgh_name);
+ RETURN(-EINVAL);
+ }
+
+ if (lcfg->lcfg_command == LCFG_MARKER) {
+ struct cfg_marker *marker;
+
+ marker = lustre_cfg_buf(lcfg, 1);
+ if (marker->cm_flags & CM_SKIP) {
+ if (marker->cm_flags & CM_START)
+ mrd->state = REPLACE_SKIP;
+ if (marker->cm_flags & CM_END)
+ mrd->state = REPLACE_COPY;
+ /* SKIP section started or finished */
+ CDEBUG(D_MGS, "Skip idx=%d, rc=%d, len=%d, "
+ "cmd %x %s %s\n", rec->lrh_index, rc,
+ rec->lrh_len, lcfg->lcfg_command,
+ lustre_cfg_string(lcfg, 0),
+ lustre_cfg_string(lcfg, 1));
+ RETURN(0);
+ }
+ } else {
+ if (mrd->state == REPLACE_SKIP) {
+ /* record enclosed between SKIP markers, skip it */
+ CDEBUG(D_MGS, "Skip idx=%d, rc=%d, len=%d, "
+ "cmd %x %s %s\n", rec->lrh_index, rc,
+ rec->lrh_len, lcfg->lcfg_command,
+ lustre_cfg_string(lcfg, 0),
+ lustre_cfg_string(lcfg, 1));
+ RETURN(0);
+ }
+ }
+
+ /* Record is placed in temporary llog as is */
+ rc = llog_write(env, mrd->temp_llh, rec, LLOG_NEXT_IDX);
+
+ CDEBUG(D_MGS, "Copied idx=%d, rc=%d, len=%d, cmd %x %s %s\n",
+ rec->lrh_index, rc, rec->lrh_len, lcfg->lcfg_command,
+ lustre_cfg_string(lcfg, 0), lustre_cfg_string(lcfg, 1));
+ RETURN(rc);
+}
+
+/*
+ * Directory CONFIGS/ may contain files which are not config logs to
+ * be cleared. Skip any llogs with a non-alphanumeric character after
+ * the last '-'. For example, fsname-MDT0000.sav, fsname-MDT0000.bak,
+ * fsname-MDT0000.orig, fsname-MDT0000~, fsname-MDT0000.20150516, etc.
+ */
+static bool config_to_clear(const char *logname)
+{
+ int i;
+ char *str;
+
+ str = strrchr(logname, '-');
+ if (!str)
+ return 0;
+
+ i = 0;
+ while (isalnum(str[++i]));
+ return str[i] == '\0';
+}
+
+/**
+ * Clear config logs for \a name
+ *
+ * \param env
+ * \param mgs MGS device
+ * \param name name of device or of filesystem
+ * (ex. lustre-OST0000 or lustre) in later case all logs
+ * will be cleared
+ *
+ * \retval 0 success
+ */
+int mgs_clear_configs(const struct lu_env *env,
+ struct mgs_device *mgs, const char *name)
+{
+ struct list_head dentry_list;
+ struct mgs_direntry *dirent, *n;
+ char *namedash;
+ int conn_state;
+ struct obd_device *mgs_obd = mgs->mgs_obd;
+ int rc;
+
+ ENTRY;
+
+ /* Prevent clients and servers from connecting to mgs */
+ spin_lock(&mgs_obd->obd_dev_lock);
+ conn_state = mgs_obd->obd_no_conn;
+ mgs_obd->obd_no_conn = 1;
+ spin_unlock(&mgs_obd->obd_dev_lock);
+
+ /*
+ * config logs cannot be cleaned if anything other than
+ * MGS is started
+ */
+ if (!only_mgs_is_running(mgs_obd)) {
+ CERROR("Only MGS is allowed to be started\n");
+ GOTO(out, rc = -EBUSY);
+ }
+
+ /* Find all the logs in the CONFIGS directory */
+ rc = class_dentry_readdir(env, mgs, &dentry_list);
+ if (rc) {
+ CERROR("%s: cannot read config directory '%s': rc = %d\n",
+ mgs_obd->obd_name, MOUNT_CONFIGS_DIR, rc);
+ GOTO(out, rc);
+ }
+
+ if (list_empty(&dentry_list)) {
+ CERROR("%s: list empty reading config dir '%s': rc = %d\n",
+ mgs_obd->obd_name, MOUNT_CONFIGS_DIR, -ENOENT);
+ GOTO(out, rc = -ENOENT);
+ }
+
+ OBD_ALLOC(namedash, strlen(name) + 2);
+ if (namedash == NULL)
+ GOTO(out, rc = -ENOMEM);
+ snprintf(namedash, strlen(name) + 2, "%s-", name);
+
+ list_for_each_entry(dirent, &dentry_list, mde_list) {
+ if (strcmp(name, dirent->mde_name) &&
+ strncmp(namedash, dirent->mde_name, strlen(namedash)))
+ continue;
+ if (!config_to_clear(dirent->mde_name))
+ continue;
+ CDEBUG(D_MGS, "%s: Clear config log %s\n",
+ mgs_obd->obd_name, dirent->mde_name);
+ rc = mgs_replace_log(env, mgs_obd, dirent->mde_name, NULL,
+ mgs_clear_config_handler, NULL);
+ if (rc)
+ break;
+ }
+
+ list_for_each_entry_safe(dirent, n, &dentry_list, mde_list) {
+ list_del_init(&dirent->mde_list);
+ mgs_direntry_free(dirent);
+ }
+ OBD_FREE(namedash, strlen(name) + 2);
+out:
+ spin_lock(&mgs_obd->obd_dev_lock);
+ mgs_obd->obd_no_conn = conn_state;
+ spin_unlock(&mgs_obd->obd_dev_lock);
+
+ RETURN(rc);
+}
+
static int record_lov_setup(const struct lu_env *env, struct llog_handle *llh,
char *devname, struct lov_desc *desc)
{
/* Add ost to all MDT lov defs */
for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
if (test_bit(i, fsdb->fsdb_mdt_index_map)) {
- char mdt_index[9];
+ char mdt_index[13];
rc = name_create_mdt_and_lov(&logname, &lovname, fsdb,
i);
if (rc)
RETURN(rc);
- sprintf(mdt_index, "-MDT%04x", i);
+
+ snprintf(mdt_index, sizeof(mdt_index), "-MDT%04x", i);
rc = mgs_write_log_osc_to_lov(env, mgs, fsdb, mti,
logname, mdt_index,
lovname, LUSTRE_SP_MDT,
return -ENOMEM;
lcfg = &lcr->lcr_cfg;
- lcfg->lcfg_num = convert ? simple_strtoul(tmp, NULL, 0) : 0;
+ if (convert) {
+ rc = kstrtouint(tmp, 0, &lcfg->lcfg_num);
+ if (rc)
+ GOTO(out_rec_free, rc);
+ } else {
+ lcfg->lcfg_num = 0;
+ }
+
/* truncate the comment to the parameter name */
ptr = tmp - 1;
sep = *ptr;
}
}
*ptr = sep;
+out_rec_free:
lustre_cfg_rec_free(lcr);
return rc;
}
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 & LDD_F_SV_TYPE_MDT) {
+ if (mti->mti_flags & (LDD_F_VIRGIN | LDD_F_WRITECONF)) {
+ /* Generate a log from scratch */
+ if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
rc = mgs_write_log_mdt(env, mgs, fsdb, mti);
- } else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
+ } else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
rc = mgs_write_log_ost(env, mgs, 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 {
- /* 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;
- }
+ } 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 {
+ /* 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;
+ }
/* allocate temporary buffer, where class_get_next_param will
make copy of a current parameter */
sizeof(mti->mti_params))
GOTO(out, rc = -E2BIG);
- /* obdname2fsname reports devname as an obd device */
len = strcspn(param, ".=");
if (len && param[len] != '=') {
+ struct list_head *tmp;
char *ptr;
param += len + 1;
snprintf(mti->mti_svname, sizeof(mti->mti_svname), "%.*s",
(int)len, param);
- obdname2fsname(mti->mti_svname, mti->mti_fsname,
- sizeof(mti->mti_fsname));
+ mutex_lock(&mgs->mgs_mutex);
+ if (unlikely(list_empty(&mgs->mgs_fs_db_list))) {
+ mutex_unlock(&mgs->mgs_mutex);
+ GOTO(out, rc = -ENODEV);
+ }
+
+ list_for_each(tmp, &mgs->mgs_fs_db_list) {
+ fsdb = list_entry(tmp, struct fs_db, fsdb_list);
+ if (fsdb->fsdb_has_lproc_entry &&
+ strcmp(fsdb->fsdb_name, "params") != 0 &&
+ strstr(param, fsdb->fsdb_name)) {
+ snprintf(mti->mti_svname,
+ sizeof(mti->mti_svname), "%s",
+ fsdb->fsdb_name);
+ break;
+ }
+ fsdb = NULL;
+ }
+
+ if (!fsdb) {
+ snprintf(mti->mti_svname, sizeof(mti->mti_svname),
+ "general");
+ }
+ mutex_unlock(&mgs->mgs_mutex);
} else {
snprintf(mti->mti_svname, sizeof(mti->mti_svname), "general");
}
enum lcfg_command_type cmd, const char *nodemap_name,
char *param)
{
- lnet_nid_t nid[2];
- __u32 idmap[2];
- bool bool_switch;
- __u32 int_id;
- int rc = 0;
- ENTRY;
+ lnet_nid_t nid[2];
+ u32 idmap[2];
+ bool bool_switch;
+ u32 int_id;
+ int rc = 0;
+ ENTRY;
switch (cmd) {
case LCFG_NODEMAP_ADD:
rc = nodemap_add(nodemap_name);
rc = nodemap_del_range(nodemap_name, nid);
break;
case LCFG_NODEMAP_ADMIN:
- bool_switch = simple_strtoul(param, NULL, 10);
+ rc = kstrtobool(param, &bool_switch);
+ if (rc)
+ break;
rc = nodemap_set_allow_root(nodemap_name, bool_switch);
break;
case LCFG_NODEMAP_DENY_UNKNOWN:
- bool_switch = simple_strtoul(param, NULL, 10);
+ rc = kstrtobool(param, &bool_switch);
+ if (rc)
+ break;
rc = nodemap_set_deny_unknown(nodemap_name, bool_switch);
break;
+ case LCFG_NODEMAP_AUDIT_MODE:
+ rc = kstrtoul(param, 10, (unsigned long *)&bool_switch);
+ if (rc == 0)
+ rc = nodemap_set_audit_mode(nodemap_name, bool_switch);
+ break;
case LCFG_NODEMAP_MAP_MODE:
if (strcmp("both", param) == 0)
rc = nodemap_set_mapping_mode(nodemap_name,
rc = -EINVAL;
break;
case LCFG_NODEMAP_TRUSTED:
- bool_switch = simple_strtoul(param, NULL, 10);
+ rc = kstrtobool(param, &bool_switch);
+ if (rc)
+ break;
rc = nodemap_set_trust_client_ids(nodemap_name, bool_switch);
break;
case LCFG_NODEMAP_SQUASH_UID:
- int_id = simple_strtoul(param, NULL, 10);
+ rc = kstrtouint(param, 10, &int_id);
+ if (rc)
+ break;
rc = nodemap_set_squash_uid(nodemap_name, int_id);
break;
case LCFG_NODEMAP_SQUASH_GID:
- int_id = simple_strtoul(param, NULL, 10);
+ rc = kstrtouint(param, 10, &int_id);
+ if (rc)
+ break;
rc = nodemap_set_squash_gid(nodemap_name, int_id);
break;
case LCFG_NODEMAP_ADD_UIDMAP:
case LCFG_NODEMAP_SET_FILESET:
rc = nodemap_set_fileset(nodemap_name, param);
break;
+ case LCFG_NODEMAP_SET_SEPOL:
+ rc = nodemap_set_sepol(nodemap_name, param);
+ break;
default:
rc = -EINVAL;
}