Whamcloud - gitweb
LU-1302 llog: pass lu_env as parametr in llog functions
[fs/lustre-release.git] / lustre / mgs / mgs_llog.c
index a27969a..98a1108 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- 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.
@@ -28,6 +26,8 @@
 /*
  * 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/
@@ -40,9 +40,6 @@
  * Author: Nathan Rutman <nathan@clusterfs.com>
  */
 
-#ifndef EXPORT_SYMTAB
-#define EXPORT_SYMTAB
-#endif
 #define DEBUG_SUBSYSTEM S_MGS
 #define D_MGS D_CONFIG
 
@@ -89,7 +86,7 @@ int class_dentry_readdir(struct obd_device *obd, struct dentry *dir,
                 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));
@@ -139,10 +136,10 @@ struct mgs_fsdb_handler_data
 */
 /* 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);
@@ -183,10 +180,9 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
         /* 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;
@@ -263,7 +259,7 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
         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;
@@ -277,28 +273,29 @@ static int mgs_get_fsdb_from_llog(struct obd_device *obd, struct fs_db *fsdb)
         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);
 
@@ -325,7 +322,7 @@ static void mgs_free_fsdb_srpc(struct fs_db *fsdb)
         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;
@@ -357,7 +354,7 @@ static struct fs_db *mgs_new_fsdb(struct obd_device *obd, char *fsname)
                 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) {
@@ -383,6 +380,9 @@ static struct fs_db *mgs_new_fsdb(struct obd_device *obd, char *fsname)
                 if (rc)
                         GOTO(err, rc);
 
+                /* initialise data for NID table */
+                mgs_ir_init_fs(obd, fsdb);
+
                 lproc_mgs_add_live(obd, fsdb);
         }
 
@@ -405,9 +405,13 @@ err:
 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)
@@ -418,6 +422,7 @@ static void mgs_free_fsdb(struct obd_device *obd, struct fs_db *fsdb)
         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);
 }
 
@@ -433,12 +438,12 @@ int mgs_cleanup_fsdb_list(struct obd_device *obd)
         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;
 }
 
@@ -449,17 +454,17 @@ int mgs_find_or_make_fsdb(struct obd_device *obd, char *name,
         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;
 
@@ -507,9 +512,9 @@ int mgs_check_index(struct obd_device *obd, struct mgs_target_info *mti)
         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);
@@ -547,9 +552,9 @@ static int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
                 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"
@@ -565,7 +570,7 @@ static int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
                 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 ++;
         }
 
@@ -595,7 +600,7 @@ static int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
 
         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,
@@ -609,10 +614,11 @@ struct mgs_modify_lookup {
         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) -
@@ -651,8 +657,8 @@ static int mgs_modify_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
                 /* 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++;
         }
@@ -679,11 +685,11 @@ static int mgs_modify(struct obd_device *obd, struct fs_db *fsdb,
 
         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);
 
@@ -699,13 +705,14 @@ static int mgs_modify(struct obd_device *obd, struct fs_db *fsdb,
         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:
@@ -738,7 +745,7 @@ static int record_lcfg(struct obd_device *obd, struct llog_handle *llh,
 
         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);
@@ -920,11 +927,11 @@ static int record_start_log(struct obd_device *obd,
                 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);
@@ -943,7 +950,7 @@ static int record_end_log(struct obd_device *obd, struct llog_handle **llh)
 
         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);
@@ -960,11 +967,11 @@ static int mgs_log_is_empty(struct obd_device *obd, char *name)
         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);
@@ -1074,10 +1081,16 @@ struct temp_comp
 
 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;
@@ -1120,6 +1133,8 @@ static int mgs_steal_llog_handler(struct llog_handle *llh,
                 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)");
@@ -1195,10 +1210,34 @@ static int mgs_steal_llog_handler(struct llog_handle *llh,
                 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,
@@ -1223,18 +1262,19 @@ static int mgs_steal_llog_for_mdt_from_client(struct obd_device *obd,
 
         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:
@@ -1306,7 +1346,7 @@ static int mgs_write_log_lov(struct obd_device *obd, struct fs_db *fsdb,
         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? */
@@ -1438,7 +1478,7 @@ static int mgs_write_log_mdc_to_mdt(struct obd_device *obd, struct fs_db *fsdb,
         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);
         }
@@ -1519,17 +1559,12 @@ out:
         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,
@@ -1692,9 +1727,8 @@ static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb,
                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]), "");
@@ -1824,8 +1858,15 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb,
 
         /* 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);
 }
@@ -1894,9 +1935,9 @@ static int mgs_write_log_add_failnid(struct obd_device *obd, struct fs_db *fsdb,
         }
 
         /* 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);
@@ -1908,7 +1949,7 @@ static int mgs_write_log_add_failnid(struct obd_device *obd, struct fs_db *fsdb,
         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;
 
@@ -1927,13 +1968,6 @@ static int mgs_write_log_add_failnid(struct obd_device *obd, struct fs_db *fsdb,
         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,
@@ -1971,51 +2005,67 @@ static int mgs_wlp_lcfg(struct obd_device *obd, struct fs_db *fsdb,
 
 /* 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,
@@ -2064,13 +2114,12 @@ 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:
@@ -2206,7 +2255,7 @@ static int mgs_srpc_set_param(struct obd_device *obd,
                               char *param)
 {
         char                   *copy;
-        int                     rc, copy_size, del;
+        int                     rc, copy_size;
         ENTRY;
 
 #ifndef HAVE_GSS
@@ -2220,12 +2269,9 @@ static int mgs_srpc_set_param(struct obd_device *obd,
                 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);
@@ -2250,11 +2296,11 @@ struct mgs_srpc_read_data {
         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;
@@ -2338,11 +2384,11 @@ int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd,
 
         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);
 
@@ -2352,10 +2398,11 @@ int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd,
         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:
@@ -2367,59 +2414,10 @@ 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)
@@ -2427,7 +2425,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
         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
@@ -2441,6 +2439,10 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
         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) {
@@ -2457,7 +2459,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
                 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
@@ -2479,7 +2481,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
                 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);
@@ -2508,7 +2510,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
                 }
         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",
@@ -2532,7 +2534,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
                 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",
@@ -2570,14 +2572,14 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
                         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 "
@@ -2605,7 +2607,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
                                   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++){
@@ -2628,30 +2630,65 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
                 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. */
@@ -2676,9 +2713,9 @@ int mgs_check_failnid(struct obd_device *obd, struct mgs_target_info *mti)
            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
@@ -2733,14 +2770,14 @@ int mgs_write_log_target(struct obd_device *obd,
                 }
         }
 
-        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 "
@@ -2782,7 +2819,7 @@ int mgs_write_log_target(struct obd_device *obd,
         OBD_FREE(buf, strlen(mti->mti_params) + 1);
 
 out_up:
-        cfs_up(&fsdb->fsdb_sem);
+        cfs_mutex_unlock(&fsdb->fsdb_mutex);
         RETURN(rc);
 }
 
@@ -2822,7 +2859,7 @@ int mgs_upgrade_sv_14(struct obd_device *obd, struct mgs_target_info *mti,
                 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 "
@@ -2864,10 +2901,10 @@ int mgs_erase_log(struct obd_device *obd, char *name)
         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);
@@ -2883,7 +2920,7 @@ int mgs_erase_log(struct obd_device *obd, char *name)
 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);
@@ -2898,7 +2935,7 @@ int mgs_erase_logs(struct obd_device *obd, char *fsname)
                 RETURN(rc);
         }
 
-        cfs_down(&mgs->mgs_sem);
+        cfs_mutex_lock(&mgs->mgs_mutex);
 
         /* Delete the fs db */
         fsdb = mgs_find_fsdb(obd, fsname);
@@ -2919,7 +2956,7 @@ int mgs_erase_logs(struct obd_device *obd, char *fsname)
                 OBD_FREE(dirent, sizeof(*dirent));
         }
 
-        cfs_up(&mgs->mgs_sem);
+        cfs_mutex_unlock(&mgs->mgs_mutex);
 
         RETURN(rc);
 }
@@ -2957,39 +2994,45 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname)
         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);
@@ -2997,9 +3040,10 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname)
                 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 */
@@ -3009,12 +3053,21 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname)
         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
@@ -3022,7 +3075,7 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname)
          * 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);
@@ -3124,7 +3177,7 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd,
         }
         }
 
-        cfs_down(&fsdb->fsdb_sem);
+        cfs_mutex_lock(&fsdb->fsdb_mutex);
 
         if (canceled_label != NULL) {
                 OBD_ALLOC_PTR(mti);
@@ -3160,9 +3213,9 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd,
                            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: