Whamcloud - gitweb
LU-1818 quota: en/disable quota enforcement via conf_param
[fs/lustre-release.git] / lustre / mgs / mgs_llog.c
index 11d310d..f41532a 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.
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * 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 /*|D_WARNING*/
+#define D_MGS D_CONFIG
 
 #ifdef __KERNEL__
 #include <linux/module.h>
 #include <lustre_disk.h>
 #include <lustre_param.h>
 #include <lustre_sec.h>
+#include <lquota.h>
 #include "mgs_internal.h"
 
-static int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd,
-                                       struct fs_db *fsdb);
-static int mgs_get_srpc_conf_log(struct fs_db *fsdb, const char *tgt,
-                                 enum lustre_sec_part from,
-                                 enum lustre_sec_part to,
-                                 struct sptlrpc_conf_log *log);
-
 /********************** Class functions ********************/
 
 /* Caller must list_del and OBD_FREE each dentry from the list */
 int class_dentry_readdir(struct obd_device *obd, struct dentry *dir,
                                 struct vfsmount *inmnt,
-                                struct list_head *dentry_list){
+                                cfs_list_t *dentry_list){
         /* see mds_cleanup_pending */
         struct lvfs_run_ctxt saved;
         struct file *file;
@@ -96,7 +87,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));
@@ -130,19 +121,27 @@ static inline void name_destroy(char **name)
         *name = NULL;
 }
 
+struct mgs_fsdb_handler_data
+{
+        struct fs_db   *fsdb;
+        __u32           ver;
+};
+
 /* from the (client) config log, figure out:
         1. which ost's/mdt's are configured (by index)
         2. what the last config step is
         3. COMPAT_146 lov name
         4. COMPAT_146 mdt lov name
         5. COMPAT_146 mdc name
+        6. COMPAT_18 osc name
 */
 /* 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 fs_db *fsdb = (struct fs_db *)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);
         struct lustre_cfg *lcfg;
@@ -175,7 +174,7 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
                 CDEBUG(D_MGS, "OST index for %s is %u (%s)\n",
                        lustre_cfg_string(lcfg, 1), index,
                        lustre_cfg_string(lcfg, 2));
-                set_bit(index, fsdb->fsdb_ost_index_map);
+                cfs_set_bit(index, fsdb->fsdb_ost_index_map);
         }
 
         /* Figure out mdt indicies */
@@ -191,7 +190,8 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
                 }
                 rc = 0;
                 CDEBUG(D_MGS, "MDT index is %u\n", index);
-                set_bit(index, fsdb->fsdb_mdt_index_map);
+                cfs_set_bit(index, fsdb->fsdb_mdt_index_map);
+                fsdb->fsdb_mdt_count ++;
         }
 
         /* COMPAT_146 */
@@ -199,7 +199,7 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
         /* #01 L attach 0:lov_mdsA 1:lov 2:cdbe9_lov_mdsA_dc8cf7f3bb */
         if ((fsdb->fsdb_gen == 0) && (lcfg->lcfg_command == LCFG_ATTACH) &&
             (strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_LOV_NAME) == 0)) {
-                fsdb->fsdb_flags |= FSDB_OLDLOG14;
+                cfs_set_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags);
                 name_destroy(&fsdb->fsdb_clilov);
                 rc = name_create(&fsdb->fsdb_clilov,
                                  lustre_cfg_string(lcfg, 0), "");
@@ -212,7 +212,7 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
         if ((fsdb->fsdb_gen == 0) && (lcfg->lcfg_command == LCFG_SETUP) &&
             (strncmp(lustre_cfg_string(lcfg, 0), "MDC_", 4) == 0)) {
                 char *ptr;
-                fsdb->fsdb_flags |= FSDB_OLDLOG14;
+                cfs_set_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags);
                 ptr = strstr(lustre_cfg_string(lcfg, 1), "_UUID");
                 if (!ptr) {
                         CERROR("Can't parse MDT uuid %s\n",
@@ -234,51 +234,69 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec,
         }
         /* end COMPAT_146 */
 
-        /* Keep track of the latest marker step */
+        /*
+         * compat to 1.8, check osc name used by MDT0 to OSTs, bz18548.
+         */
+        if (!cfs_test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags) &&
+            lcfg->lcfg_command == LCFG_ATTACH &&
+            strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_OSC_NAME) == 0) {
+                if (OBD_OCD_VERSION_MAJOR(d->ver) == 1 &&
+                    OBD_OCD_VERSION_MINOR(d->ver) <= 8) {
+                        CWARN("MDT using 1.8 OSC name scheme\n");
+                        cfs_set_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags);
+                }
+        }
+
         if (lcfg->lcfg_command == LCFG_MARKER) {
                 struct cfg_marker *marker;
                 marker = lustre_cfg_buf(lcfg, 1);
+
+                d->ver = marker->cm_vers;
+
+                /* Keep track of the latest marker step */
                 fsdb->fsdb_gen = max(fsdb->fsdb_gen, marker->cm_step);
         }
 
         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;
         struct llog_handle *loghandle;
         struct lvfs_run_ctxt saved;
         struct llog_ctxt *ctxt;
+        struct mgs_fsdb_handler_data d = { fsdb, 0 };
         int rc, rc2;
         ENTRY;
 
         ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
         LASSERT(ctxt != NULL);
         name_create(&logname, fsdb->fsdb_name, "-client");
-        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)
-                fsdb->fsdb_flags |= FSDB_LOG_EMPTY;
+                cfs_set_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags);
 
-        rc = llog_process(loghandle, mgs_fsdb_handler, (void *)fsdb, 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);
-        up(&fsdb->fsdb_sem);
+        cfs_mutex_unlock(&fsdb->fsdb_mutex);
         name_destroy(&logname);
         llog_ctxt_put(ctxt);
 
@@ -305,14 +323,14 @@ 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;
-        struct list_head *tmp;
+        cfs_list_t *tmp;
 
-        list_for_each(tmp, &mgs->mgs_fs_db_list) {
-                fsdb = list_entry(tmp, struct fs_db, fsdb_list);
+        cfs_list_for_each(tmp, &mgs->mgs_fs_db_list) {
+                fsdb = cfs_list_entry(tmp, struct fs_db, fsdb_list);
                 if (strcmp(fsdb->fsdb_name, fsname) == 0)
                         return fsdb;
         }
@@ -327,37 +345,49 @@ static struct fs_db *mgs_new_fsdb(struct obd_device *obd, char *fsname)
         int rc;
         ENTRY;
 
+        if (strlen(fsname) >= sizeof(fsdb->fsdb_name)) {
+                CERROR("fsname %s is too long\n", fsname);
+                RETURN(NULL);
+        }
+
         OBD_ALLOC_PTR(fsdb);
         if (!fsdb)
                 RETURN(NULL);
 
-        OBD_ALLOC(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
-        OBD_ALLOC(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
-        if (!fsdb->fsdb_ost_index_map || !fsdb->fsdb_mdt_index_map) {
-                CERROR("No memory for index maps\n");
-                GOTO(err, 0);
-        }
+        strcpy(fsdb->fsdb_name, fsname);
+        cfs_mutex_init(&fsdb->fsdb_mutex);
+        cfs_set_bit(FSDB_UDESC, &fsdb->fsdb_flags);
 
-        strncpy(fsdb->fsdb_name, fsname, sizeof(fsdb->fsdb_name));
-        fsdb->fsdb_name[sizeof(fsdb->fsdb_name) - 1] = 0;
-        rc = name_create(&fsdb->fsdb_mdtlov, fsname, "-mdtlov");
-        if (rc)
-                GOTO(err, rc);
-        rc = name_create(&fsdb->fsdb_mdtlmv, fsname, "-mdtlmv");
-        if (rc)
-                GOTO(err, rc);
-        rc = name_create(&fsdb->fsdb_clilov, fsname, "-clilov");
-        if (rc)
-                GOTO(err, rc);
+        if (strcmp(fsname, MGSSELF_NAME) == 0) {
+                cfs_set_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags);
+        } else {
+                OBD_ALLOC(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
+                OBD_ALLOC(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
+                if (!fsdb->fsdb_ost_index_map || !fsdb->fsdb_mdt_index_map) {
+                        CERROR("No memory for index maps\n");
+                        GOTO(err, 0);
+                }
 
-        rc = name_create(&fsdb->fsdb_clilmv, fsname, "-clilmv");
-        if (rc)
-                GOTO(err, rc);
+                rc = name_create(&fsdb->fsdb_mdtlov, fsname, "-mdtlov");
+                if (rc)
+                        GOTO(err, rc);
+                rc = name_create(&fsdb->fsdb_mdtlmv, fsname, "-mdtlmv");
+                if (rc)
+                        GOTO(err, rc);
+                rc = name_create(&fsdb->fsdb_clilov, fsname, "-clilov");
+                if (rc)
+                        GOTO(err, rc);
+                rc = name_create(&fsdb->fsdb_clilmv, fsname, "-clilmv");
+                if (rc)
+                        GOTO(err, rc);
+
+                /* initialise data for NID table */
+                mgs_ir_init_fs(obd, fsdb);
+
+                lproc_mgs_add_live(obd, fsdb);
+        }
 
-        fsdb->fsdb_srpc_fl_udesc = 1;
-        sema_init(&fsdb->fsdb_sem, 1);
-        list_add(&fsdb->fsdb_list, &mgs->mgs_fs_db_list);
-        lproc_mgs_add_live(obd, fsdb);
+        cfs_list_add(&fsdb->fsdb_list, &mgs->mgs_fs_db_list);
 
         RETURN(fsdb);
 err:
@@ -376,17 +406,24 @@ err:
 static void mgs_free_fsdb(struct obd_device *obd, struct fs_db *fsdb)
 {
         /* wait for anyone with the sem */
-        down(&fsdb->fsdb_sem);
+        cfs_mutex_lock(&fsdb->fsdb_mutex);
         lproc_mgs_del_live(obd, fsdb);
-        list_del(&fsdb->fsdb_list);
-        OBD_FREE(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
-        OBD_FREE(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
+        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)
+                OBD_FREE(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
         name_destroy(&fsdb->fsdb_clilov);
         name_destroy(&fsdb->fsdb_clilmv);
         name_destroy(&fsdb->fsdb_mdtlov);
         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);
 }
 
@@ -401,43 +438,45 @@ int mgs_cleanup_fsdb_list(struct obd_device *obd)
 {
         struct mgs_obd *mgs = &obd->u.mgs;
         struct fs_db *fsdb;
-        struct list_head *tmp, *tmp2;
-        down(&mgs->mgs_sem);
-        list_for_each_safe(tmp, tmp2, &mgs->mgs_fs_db_list) {
-                fsdb = list_entry(tmp, struct fs_db, fsdb_list);
+        cfs_list_t *tmp, *tmp2;
+        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);
         }
-        up(&mgs->mgs_sem);
+        cfs_mutex_unlock(&mgs->mgs_mutex);
         return 0;
 }
 
-static int mgs_find_or_make_fsdb(struct obd_device *obd, char *name,
-                               struct fs_db **dbh)
+int mgs_find_or_make_fsdb(struct obd_device *obd, char *name,
+                          struct fs_db **dbh)
 {
         struct mgs_obd *mgs = &obd->u.mgs;
         struct fs_db *fsdb;
         int rc = 0;
 
-        down(&mgs->mgs_sem);
+        cfs_mutex_lock(&mgs->mgs_mutex);
         fsdb = mgs_find_fsdb(obd, name);
         if (fsdb) {
-                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);
-        up(&mgs->mgs_sem);
+        cfs_mutex_unlock(&mgs->mgs_mutex);
         if (!fsdb)
                 return -ENOMEM;
 
-        /* populate the db from the client llog */
-        rc = mgs_get_fsdb_from_llog(obd, fsdb);
-        if (rc) {
-                CERROR("Can't get db from client log %d\n", rc);
-                mgs_free_fsdb(obd, fsdb);
-                return rc;
+        if (!cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) {
+                /* populate the db from the client llog */
+                rc = mgs_get_fsdb_from_llog(obd, fsdb);
+                if (rc) {
+                        CERROR("Can't get db from client log %d\n", rc);
+                        mgs_free_fsdb(obd, fsdb);
+                        return rc;
+                }
         }
 
         /* populate srpc rules from params llog */
@@ -471,7 +510,7 @@ int mgs_check_index(struct obd_device *obd, struct mgs_target_info *mti)
                 RETURN(rc);
         }
 
-        if (fsdb->fsdb_flags & FSDB_LOG_EMPTY)
+        if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags))
                 RETURN(-1);
 
         if (mti->mti_flags & LDD_F_SV_TYPE_OST)
@@ -481,7 +520,7 @@ int mgs_check_index(struct obd_device *obd, struct mgs_target_info *mti)
         else
                 RETURN(-EINVAL);
 
-        if (test_bit(mti->mti_stripe_index, imap))
+        if (cfs_test_bit(mti->mti_stripe_index, imap))
                 RETURN(1);
         RETURN(0);
 }
@@ -490,7 +529,7 @@ static __inline__ int next_index(void *index_map, int map_len)
 {
         int i;
         for (i = 0; i < map_len * 8; i++)
-                 if (!test_bit(i, index_map)) {
+                 if (!cfs_test_bit(i, index_map)) {
                          return i;
                  }
         CERROR("max index %d exceeded.\n", i);
@@ -501,7 +540,7 @@ static __inline__ int next_index(void *index_map, int map_len)
         0  newly marked as in use
         <0 err
         +EALREADY for update of an old index */
-int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
+static int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
 {
         struct fs_db *fsdb;
         void *imap;
@@ -514,18 +553,26 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
                 RETURN(rc);
         }
 
-        if (mti->mti_flags & LDD_F_SV_TYPE_OST)
+        if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
                 imap = fsdb->fsdb_ost_index_map;
-        else if (mti->mti_flags & LDD_F_SV_TYPE_MDT)
+        } else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
                 imap = fsdb->fsdb_mdt_index_map;
-        else
+                if (fsdb->fsdb_mdt_count >= MAX_MDT_COUNT) {
+                        LCONSOLE_ERROR_MSG(0x13f, "The max mdt count"
+                                           "is %d\n", (int)MAX_MDT_COUNT);
+                        RETURN(-ERANGE);
+                }
+        } else {
                 RETURN(-EINVAL);
+        }
 
         if (mti->mti_flags & LDD_F_NEED_INDEX) {
                 rc = next_index(imap, INDEX_MAP_SIZE);
                 if (rc == -1)
                         RETURN(-ERANGE);
                 mti->mti_stripe_index = rc;
+                if (mti->mti_flags & LDD_F_SV_TYPE_MDT)
+                        fsdb->fsdb_mdt_count ++;
         }
 
         if (mti->mti_stripe_index >= INDEX_MAP_SIZE * 8) {
@@ -536,7 +583,7 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
                 RETURN(-ERANGE);
         }
 
-        if (test_bit(mti->mti_stripe_index, imap)) {
+        if (cfs_test_bit(mti->mti_stripe_index, imap)) {
                 if ((mti->mti_flags & LDD_F_VIRGIN) &&
                     !(mti->mti_flags & LDD_F_WRITECONF)) {
                         LCONSOLE_ERROR_MSG(0x140, "Server %s requested index "
@@ -552,10 +599,10 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
                 }
         }
 
-        set_bit(mti->mti_stripe_index, imap);
-        fsdb->fsdb_flags &= ~FSDB_LOG_EMPTY;
-        server_make_name(mti->mti_flags, mti->mti_stripe_index,
-                         mti->mti_fsname, mti->mti_svname);
+        cfs_set_bit(mti->mti_stripe_index, imap);
+        cfs_clear_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags);
+       server_make_name(mti->mti_flags & ~(LDD_F_VIRGIN | LDD_F_WRITECONF),
+                        mti->mti_stripe_index, mti->mti_fsname, mti->mti_svname);
 
         CDEBUG(D_MGS, "Set index for %s to %d\n", mti->mti_svname,
                mti->mti_stripe_index);
@@ -568,10 +615,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) -
@@ -610,8 +658,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++;
         }
@@ -631,17 +679,18 @@ static int mgs_modify(struct obd_device *obd, struct fs_db *fsdb,
         int rc, rc2;
         ENTRY;
 
-        CDEBUG(D_MGS, "modify %s/%s/%s\n", logname, devname, comment);
+        CDEBUG(D_MGS, "modify %s/%s/%s fl=%x\n", logname, devname, comment,
+               flags);
 
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
 
         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);
 
@@ -657,13 +706,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:
@@ -696,7 +746,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);
@@ -770,25 +820,6 @@ static inline int record_setup(struct obd_device *obd, struct llog_handle *llh,
         return record_base(obd,llh,devname,0,LCFG_SETUP,s1,s2,s3,s4);
 }
 
-static inline int record_sptlrpc_conf(struct obd_device *obd,
-                                      struct llog_handle *llh,
-                                      char *devname,
-                                      struct sptlrpc_conf_log *srpc_log)
-{
-        struct lustre_cfg_bufs bufs;
-        struct lustre_cfg *lcfg;
-        int rc;
-
-        lustre_cfg_bufs_reset(&bufs, devname);
-        lustre_cfg_bufs_set(&bufs, 1, srpc_log, sizeof(*srpc_log));
-        lcfg = lustre_cfg_new(LCFG_SPTLRPC_CONF, &bufs);
-
-        rc = record_lcfg(obd, llh, lcfg);
-
-        lustre_cfg_free(lcfg);
-        return rc;
-}
-
 static int record_lov_setup(struct obd_device *obd, struct llog_handle *llh,
                             char *devname, struct lov_desc *desc)
 {
@@ -897,11 +928,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);
@@ -920,7 +951,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);
@@ -937,11 +968,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);
@@ -980,12 +1011,13 @@ static int mgs_write_log_direct(struct obd_device *obd, struct fs_db *fsdb,
 
 /* write the lcfg in all logs for the given fs */
 int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb,
-                             struct mgs_target_info *mti,
-                             struct lustre_cfg *lcfg,
-                             char *devname, char *comment)
+                            struct mgs_target_info *mti,
+                            struct lustre_cfg *lcfg,
+                            char *devname, char *comment,
+                            int server_only)
 {
         struct mgs_obd *mgs = &obd->u.mgs;
-        struct list_head dentry_list;
+        cfs_list_t dentry_list;
         struct l_linux_dirent *dirent, *n;
         char *fsname = mti->mti_fsname;
         char *logname;
@@ -1015,22 +1047,33 @@ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb,
         }
 
         /* Could use fsdb index maps instead of directory listing */
-        list_for_each_entry_safe(dirent, n, &dentry_list, lld_list) {
-                list_del(&dirent->lld_list);
+        cfs_list_for_each_entry_safe(dirent, n, &dentry_list, lld_list) {
+                cfs_list_del(&dirent->lld_list);
                 /* don't write to sptlrpc rule log */
-                if (strncmp(fsname, dirent->lld_name, len) == 0 &&
-                    strstr(dirent->lld_name, "-sptlrpc") == NULL) {
+               if (strstr(dirent->lld_name, "-sptlrpc") != NULL)
+                       goto next;
+
+               /* caller wants write server logs only */
+               if (server_only && strstr(dirent->lld_name, "-client") != NULL)
+                       goto next;
+
+               if (strncmp(fsname, dirent->lld_name, len) == 0) {
                         CDEBUG(D_MGS, "Changing log %s\n", dirent->lld_name);
                         /* Erase any old settings of this same parameter */
                         mgs_modify(obd, fsdb, mti, dirent->lld_name, devname,
                                    comment, CM_SKIP);
                         /* Write the new one */
-                        rc = mgs_write_log_direct(obd, fsdb, dirent->lld_name,
-                                                  lcfg, devname, comment);
-                        if (rc)
-                                CERROR("err %d writing log %s\n", rc,
-                                       dirent->lld_name);
+                        if (lcfg) {
+                                rc = mgs_write_log_direct(obd, fsdb,
+                                                          dirent->lld_name,
+                                                          lcfg, devname,
+                                                          comment);
+                                if (rc)
+                                        CERROR("err %d writing log %s\n", rc,
+                                               dirent->lld_name);
+                        }
                 }
+next:
                 OBD_FREE(dirent, sizeof(*dirent));
         }
 
@@ -1047,10 +1090,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;
@@ -1093,6 +1142,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)");
@@ -1168,10 +1219,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,
@@ -1196,18 +1271,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:
@@ -1279,7 +1355,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? */
@@ -1354,9 +1430,8 @@ static int mgs_write_log_mdc_to_lmv(struct obd_device *obd, struct fs_db *fsdb,
                                     char *logname, char *lmvname)
 {
         struct llog_handle *llh = NULL;
-        struct sptlrpc_conf_log *srpc_log;
         char *mdcname, *nodeuuid, *mdcuuid, *lmvuuid;
-        char index[5];
+        char index[6];
         int i, rc;
         ENTRY;
 
@@ -1368,16 +1443,6 @@ static int mgs_write_log_mdc_to_lmv(struct obd_device *obd, struct fs_db *fsdb,
         CDEBUG(D_MGS, "adding mdc for %s to log %s:lmv(%s)\n",
                mti->mti_svname, logname, lmvname);
 
-        srpc_log = sptlrpc_conf_log_alloc();
-        if (IS_ERR(srpc_log))
-                RETURN(PTR_ERR(srpc_log));
-        srpc_log->scl_part = LUSTRE_SP_CLI;
-
-        rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
-                                   LUSTRE_SP_CLI, LUSTRE_SP_MDT, srpc_log);
-        if (rc)
-                goto out_srpc;
-
         name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
         name_create(&mdcname, mti->mti_svname, "-mdc");
         name_create(&mdcuuid, mdcname, "_UUID");
@@ -1396,7 +1461,6 @@ static int mgs_write_log_mdc_to_lmv(struct obd_device *obd, struct fs_db *fsdb,
 
         rc = record_attach(obd, llh, mdcname, LUSTRE_MDC_NAME, lmvuuid);
         rc = record_setup(obd, llh, mdcname, mti->mti_uuid, nodeuuid, 0, 0);
-        rc = record_sptlrpc_conf(obd, llh, mdcname, srpc_log);
         rc = mgs_write_log_failnids(obd, mti, llh, mdcname);
         snprintf(index, sizeof(index), "%d", mti->mti_stripe_index);
         rc = record_mdc_add(obd, llh, lmvname, mdcuuid, mti->mti_uuid,
@@ -1409,8 +1473,6 @@ static int mgs_write_log_mdc_to_lmv(struct obd_device *obd, struct fs_db *fsdb,
         name_destroy(&mdcuuid);
         name_destroy(&mdcname);
         name_destroy(&nodeuuid);
-out_srpc:
-        sptlrpc_conf_log_free(srpc_log);
         RETURN(rc);
 }
 
@@ -1419,30 +1481,19 @@ static int mgs_write_log_mdc_to_mdt(struct obd_device *obd, struct fs_db *fsdb,
                                     struct mgs_target_info *mti, char *logname)
 {
         struct llog_handle *llh = NULL;
-        struct sptlrpc_conf_log *srpc_log;
         char *nodeuuid, *mdcname, *mdcuuid, *mdtuuid;
         int idx = mti->mti_stripe_index;
         char index[9];
         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);
         }
 
         CDEBUG(D_MGS, "adding mdc index %d to %s\n", idx, logname);
 
-        srpc_log = sptlrpc_conf_log_alloc();
-        if (IS_ERR(srpc_log))
-                RETURN(PTR_ERR(srpc_log));
-        srpc_log->scl_part = LUSTRE_SP_MDT;
-
-        rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
-                                   LUSTRE_SP_MDT, LUSTRE_SP_MDT, srpc_log);
-        if (rc)
-                goto out_srpc;
-
         name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
         snprintf(index, sizeof(index), "-mdc%04x", idx);
         name_create(&mdcname, logname, index);
@@ -1458,7 +1509,6 @@ static int mgs_write_log_mdc_to_mdt(struct obd_device *obd, struct fs_db *fsdb,
         }
         rc = record_attach(obd, llh, mdcname, LUSTRE_MDC_NAME, mdcuuid);
         rc = record_setup(obd, llh, mdcname, mti->mti_uuid, nodeuuid, 0, 0);
-        rc = record_sptlrpc_conf(obd, llh, mdcname, srpc_log);
         rc = mgs_write_log_failnids(obd, mti, llh, mdcname);
         snprintf(index, sizeof(index), "%d", idx);
 
@@ -1471,8 +1521,6 @@ static int mgs_write_log_mdc_to_mdt(struct obd_device *obd, struct fs_db *fsdb,
         name_destroy(&mdcname);
         name_destroy(&nodeuuid);
         name_destroy(&mdtuuid);
-out_srpc:
-        sptlrpc_conf_log_free(srpc_log);
         RETURN(rc);
 }
 
@@ -1482,25 +1530,14 @@ static int mgs_write_log_mdt0(struct obd_device *obd, struct fs_db *fsdb,
         char *log = mti->mti_svname;
         struct llog_handle *llh = NULL;
         char *uuid, *lovname;
-        char mdt_index[5];
-        struct sptlrpc_conf_log *srpc_log;
+        char mdt_index[6];
         char *ptr = mti->mti_params;
         int rc = 0, failout = 0;
         ENTRY;
 
-        srpc_log = sptlrpc_conf_log_alloc();
-        if (IS_ERR(srpc_log))
-                RETURN(PTR_ERR(srpc_log));
-        srpc_log->scl_part = LUSTRE_SP_MDT;
-
-        rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
-                                   LUSTRE_SP_ANY, LUSTRE_SP_MDT, srpc_log);
-        if (rc)
-                GOTO(out_srpc, rc);
-
         OBD_ALLOC(uuid, sizeof(struct obd_uuid));
         if (uuid == NULL)
-                GOTO(out_srpc, rc = -ENOMEM);
+                RETURN(-ENOMEM);
 
         if (class_find_param(ptr, PARAM_FAILMODE, &ptr) == 0)
                 failout = (strncmp(ptr, "failout", 7) == 0);
@@ -1510,7 +1547,7 @@ static int mgs_write_log_mdt0(struct obd_device *obd, struct fs_db *fsdb,
                 rc = mgs_write_log_lov(obd, fsdb, mti, log, lovname);
 
         sprintf(uuid, "%s_UUID", log);
-        sprintf(mdt_index,"%d",mti->mti_stripe_index);
+        sprintf(mdt_index, "%d", mti->mti_stripe_index);
 
         /* add MDT itself */
         rc = record_start_log(obd, &llh, log);
@@ -1523,17 +1560,45 @@ static int mgs_write_log_mdt0(struct obd_device *obd, struct fs_db *fsdb,
         rc = record_mount_opt(obd, llh, log, lovname, NULL);
         rc = record_setup(obd, llh, log, uuid, mdt_index, lovname,
                         failout ? "n" : "f");
-        rc = record_sptlrpc_conf(obd, llh, log, srpc_log);
         rc = record_marker(obd, llh, fsdb, CM_END, log, "add mdt");
         rc = record_end_log(obd, &llh);
 out:
         name_destroy(&lovname);
         OBD_FREE(uuid, sizeof(struct obd_uuid));
-out_srpc:
-        sptlrpc_conf_log_free(srpc_log);
         RETURN(rc);
 }
 
+static inline void name_create_mdt(char **logname, char *fsname, int i)
+{
+        char mdt_index[9];
+
+        sprintf(mdt_index, "-MDT%04x", i);
+        name_create(logname, fsname, mdt_index);
+}
+
+static void name_create_mdt_and_lov(char **logname, char **lovname,
+                                    struct fs_db *fsdb, int i)
+{
+        name_create_mdt(logname, fsdb->fsdb_name, i);
+        /* COMPAT_180 */
+        if (i == 0 && cfs_test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
+                name_create(lovname, fsdb->fsdb_name, "-mdtlov");
+        else
+                name_create(lovname, *logname, "-mdtlov");
+}
+
+static inline void name_create_mdt_osc(char **oscname, char *ostname,
+                                       struct fs_db *fsdb, int i)
+{
+        char suffix[16];
+
+        if (i == 0 && cfs_test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
+                sprintf(suffix, "-osc");
+        else
+                sprintf(suffix, "-osc-MDT%04x", i);
+        name_create(oscname, ostname, suffix);
+}
+
 /* envelope method for all layers log */
 static int mgs_write_log_mdt(struct obd_device *obd, struct fs_db *fsdb,
                               struct mgs_target_info *mti)
@@ -1541,7 +1606,6 @@ static int mgs_write_log_mdt(struct obd_device *obd, struct fs_db *fsdb,
         struct llog_handle *llh = NULL;
         char *cliname;
         struct temp_comp comp = { 0 };
-        char mdt_index[9];
         int rc, i = 0;
         ENTRY;
 
@@ -1646,10 +1710,8 @@ out:
         for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
                 char *mdtname;
                 if (i !=  mti->mti_stripe_index &&
-                    test_bit(i,  fsdb->fsdb_mdt_index_map)) {
-                        sprintf(mdt_index,"-MDT%04x",i);
-
-                        name_create(&mdtname, mti->mti_fsname, mdt_index);
+                    cfs_test_bit(i,  fsdb->fsdb_mdt_index_map)) {
+                        name_create_mdt(&mdtname, mti->mti_fsname, i);
                         rc = mgs_write_log_mdc_to_mdt(obd, fsdb, mti, mdtname);
                         name_destroy(&mdtname);
                 }
@@ -1665,29 +1727,17 @@ static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb,
                                     enum lustre_sec_part sec_part, int flags)
 {
         struct llog_handle *llh = NULL;
-        struct sptlrpc_conf_log *srpc_log;
         char *nodeuuid, *oscname, *oscuuid, *lovuuid, *svname;
-        char index[5];
+        char index[6];
         int i, rc;
 
         ENTRY;
         CDEBUG(D_INFO, "adding osc for %s to log %s\n",
                mti->mti_svname, logname);
 
-        srpc_log = sptlrpc_conf_log_alloc();
-        if (IS_ERR(srpc_log))
-                RETURN(PTR_ERR(srpc_log));
-        srpc_log->scl_part = sec_part;
-
-        rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
-                                   sec_part, LUSTRE_SP_OST, srpc_log);
-        if (rc)
-                goto out_srpc;
-
         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]), "");
@@ -1720,7 +1770,6 @@ static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb,
         }
         rc = record_attach(obd, llh, oscname, LUSTRE_OSC_NAME, lovuuid);
         rc = record_setup(obd, llh, oscname, mti->mti_uuid, nodeuuid, 0, 0);
-        rc = record_sptlrpc_conf(obd, llh, oscname, srpc_log);
         rc = mgs_write_log_failnids(obd, mti, llh, oscname);
         snprintf(index, sizeof(index), "%d", mti->mti_stripe_index);
         rc = record_lov_add(obd, llh, lovname, mti->mti_uuid, index, "1");
@@ -1733,8 +1782,6 @@ out:
         name_destroy(&oscname);
         name_destroy(&svname);
         name_destroy(&nodeuuid);
-out_srpc:
-        sptlrpc_conf_log_free(srpc_log);
         RETURN(rc);
 }
 
@@ -1742,9 +1789,7 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb,
                              struct mgs_target_info *mti)
 {
         struct llog_handle *llh = NULL;
-        struct sptlrpc_conf_log *srpc_log;
         char *logname, *lovname;
-        char mdt_index[9];
         char *ptr = mti->mti_params;
         int rc, flags = 0, failout = 0, i;
         ENTRY;
@@ -1764,16 +1809,6 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb,
                 RETURN(-EALREADY);
         }
 
-        srpc_log = sptlrpc_conf_log_alloc();
-        if (IS_ERR(srpc_log))
-                RETURN(PTR_ERR(srpc_log));
-        srpc_log->scl_part = LUSTRE_SP_OST;
-
-        rc = mgs_get_srpc_conf_log(fsdb, mti->mti_svname,
-                                   LUSTRE_SP_ANY, LUSTRE_SP_OST, srpc_log);
-        if (rc)
-                goto out_srpc;
-
         /*
         attach obdfilter ost1 ost1_UUID
         setup /dev/loop2 ldiskfs f|n errors=remount-ro,user_xattr
@@ -1793,14 +1828,13 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb,
         rc = record_setup(obd, llh, mti->mti_svname,
                           "dev"/*ignored*/, "type"/*ignored*/,
                           failout ? "n" : "f", 0/*options*/);
-        rc = record_sptlrpc_conf(obd, llh, mti->mti_svname, srpc_log);
         rc = record_marker(obd, llh, fsdb, CM_END, mti->mti_svname, "add ost");
         rc = record_end_log(obd, &llh);
 
         /* We also have to update the other logs where this osc is part of
            the lov */
 
-        if (fsdb->fsdb_flags & FSDB_OLDLOG14) {
+        if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) {
                 /* If we're upgrading, the old mdt log already has our
                    entry. Let's do a fake one for fun. */
                 /* Note that we can't add any new failnids, since we don't
@@ -1816,12 +1850,13 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb,
                               mti->mti_svname);
         }
 
-        // for_all_existing_mdt
+        /* 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)) {
-                        sprintf(mdt_index,"-MDT%04x",i);
-                        name_create(&logname, mti->mti_fsname, mdt_index);
-                        name_create(&lovname, logname, "-mdtlov");
+                if (cfs_test_bit(i, fsdb->fsdb_mdt_index_map)) {
+                        char mdt_index[9];
+
+                        name_create_mdt_and_lov(&logname, &lovname, fsdb, i);
+                        sprintf(mdt_index, "-MDT%04x", i);
                         mgs_write_log_osc_to_lov(obd, fsdb, mti, logname,
                                                  mdt_index, lovname,
                                                  LUSTRE_SP_MDT, flags);
@@ -1832,14 +1867,59 @@ 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);
-out_srpc:
-        sptlrpc_conf_log_free(srpc_log);
         RETURN(rc);
 }
 
+static __inline__ int mgs_param_empty(char *ptr)
+{
+        char *tmp;
+
+        if ((tmp = strchr(ptr, '=')) && (*(++tmp) == '\0'))
+                return 1;
+        return 0;
+}
+
+static int mgs_write_log_failnid_internal(struct obd_device *obd,
+                                          struct fs_db *fsdb,
+                                          struct mgs_target_info *mti,
+                                          char *logname, char *cliname)
+{
+        int rc;
+        struct llog_handle *llh = NULL;
+
+        if (mgs_param_empty(mti->mti_params)) {
+                /* Remove _all_ failnids */
+                rc = mgs_modify(obd, fsdb, mti, logname,
+                                mti->mti_svname, "add failnid", CM_SKIP);
+                return rc;
+        }
+
+        /* Otherwise failover nids are additive */
+        rc = record_start_log(obd, &llh, logname);
+        if (!rc) {
+                /* FIXME this should be a single journal transaction */
+                rc = record_marker(obd, llh, fsdb, CM_START,
+                                   mti->mti_svname, "add failnid");
+                rc = mgs_write_log_failnids(obd, mti, llh, cliname);
+                rc = record_marker(obd, llh, fsdb, CM_END,
+                                   mti->mti_svname, "add failnid");
+                rc = record_end_log(obd, &llh);
+        }
+
+        return rc;
+}
+
+
 /* Add additional failnids to an existing log.
    The mdc/osc must have been added to logs first */
 /* tcp nids must be in dotted-quad ascii -
@@ -1848,15 +1928,12 @@ static int mgs_write_log_add_failnid(struct obd_device *obd, struct fs_db *fsdb,
                                      struct mgs_target_info *mti)
 {
         char *logname, *cliname;
-        struct llog_handle *llh = NULL;
         int rc;
         ENTRY;
 
-        /* FIXME how do we delete a failnid? Currently --writeconf is the
-           only way.  Maybe make --erase-params pass a flag to really
-           erase all params from logs - except it can't erase the failnids
-           given when a target first registers, since they aren't processed
-           as params... */
+        /* FIXME we currently can't erase the failnids
+         * given when a target first registers, since they aren't part of
+         * an "add uuid" stanza */
 
         /* Verify that we know about this target */
         if (mgs_log_is_empty(obd, mti->mti_svname)) {
@@ -1875,36 +1952,28 @@ static int mgs_write_log_add_failnid(struct obd_device *obd, struct fs_db *fsdb,
                 RETURN(-EINVAL);
         }
 
-        /* Add failover nids to client log */
+        /* Add failover nids to the client log */
         name_create(&logname, mti->mti_fsname, "-client");
-        rc = record_start_log(obd, &llh, logname);
-        if (!rc) {
-                /* FIXME this fn should be a single journal transaction */
-                rc = record_marker(obd, llh, fsdb, CM_START, mti->mti_svname,
-                                   "add failnid");
-                rc = mgs_write_log_failnids(obd, mti, llh, cliname);
-                rc = record_marker(obd, llh, fsdb, CM_END, mti->mti_svname,
-                                   "add failnid");
-                rc = record_end_log(obd, &llh);
-        }
+        rc = mgs_write_log_failnid_internal(obd, fsdb, mti, logname, cliname);
         name_destroy(&logname);
+        name_destroy(&cliname);
 
         if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
-                /* Add OST failover nids to the MDT log as well */
-                name_create(&logname, mti->mti_fsname, "-MDT0000");
-                rc = record_start_log(obd, &llh, logname);
-                if (!rc) {
-                        rc = record_marker(obd, llh, fsdb, CM_START,
-                                           mti->mti_svname, "add failnid");
-                        rc = mgs_write_log_failnids(obd, mti, llh, cliname);
-                        rc = record_marker(obd, llh, fsdb, CM_END,
-                                           mti->mti_svname, "add failnid");
-                        rc = record_end_log(obd, &llh);
+                /* Add OST failover nids to the MDT logs as well */
+                int i;
+
+                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);
+                        name_create_mdt_osc(&cliname, mti->mti_svname, fsdb, i);
+                        rc = mgs_write_log_failnid_internal(obd, fsdb, mti,
+                                                            logname, cliname);
+                        name_destroy(&cliname);
+                        name_destroy(&logname);
                 }
-                name_destroy(&logname);
         }
 
-        name_destroy(&cliname);
         RETURN(rc);
 }
 
@@ -1916,7 +1985,7 @@ static int mgs_wlp_lcfg(struct obd_device *obd, struct fs_db *fsdb,
         char comment[MTI_NAME_MAXLEN];
         char *tmp;
         struct lustre_cfg *lcfg;
-        int rc;
+        int rc, del;
 
         /* Erase any old settings of this same parameter */
         memcpy(comment, ptr, MTI_NAME_MAXLEN);
@@ -1926,8 +1995,12 @@ static int mgs_wlp_lcfg(struct obd_device *obd, struct fs_db *fsdb,
             *tmp = 0;
         /* FIXME we should skip settings that are the same as old values */
         rc = mgs_modify(obd, fsdb, mti, logname, tgtname, comment, CM_SKIP);
-        LCONSOLE_INFO("%sing parameter %s.%s in log %s\n", rc ?
+        del = mgs_param_empty(ptr);
+
+        LCONSOLE_INFO("%sing parameter %s.%s in log %s\n", del ? "Disabl" : rc ?
                       "Sett" : "Modify", tgtname, comment, logname);
+        if (del)
+                return rc;
 
         lustre_cfg_bufs_reset(bufs, tgtname);
         lustre_cfg_bufs_set_string(bufs, 1, ptr);
@@ -1939,331 +2012,121 @@ static int mgs_wlp_lcfg(struct obd_device *obd, struct fs_db *fsdb,
         return rc;
 }
 
-/*
- * populate rules which applied to a target device
- */
-static int mgs_get_srpc_conf_log(struct fs_db *fsdb, const char *tgt,
-                                 enum lustre_sec_part from,
-                                 enum lustre_sec_part to,
-                                 struct sptlrpc_conf_log *log)
-{
-        struct mgs_tgt_srpc_conf *tgtconf;
-        struct sptlrpc_rule_set  *tgt_rset;
-        int                       found_tgt = 0, rc;
-
-        for (tgtconf = fsdb->fsdb_srpc_tgt; tgtconf;
-             tgtconf = tgtconf->mtsc_next) {
-                if (!strcmp(tgt, tgtconf->mtsc_tgt)) {
-                        found_tgt = 1;
-                        break;
-                }
-        }
-
-        if (found_tgt)
-                tgt_rset = &tgtconf->mtsc_rset;
-        else
-                tgt_rset = NULL;
-
-        rc = sptlrpc_conf_log_populate(&fsdb->fsdb_srpc_gen, tgt_rset,
-                                       from, to, fsdb->fsdb_srpc_fl_udesc, log);
-        if (rc)
-                CERROR("failed to populate srpc log for %s: %d\n", tgt, rc);
-
-        return rc;
-}
-
-struct mgs_msl_data {
-        struct obd_device      *mmd_obd;
-        struct fs_db           *mmd_fsdb;
-        struct mgs_target_info *mmd_mti;
-        int                     mmd_skip;
-        int                     mmd_attached;
-        int                     mmd_server;
-        enum lustre_sec_part    mmd_tgtpart;
-        char                    mmd_tgtname[MTI_NAME_MAXLEN];
-};
-
-static void mgs_msl_data_cleanup(struct mgs_msl_data *mmd)
-{
-        mmd->mmd_attached = 0;
-        mmd->mmd_tgtname[0] = '\0';
-}
-
-static int mgs_msl_tgt_uuid2name(char *tgtname, char *tgtuuid)
-{
-        char    *ptr;
-
-        if (tgtuuid == NULL) {
-                CERROR("missing target UUID???\n");
-                return -EINVAL;
-        }
-
-        ptr = strstr(tgtuuid, "_UUID");
-        if (ptr == NULL) {
-                CERROR("unrecognized UUID: %s\n", tgtuuid);
-                return -EINVAL;
-        }
-
-        *ptr = '\0';;
-        strncpy(tgtname, tgtuuid, MTI_NAME_MAXLEN);
-        tgtname[MTI_NAME_MAXLEN - 1] = '\0';
-
-        return 0;
-}
-
-static int mgs_modify_srpc_log_handler(struct llog_handle *llh,
-                                       struct llog_rec_hdr *rec,
-                                       void *data)
-{
-        struct mgs_msl_data *mmd = (struct mgs_msl_data *)data;
-        struct cfg_marker   *marker;
-        struct lustre_cfg   *lcfg = (struct lustre_cfg *)(rec + 1);
-        int                  cfg_len, rc;
-        ENTRY;
-
-        if (rec->lrh_type != OBD_CFG_REC) {
-                CERROR("unhandled lrh_type: %#x\n", rec->lrh_type);
-                RETURN(-EINVAL);
-        }
-
-        cfg_len = rec->lrh_len - sizeof(struct llog_rec_hdr) -
-                  sizeof(struct llog_rec_tail);
-
-        rc = lustre_cfg_sanity_check(lcfg, cfg_len);
-        if (rc) {
-                CERROR("Insane cfg\n");
-                RETURN(rc);
-        }
-
-        if (lcfg->lcfg_command == LCFG_MARKER) {
-                marker = lustre_cfg_buf(lcfg, 1);
-
-                if (marker->cm_flags & CM_START &&
-                    marker->cm_flags & CM_SKIP)
-                        mmd->mmd_skip = 1;
-                if (marker->cm_flags & CM_END)
-                        mmd->mmd_skip = 0;
-
-                RETURN(0);
-        }
-
-        if (mmd->mmd_skip)
-                RETURN(0);
-
-        switch (lcfg->lcfg_command) {
-        case LCFG_ATTACH:
-                mmd->mmd_attached = 1;
-
-                if (!strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_OST_NAME)) {
-                        mmd->mmd_server = 1;
-                        mmd->mmd_tgtpart = LUSTRE_SP_OST;
-                } else if (!strcmp(lustre_cfg_string(lcfg, 1),
-                                   LUSTRE_MDT_NAME)) {
-                        mmd->mmd_server = 1;
-                        mmd->mmd_tgtpart = LUSTRE_SP_MDT;
-                } else if (!strcmp(lustre_cfg_string(lcfg, 1),
-                                   LUSTRE_OSC_NAME)) {
-                        mmd->mmd_server = 0;
-                        mmd->mmd_tgtpart = LUSTRE_SP_OST;
-                } else if (!strcmp(lustre_cfg_string(lcfg, 1),
-                                   LUSTRE_MDC_NAME)) {
-                        mmd->mmd_server = 0;
-                        mmd->mmd_tgtpart = LUSTRE_SP_MDT;
-                } else {
-                        mmd->mmd_attached = 0;
-                }
-
-                if (mmd->mmd_attached && mmd->mmd_server) {
-                        rc = mgs_msl_tgt_uuid2name(mmd->mmd_tgtname,
-                                                   lustre_cfg_string(lcfg, 2));
-                        if (rc) {
-                                mgs_msl_data_cleanup(mmd);
-                                break;
-                        }
-                }
-
-                break;
-        case LCFG_SETUP:
-                if (!mmd->mmd_attached)
-                        break;
-
-                /* already got tgtname at LCFG_ATTACH */
-                if (mmd->mmd_server)
-                        break;
-
-                rc = mgs_msl_tgt_uuid2name(mmd->mmd_tgtname,
-                                           lustre_cfg_string(lcfg, 1));
-                if (rc) {
-                        mgs_msl_data_cleanup(mmd);
-                        break;
-                }
-
-                break;
-        case LCFG_SPTLRPC_CONF: {
-                struct sptlrpc_conf_log *log;
-                enum lustre_sec_part from;
-
-                if (!mmd->mmd_attached)
-                        break;
-
-                log = sptlrpc_conf_log_extract(lcfg);
-                if (log == NULL) {
-                        CERROR("missing sptlrpc config log???\n");
-                        mgs_msl_data_cleanup(mmd);
-                        break;
-                }
-
-                if (mmd->mmd_server)
-                        from = LUSTRE_SP_ANY;
-                else
-                        from = log->scl_part;
-
-                /* cleanup the old log */
-                sptlrpc_conf_log_cleanup(log);
-
-                /* populate new log */
-                rc = mgs_get_srpc_conf_log(mmd->mmd_fsdb, mmd->mmd_tgtname,
-                                           from, mmd->mmd_tgtpart, log);
-                if (rc) {
-                        mgs_msl_data_cleanup(mmd);
-                        break;
-                }
-
-                /* Overwrite the log */
-                rec->lrh_len = cfg_len;
-                rc = llog_write_rec(llh, rec, NULL, 0, (void *)lcfg,
-                                    rec->lrh_index);
-                if (rc)
-                        CERROR("overwrite sptlrpc conf log failed: %d\n", rc);
-
-                /* append new one */
-                rc = record_marker(mmd->mmd_obd, llh, mmd->mmd_fsdb, CM_START,
-                                   mmd->mmd_mti->mti_svname, "sptlrpc config");
-                rc = record_sptlrpc_conf(mmd->mmd_obd, llh,
-                                         lustre_cfg_string(lcfg, 0), log);
-                rc = record_marker(mmd->mmd_obd, llh, mmd->mmd_fsdb, CM_END,
-                                   mmd->mmd_mti->mti_svname, "sptlrpc config");
-
-                mgs_msl_data_cleanup(mmd);
-                break;
-        }
-        default:
-                /* ignore all others */
-                break;
-        }
-
-        RETURN(rc);
-}
-
-static int mgs_modify_srpc_log(struct obd_device *obd,
-                               struct fs_db *fsdb,
-                               struct mgs_target_info *mti,
-                               char *logname)
-{
-        struct llog_handle   *llh;
-        struct lvfs_run_ctxt  saved;
-        struct llog_ctxt     *ctxt;
-        struct mgs_msl_data  *mmd;
-        int rc, rc2;
-        ENTRY;
-
-        CDEBUG(D_MGS, "modify sptlrpc log for %s\n", logname);
-
-        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-
-        ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
-        LASSERT(ctxt != NULL);
-        rc = llog_create(ctxt, &llh, NULL, logname);
-        if (rc)
-                GOTO(out_pop, rc);
-
-        rc = llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL);
-        if (rc)
-                GOTO(out_close, rc);
-
-        if (llog_get_size(llh) <= 1)
-                GOTO(out_close, rc = 0);
-
-        OBD_ALLOC_PTR(mmd);
-        if (!mmd)
-                GOTO(out_close, rc = -ENOMEM);
-
-        mmd->mmd_obd = obd;
-        mmd->mmd_fsdb = fsdb;
-        mmd->mmd_mti = mti;
-
-        rc = llog_process(llh, mgs_modify_srpc_log_handler, (void *) mmd, NULL);
-
-        OBD_FREE_PTR(mmd);
-
-out_close:
-        rc2 = llog_close(llh);
-        if (!rc)
-                rc = rc2;
-
-out_pop:
-        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-        llog_ctxt_put(ctxt);
-
-        if (rc)
-                CERROR("modify sptlrpc log %s failed %d\n", logname, rc);
-        RETURN(rc);
-}
-
-/*
- * for each of log, remove old conf at first
- */
-static int mgs_modify_srpc_log_all(struct obd_device *obd,
-                                   struct fs_db *fsdb,
-                                   struct mgs_target_info *mti)
-{
-        char             tgt_index[9];
-        char            *logname;
-        int              i, rc = 0, rc2;
-        ENTRY;
-
-        for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
-                if (test_bit(i,  fsdb->fsdb_mdt_index_map)) {
-                        sprintf(tgt_index,"-MDT%04x",i);
-
-                        name_create(&logname, mti->mti_fsname, tgt_index);
-                        rc2 = mgs_modify(obd, fsdb, mti, logname,
-                                         mti->mti_fsname, "sptlrpc config",
-                                         CM_SKIP);
-                        rc2 = mgs_modify_srpc_log(obd, fsdb, mti, logname);
-                        name_destroy(&logname);
-
-                        if (rc2 && rc == 0)
-                                rc = rc2;
-                }
-        }
-
-        for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
-                if (test_bit(i,  fsdb->fsdb_ost_index_map)) {
-                        sprintf(tgt_index,"-OST%04x",i);
-
-                        name_create(&logname, mti->mti_fsname, tgt_index);
-                        rc2 = mgs_modify(obd, fsdb, mti, logname,
-                                         mti->mti_fsname, "sptlrpc config",
-                                         CM_SKIP);
-                        rc2 = mgs_modify_srpc_log(obd, fsdb, mti, logname);
-                        name_destroy(&logname);
-
-                        if (rc2 && rc == 0)
-                                rc = rc2;
-                }
-        }
-
-        name_create(&logname, mti->mti_fsname, "-client");
-        rc2 = mgs_modify(obd, fsdb, mti, logname,
-                         mti->mti_fsname, "sptlrpc config", CM_SKIP);
-        rc2 = mgs_modify_srpc_log(obd, fsdb, mti, logname);
-        name_destroy(&logname);
-
-        if (rc2 && rc == 0)
-                rc = rc2;
-
-        RETURN(rc);
+/* 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, 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, 0);
+       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;
+}
+
+/* write quota settings into log */
+static int mgs_write_log_quota(struct obd_device *obd, struct fs_db *fsdb,
+                              struct mgs_target_info *mti, char *quota,
+                              char *ptr)
+{
+       struct lustre_cfg_bufs bufs;
+       struct lustre_cfg *lcfg;
+       char *tmp;
+       char sep;
+       int cmd = LCFG_PARAM;
+       int rc;
+
+       /* support only 'meta' and 'data' pools so far */
+       if (class_match_param(ptr, QUOTA_METAPOOL_NAME, &tmp) != 0 &&
+           class_match_param(ptr, QUOTA_DATAPOOL_NAME, &tmp) != 0) {
+               CERROR("parameter quota.%s isn't supported (only quota.mdt "
+                      "& quota.ost are)\n", ptr);
+               return -EINVAL;
+       }
+
+       if (*tmp == '\0') {
+               CDEBUG(D_MGS, "global '%s' removed\n", quota);
+       } else {
+               CDEBUG(D_MGS, "global '%s'\n", quota);
+
+               if (strchr(tmp, 'u') == NULL && strchr(tmp, 'g') == NULL &&
+                   strcmp(tmp, "none") != 0) {
+                       CERROR("enable option(%s) isn't supported\n", tmp);
+                       return -EINVAL;
+               }
+       }
+
+       lustre_cfg_bufs_reset(&bufs, NULL);
+       lustre_cfg_bufs_set_string(&bufs, 1, quota);
+       lcfg = lustre_cfg_new(cmd, &bufs);
+       /* truncate the comment to the parameter name */
+       ptr = tmp - 1;
+       sep = *ptr;
+       *ptr = '\0';
+
+       /* XXX we duplicated quota enable information in all server
+        *     config logs, it should be moved to a separate config
+        *     log once we cleanup the config log for global param. */
+       /* modify all servers */
+       rc = mgs_write_log_direct_all(obd, fsdb, mti,
+                                     *tmp == '\0' ? NULL : lcfg,
+                                     mti->mti_fsname, quota, 1);
+       *ptr = sep;
+       lustre_cfg_free(lcfg);
+       return rc;
 }
 
 static int mgs_srpc_set_param_disk(struct obd_device *obd,
@@ -2293,7 +2156,7 @@ static int mgs_srpc_set_param_disk(struct obd_device *obd,
         /* prepare lcfg */
         lustre_cfg_bufs_reset(&bufs, mti->mti_svname);
         lustre_cfg_bufs_set_string(&bufs, 1, param);
-        lcfg = lustre_cfg_new(0, &bufs);
+        lcfg = lustre_cfg_new(LCFG_SPTLRPC_CONF, &bufs);
         if (lcfg == NULL)
                 GOTO(out_comment, rc = -ENOMEM);
 
@@ -2346,10 +2209,10 @@ static int mgs_srpc_set_param_udesc_mem(struct fs_db *fsdb,
                 goto error_out;
 
         if (strcmp(ptr, "yes") == 0) {
-                fsdb->fsdb_srpc_fl_udesc = 1;
+                cfs_set_bit(FSDB_UDESC, &fsdb->fsdb_flags);
                 CWARN("Enable user descriptor shipping from client to MDT\n");
         } else if (strcmp(ptr, "no") == 0) {
-                fsdb->fsdb_srpc_fl_udesc = 0;
+                cfs_clear_bit(FSDB_UDESC, &fsdb->fsdb_flags);
                 CWARN("Disable user descriptor shipping from client to MDT\n");
         } else {
                 *(ptr - 1) = '=';
@@ -2392,6 +2255,15 @@ static int mgs_srpc_set_param_mem(struct fs_db *fsdb,
         if (rc)
                 RETURN(rc);
 
+        /* mgs rules implies must be mgc->mgs */
+        if (cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) {
+                if ((rule.sr_from != LUSTRE_SP_MGC &&
+                     rule.sr_from != LUSTRE_SP_ANY) ||
+                    (rule.sr_to != LUSTRE_SP_MGS &&
+                     rule.sr_to != LUSTRE_SP_ANY))
+                        RETURN(-EINVAL);
+        }
+
         /* preapre room for this coming rule. svcname format should be:
          * - fsname: general rule
          * - fsname-tgtname: target-specific rule
@@ -2433,15 +2305,7 @@ static int mgs_srpc_set_param_mem(struct fs_db *fsdb,
                 rset = &fsdb->fsdb_srpc_gen;
         }
 
-        /* limit the maximum number of rules, but allow deletion in any case */
-        if (rset->srs_nrule >= SPTLRPC_CONF_LOG_MAX / 2 &&
-            rule.sr_flvr.sf_rpc != SPTLRPC_FLVR_INVALID) {
-                CERROR("too many (%d) rules already for %s\n",
-                       rset->srs_nrule, svname);
-                RETURN(-E2BIG);
-        }
-
-        rc = sptlrpc_rule_set_merge(rset, &rule, 1);
+        rc = sptlrpc_rule_set_merge(rset, &rule);
 
         RETURN(rc);
 }
@@ -2451,10 +2315,13 @@ static int mgs_srpc_set_param(struct obd_device *obd,
                               struct mgs_target_info *mti,
                               char *param)
 {
-        char                    *copy;
-        int                      rc, copy_size;
+        char                   *copy;
+        int                     rc, copy_size;
         ENTRY;
 
+#ifndef HAVE_GSS
+        RETURN(-EINVAL);
+#endif
         /* keep a copy of original param, which could be destroied
          * during parsing */
         copy_size = strlen(param) + 1;
@@ -2472,8 +2339,13 @@ static int mgs_srpc_set_param(struct obd_device *obd,
         if (rc)
                 goto out_free;
 
-        /* now apply the new rules to all existing config logs */
-        rc = mgs_modify_srpc_log_all(obd, fsdb, mti);
+        if (cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) {
+                /*
+                 * for mgs rules, make them effective immediately.
+                 */
+                LASSERT(fsdb->fsdb_srpc_tgt == NULL);
+                sptlrpc_target_update_exp_flavor(obd, &fsdb->fsdb_srpc_gen);
+        }
 
 out_free:
         OBD_FREE(copy, copy_size);
@@ -2485,11 +2357,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;
@@ -2525,7 +2397,7 @@ static int mgs_srpc_read_handler(struct llog_handle *llh,
         if (msrd->msrd_skip)
                 RETURN(0);
 
-        if (lcfg->lcfg_command != 0) {
+        if (lcfg->lcfg_command != LCFG_SPTLRPC_CONF) {
                 CERROR("invalid command (%x)\n", lcfg->lcfg_command);
                 RETURN(0);
         }
@@ -2549,8 +2421,8 @@ static int mgs_srpc_read_handler(struct llog_handle *llh,
         RETURN(0);
 }
 
-static int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd,
-                                       struct fs_db *fsdb)
+int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd,
+                                struct fs_db *fsdb)
 {
         struct llog_handle        *llh = NULL;
         struct lvfs_run_ctxt       saved;
@@ -2560,24 +2432,24 @@ static int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd,
         int                        rc;
         ENTRY;
 
-        ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
-        LASSERT(ctxt != NULL);
-
         /* construct log name */
         rc = name_create(&logname, fsdb->fsdb_name, "-sptlrpc");
         if (rc)
                 RETURN(rc);
 
+        ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
+        LASSERT(ctxt != NULL);
+
         if (mgs_log_is_empty(obd, logname))
                 GOTO(out, rc = 0);
 
         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);
 
@@ -2587,298 +2459,302 @@ static 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:
-        name_destroy(&logname);
         llog_ctxt_put(ctxt);
+        name_destroy(&logname);
 
         if (rc)
                 CERROR("failed to read sptlrpc config database: %d\n", rc);
         RETURN(rc);
 }
 
-static int mgs_write_log_params(struct obd_device *obd, struct fs_db *fsdb,
-                                struct mgs_target_info *mti)
+/* 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.
+ */
+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;
-        struct lustre_cfg *lcfg;
         char *logname;
-        char *ptr = mti->mti_params;
-        char *endptr, *tmp;
-        int rc = 0;
+        char *tmp;
+        int rc = 0, rc2 = 0;
         ENTRY;
 
-        if (!mti->mti_params)
-                RETURN(0);
-
         /* For various parameter settings, we have to figure out which logs
            care about them (e.g. both mdt and client for lov settings) */
-        while (ptr) {
-                while (*ptr == ' ')
-                        ptr++;
-                if (*ptr == '\0')
-                        break;
-                endptr = strchr(ptr, ' ');
-                if (endptr)
-                        *endptr = '\0';
-                CDEBUG(D_MGS, "next param '%s'\n", ptr);
-
-                /* The params are stored in MOUNT_DATA_FILE and modified
-                   via tunefs.lustre, or set using lctl conf_param */
-
-                /* Processed in lustre_start_mgc */
-                if (class_match_param(ptr, PARAM_MGSNODE, NULL) == 0)
-                        GOTO(end_while, rc);
-
-                /* Processed in mgs_write_log_ost */
-                if (class_match_param(ptr, PARAM_FAILMODE, NULL) == 0) {
-                        if (mti->mti_flags & LDD_F_PARAM) {
-                                LCONSOLE_ERROR_MSG(0x169, "%s can only be "
-                                                   "changed with tunefs.lustre"
-                                                   "and --writeconf\n", ptr);
-                                rc = -EPERM;
-                        }
-                        GOTO(end_while, rc);
+        CDEBUG(D_MGS, "next param '%s'\n", ptr);
+
+        /* The params are stored in MOUNT_DATA_FILE and modified via
+           tunefs.lustre, or set using lctl conf_param */
+
+        /* Processed in lustre_start_mgc */
+        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) {
+                        LCONSOLE_ERROR_MSG(0x169, "%s can only be "
+                                           "changed with tunefs.lustre"
+                                           "and --writeconf\n", ptr);
+                        rc = -EPERM;
                 }
+                GOTO(end, rc);
+        }
 
-                if (class_match_param(ptr, PARAM_SRPC, NULL) == 0) {
-                        rc = mgs_srpc_set_param(obd, fsdb, mti, ptr);
-                        GOTO(end_while, rc);
-                }
+        if (class_match_param(ptr, PARAM_SRPC, NULL) == 0) {
+                rc = mgs_srpc_set_param(obd, fsdb, mti, ptr);
+                GOTO(end, rc);
+        }
 
-                if (class_match_param(ptr, PARAM_FAILNODE, NULL) == 0) {
-                        /* Add a failover nidlist */
-                        rc = 0;
-                        /* We already processed failovers params for new
-                           targets in mgs_write_log_target */
-                        if (mti->mti_flags & LDD_F_PARAM) {
-                                CDEBUG(D_MGS, "Adding failnode\n");
-                                rc = mgs_write_log_add_failnid(obd, fsdb, mti);
-                        }
-                        GOTO(end_while, rc);
+        if (class_match_param(ptr, PARAM_FAILNODE, NULL) == 0) {
+                /* Add a failover nidlist */
+                rc = 0;
+                /* We already processed failovers params for new
+                   targets in mgs_write_log_target */
+                if (mti->mti_flags & LDD_F_PARAM) {
+                        CDEBUG(D_MGS, "Adding failnode\n");
+                        rc = mgs_write_log_add_failnid(obd, fsdb, mti);
                 }
+                GOTO(end, rc);
+        }
 
-                if (class_match_param(ptr, PARAM_SYS_TIMEOUT, &tmp) == 0) {
-                        /* Change obd timeout */
-                        int timeout;
-                        timeout = simple_strtoul(tmp, NULL, 0);
-
-                        CDEBUG(D_MGS, "obd timeout %d\n", timeout);
-                        lustre_cfg_bufs_reset(&bufs, NULL);
-                        lcfg = lustre_cfg_new(LCFG_SET_TIMEOUT, &bufs);
-                        lcfg->lcfg_num = timeout;
-                        /* modify all servers and clients */
-                        rc = mgs_write_log_direct_all(obd, fsdb, mti, lcfg,
-                                                      mti->mti_fsname,
-                                                      "timeout");
-                        lustre_cfg_free(lcfg);
-                        GOTO(end_while, rc);
-                }
+        if (class_match_param(ptr, PARAM_SYS, &tmp) == 0) {
+                rc = mgs_write_log_sys(obd, fsdb, mti, ptr, tmp);
+                GOTO(end, rc);
+        }
 
-                if (class_match_param(ptr, PARAM_OSC""PARAM_ACTIVE, &tmp) == 0) {
-                        /* active=0 means off, anything else means on */
-                        char mdt_index[16];
-                        int flag = (*tmp == '0') ? CM_EXCLUDE : 0;
-                        int i;
+       if (class_match_param(ptr, PARAM_QUOTA, &tmp) == 0) {
+               rc = mgs_write_log_quota(obd, fsdb, mti, ptr, tmp);
+               GOTO(end, rc);
+       }
 
-                        if (!(mti->mti_flags & LDD_F_SV_TYPE_OST)) {
-                                LCONSOLE_ERROR_MSG(0x144, "%s: Only OSCs can "
-                                                   "be (de)activated.\n",
-                                                   mti->mti_svname);
-                                rc = -EINVAL;
-                                goto end_while;
-                        }
-                        LCONSOLE_WARN("Permanently %sactivating %s\n",
-                                      flag ? "de": "re", mti->mti_svname);
-                        /* Modify clilov */
-                        name_create(&logname, mti->mti_fsname, "-client");
+        if (class_match_param(ptr, PARAM_OSC""PARAM_ACTIVE, &tmp) == 0) {
+                /* active=0 means off, anything else means on */
+                int flag = (*tmp == '0') ? CM_EXCLUDE : 0;
+                int i;
+
+                if (!(mti->mti_flags & LDD_F_SV_TYPE_OST)) {
+                        LCONSOLE_ERROR_MSG(0x144, "%s: Only OSCs can "
+                                           "be (de)activated.\n",
+                                           mti->mti_svname);
+                        GOTO(end, rc = -EINVAL);
+                }
+                LCONSOLE_WARN("Permanently %sactivating %s\n",
+                              flag ? "de": "re", mti->mti_svname);
+                /* Modify clilov */
+                name_create(&logname, mti->mti_fsname, "-client");
+                rc = mgs_modify(obd, fsdb, mti, logname,
+                                mti->mti_svname, "add osc", flag);
+                name_destroy(&logname);
+                if (rc)
+                        goto active_err;
+                /* Modify mdtlov */
+                /* Add to all MDT logs for CMD */
+                for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+                        if (!cfs_test_bit(i, fsdb->fsdb_mdt_index_map))
+                                continue;
+                        name_create_mdt(&logname, mti->mti_fsname, i);
                         rc = mgs_modify(obd, fsdb, mti, logname,
                                         mti->mti_svname, "add osc", flag);
                         name_destroy(&logname);
                         if (rc)
                                 goto active_err;
-                        /* Modify mdtlov */
-                        /* FIXME add to all MDT logs for CMD */
-                        for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
-                                if (!test_bit(i, fsdb->fsdb_mdt_index_map))
-                                        continue;
-                                sprintf(mdt_index,"-MDT%04x", i);
-                                name_create(&logname, mti->mti_fsname, mdt_index);
-                                rc = mgs_modify(obd, fsdb, mti, logname,
-                                                mti->mti_svname, "add osc", flag);
-                                name_destroy(&logname);
-                                if (rc)
-                                        goto active_err;
-                        }
-active_err:
-                        if (rc) {
-                                LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in"
-                                                   "log (%d). No permanent "
-                                                   "changes were made to the "
-                                                   "config log.\n",
-                                                   mti->mti_svname, rc);
-                                if (fsdb->fsdb_flags & FSDB_OLDLOG14)
-                                        LCONSOLE_ERROR_MSG(0x146, "This may be"
-                                                           " because the log "
-                                                           "is in the old 1.4"
-                                                           "style. Consider "
-                                                           " --writeconf to "
-                                                           "update the logs.\n");
-                                goto end_while;
-                        }
-                        /* Fall through to osc proc for deactivating
-                           live OSC on running MDT / clients. */
                 }
-                /* Below here, let obd's XXX_process_config methods handle it */
-
-                /* All lov. in proc */
-                if (class_match_param(ptr, PARAM_LOV, NULL) == 0) {
-                        char mdt_index[16];
-                        char *mdtlovname;
-
-                        CDEBUG(D_MGS, "lov param %s\n", ptr);
-                        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",
-                                                   mti->mti_svname);
-                                rc = 0;
-                                goto end_while;
-                        }
-
-                        /* Modify mdtlov */
-                        if (mgs_log_is_empty(obd, mti->mti_svname))
-                                GOTO(end_while, rc = -ENODEV);
+        active_err:
+                if (rc) {
+                        LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in"
+                                           "log (%d). No permanent "
+                                           "changes were made to the "
+                                           "config log.\n",
+                                           mti->mti_svname, rc);
+                        if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags))
+                                LCONSOLE_ERROR_MSG(0x146, "This may be"
+                                                   " because the log"
+                                                   "is in the old 1.4"
+                                                   "style. Consider "
+                                                   " --writeconf to "
+                                                   "update the logs.\n");
+                        GOTO(end, rc);
+                }
+                /* Fall through to osc proc for deactivating live OSC
+                   on running MDT / clients. */
+        }
+        /* Below here, let obd's XXX_process_config methods handle it */
 
-                        sprintf(mdt_index,"-MDT%04x", mti->mti_stripe_index);
-                        name_create(&logname, mti->mti_fsname, mdt_index);
-                        name_create(&mdtlovname, logname, "-mdtlov");
-                        rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname,
-                                          &bufs, mdtlovname, ptr);
-                        name_destroy(&logname);
-                        name_destroy(&mdtlovname);
-                        if (rc)
-                                GOTO(end_while, rc);
+        /* All lov. in proc */
+        if (class_match_param(ptr, PARAM_LOV, NULL) == 0) {
+                char *mdtlovname;
 
-                        /* Modify clilov */
-                        name_create(&logname, mti->mti_fsname, "-client");
-                        rc = mgs_wlp_lcfg(obd, fsdb, mti, logname, &bufs,
-                                          fsdb->fsdb_clilov, ptr);
-                        name_destroy(&logname);
-                        GOTO(end_while, rc);
+                CDEBUG(D_MGS, "lov param %s\n", ptr);
+                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",
+                                           mti->mti_svname);
+                        GOTO(end, rc = 0);
                 }
 
-                /* All osc., mdc., llite. params in proc */
-                if ((class_match_param(ptr, PARAM_OSC, NULL) == 0) ||
-                    (class_match_param(ptr, PARAM_MDC, NULL) == 0) ||
-                    (class_match_param(ptr, PARAM_LLITE, NULL) == 0)) {
-                        char *cname;
-                        if (memcmp(ptr, PARAM_LLITE, strlen(PARAM_LLITE)) == 0) {
-                                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 & 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 & LDD_F_SV_TYPE_OST) {
-                                /* COMPAT_146 */
-                                if (fsdb->fsdb_flags & FSDB_OLDLOG14) {
-                                        LCONSOLE_ERROR_MSG(0x148, "Upgraded "
-                                                           "client logs for %s"
-                                                           " cannot be "
-                                                           "modified. Consider"
-                                                           " updating the "
-                                                           "configuration with"
-                                                           " --writeconf\n",
-                                                           mti->mti_svname);
-                                        /* We don't know the names of all the
-                                           old oscs*/
-                                        rc = -EINVAL;
-                                        goto end_while;
-                                }
-                                name_create(&cname, mti->mti_svname, "-osc");
-                        } else {
-                                rc = -EINVAL;
-                                goto end_while;
-                        }
+                /* Modify mdtlov */
+                if (mgs_log_is_empty(obd, mti->mti_svname))
+                        GOTO(end, rc = -ENODEV);
+
+                name_create_mdt_and_lov(&logname, &mdtlovname, fsdb,
+                                        mti->mti_stripe_index);
+                rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname,
+                                  &bufs, mdtlovname, ptr);
+                name_destroy(&logname);
+                name_destroy(&mdtlovname);
+                if (rc)
+                        GOTO(end, rc);
 
-                        CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
-
-                        /* Modify client */
-                        name_create(&logname, mti->mti_fsname, "-client");
-                        rc = mgs_wlp_lcfg(obd, fsdb, mti, logname, &bufs,
-                                          cname, ptr);
-
-                        /* osc params affect the MDT as well */
-                        if (!rc && (mti->mti_flags & LDD_F_SV_TYPE_OST)) {
-                                char mdt_index[16];
-                                int i;
-
-                                for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
-                                        if (!test_bit(i, fsdb->fsdb_mdt_index_map))
-                                                continue;
-                                        name_destroy(&cname);
-                                        sprintf(mdt_index, "-osc-MDT%04x", i);
-                                        name_create(&cname, mti->mti_svname,
-                                                    mdt_index);
-                                        name_destroy(&logname);
-                                        sprintf(mdt_index, "-MDT%04x", i);
-                                        name_create(&logname, mti->mti_fsname,
-                                                    mdt_index);
-                                        if (!mgs_log_is_empty(obd, logname))
-                                                rc = mgs_wlp_lcfg(obd, fsdb,
-                                                                  mti, logname,
-                                                                  &bufs, cname,
-                                                                  ptr);
-                                        if (rc)
-                                                break;
-                                }
+                /* Modify clilov */
+                name_create(&logname, mti->mti_fsname, "-client");
+                rc = mgs_wlp_lcfg(obd, fsdb, mti, logname, &bufs,
+                                  fsdb->fsdb_clilov, ptr);
+                name_destroy(&logname);
+                GOTO(end, rc);
+        }
+
+        /* All osc., mdc., llite. params in proc */
+        if ((class_match_param(ptr, PARAM_OSC, NULL) == 0) ||
+            (class_match_param(ptr, PARAM_MDC, NULL) == 0) ||
+            (class_match_param(ptr, PARAM_LLITE, NULL) == 0)) {
+                char *cname;
+                if (memcmp(ptr, PARAM_LLITE, strlen(PARAM_LLITE)) == 0) {
+                        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 & 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 & LDD_F_SV_TYPE_OST) {
+                        /* COMPAT_146 */
+                        if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) {
+                                LCONSOLE_ERROR_MSG(0x148, "Upgraded "
+                                                   "client logs for %s"
+                                                   " cannot be "
+                                                   "modified. Consider"
+                                                   " updating the "
+                                                   "configuration with"
+                                                   " --writeconf\n",
+                                                   mti->mti_svname);
+                                /* We don't know the names of all the
+                                   old oscs*/
+                                GOTO(end, rc = -EINVAL);
                         }
-                        name_destroy(&logname);
-                        name_destroy(&cname);
-                        GOTO(end_while, rc);
+                        name_create(&cname, mti->mti_svname, "-osc");
+                } else {
+                        GOTO(end, rc = -EINVAL);
                 }
 
-                /* All mdt., ost. params in proc */
-                if ((class_match_param(ptr, PARAM_MDT, NULL) == 0) ||
-                    (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);
-                        if (mgs_log_is_empty(obd, mti->mti_svname)) {
-                                rc = -ENODEV;
-                                goto end_while;
+                CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
+
+                /* Modify client */
+                name_create(&logname, mti->mti_fsname, "-client");
+                rc = mgs_wlp_lcfg(obd, fsdb, mti, logname, &bufs,
+                                  cname, ptr);
+
+                /* osc params affect the MDT as well */
+                if (!rc && (mti->mti_flags & LDD_F_SV_TYPE_OST)) {
+                        int i;
+
+                        for (i = 0; i < INDEX_MAP_SIZE * 8; i++){
+                                if (!cfs_test_bit(i, fsdb->fsdb_mdt_index_map))
+                                        continue;
+                                name_destroy(&cname);
+                                name_create_mdt_osc(&cname, mti->mti_svname,
+                                                    fsdb, i);
+                                name_destroy(&logname);
+                                name_create_mdt(&logname, mti->mti_fsname, i);
+                                if (!mgs_log_is_empty(obd, logname))
+                                        rc = mgs_wlp_lcfg(obd, fsdb,mti,logname,
+                                                          &bufs, cname, ptr);
+                                if (rc)
+                                        break;
                         }
-                        rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname,
-                                          &bufs, mti->mti_svname, ptr);
-                        GOTO(end_while, rc);
                 }
+                name_destroy(&logname);
+                name_destroy(&cname);
+                GOTO(end, rc);
+        }
 
-                LCONSOLE_WARN("Ignoring unrecognized param '%s'\n", ptr);
+        /* All mdt. params in proc */
+        if (class_match_param(ptr, PARAM_MDT, NULL) == 0) {
+                int i;
+                __u32 idx;
 
-end_while:
-                if (rc) {
-                        CERROR("err %d on param '%s\n", rc, ptr);
-                        break;
+                CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4);
+                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);
+        }
 
-                if (!endptr)
-                        /* last param */
-                        break;
+        /* 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);
+                if (mgs_log_is_empty(obd, mti->mti_svname))
+                        GOTO(end, rc = -ENODEV);
 
-                *endptr = ' ';
-                ptr = endptr + 1;
+                rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname,
+                                  &bufs, mti->mti_svname, ptr);
+                GOTO(end, rc);
         }
 
-        RETURN(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 ?: rc2);
 }
 
 /* Not implementing automatic failover nid addition at this time. */
@@ -2903,9 +2779,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(). */
 
-        down(&fsdb->fsdb_sem);
+        cfs_mutex_lock(&fsdb->fsdb_mutex);
         rc = mgs_write_log_add_failnid(obd, fsdb, mti);
-        up(&fsdb->fsdb_sem);
+        cfs_mutex_unlock(&fsdb->fsdb_mutex);
 
         RETURN(rc);
 #endif
@@ -2913,10 +2789,11 @@ int mgs_check_failnid(struct obd_device *obd, struct mgs_target_info *mti)
 }
 
 int mgs_write_log_target(struct obd_device *obd,
-                         struct mgs_target_info *mti)
+                         struct mgs_target_info *mti,
+                         struct fs_db *fsdb)
 {
-        struct fs_db *fsdb;
         int rc = -EINVAL;
+        char *buf, *params;
         ENTRY;
 
         /* set/check the new target index */
@@ -2959,13 +2836,7 @@ int mgs_write_log_target(struct obd_device *obd,
                 }
         }
 
-        rc = mgs_find_or_make_fsdb(obd, mti->mti_fsname, &fsdb);
-        if (rc) {
-                CERROR("Can't get db for %s\n", mti->mti_fsname);
-                RETURN(rc);
-        }
-
-        down(&fsdb->fsdb_sem);
+        cfs_mutex_lock(&fsdb->fsdb_mutex);
 
         if (mti->mti_flags &
             (LDD_F_VIRGIN | LDD_F_UPGRADE14 | LDD_F_WRITECONF)) {
@@ -2989,18 +2860,40 @@ int mgs_write_log_target(struct obd_device *obd,
                 mti->mti_flags |= LDD_F_PARAM;
         }
 
-        rc = mgs_write_log_params(obd, fsdb, mti);
+        /* allocate temporary buffer, where class_get_next_param will
+           make copy of a current  parameter */
+        OBD_ALLOC(buf, strlen(mti->mti_params) + 1);
+        if (buf == NULL)
+                GOTO(out_up, rc = -ENOMEM);
+        params = mti->mti_params;
+        while (params != NULL) {
+                rc = class_get_next_param(&params, buf);
+                if (rc) {
+                        if (rc == 1)
+                                /* there is no next parameter, that is
+                                   not an error */
+                                rc = 0;
+                        break;
+                }
+                CDEBUG(D_MGS, "remaining string: '%s', param: '%s'\n",
+                       params, buf);
+                rc = mgs_write_log_param(obd, fsdb, mti, buf);
+                if (rc)
+                        break;
+        }
+
+        OBD_FREE(buf, strlen(mti->mti_params) + 1);
 
 out_up:
-        up(&fsdb->fsdb_sem);
+        cfs_mutex_unlock(&fsdb->fsdb_mutex);
         RETURN(rc);
 }
 
 /* COMPAT_146 */
 /* verify that we can handle the old config logs */
-int mgs_upgrade_sv_14(struct obd_device *obd, struct mgs_target_info *mti)
+int mgs_upgrade_sv_14(struct obd_device *obd, struct mgs_target_info *mti,
+                      struct fs_db *fsdb)
 {
-        struct fs_db *fsdb;
         int rc = 0;
         ENTRY;
 
@@ -3019,11 +2912,7 @@ int mgs_upgrade_sv_14(struct obd_device *obd, struct mgs_target_info *mti)
         LCONSOLE_INFO("upgrading server %s from pre-1.6\n", mti->mti_svname);
         server_mti_print("upgrade", mti);
 
-        rc = mgs_find_or_make_fsdb(obd, mti->mti_fsname, &fsdb);
-        if (rc)
-                RETURN(rc);
-
-        if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) {
+        if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) {
                 LCONSOLE_ERROR_MSG(0x14a, "The old client log %s-client is "
                                    "missing.  Was tunefs.lustre successful?\n",
                                    mti->mti_fsname);
@@ -3056,7 +2945,7 @@ int mgs_upgrade_sv_14(struct obd_device *obd, struct mgs_target_info *mti)
                 }
         }
 
-        if (!(fsdb->fsdb_flags & FSDB_OLDLOG14)) {
+        if (!cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) {
                 LCONSOLE_ERROR_MSG(0x14c, "%s-client is supposedly an old "
                                    "log, but no old LOV or MDT was found. "
                                    "Consider updating the configuration with"
@@ -3078,10 +2967,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);
@@ -3097,10 +2986,11 @@ 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 list_head dentry_list;
+        struct fs_db *fsdb;
+        cfs_list_t dentry_list;
         struct l_linux_dirent *dirent, *n;
         int rc, len = strlen(fsname);
+        char *suffix;
         ENTRY;
 
         /* Find all the logs in the CONFIGS directory */
@@ -3111,23 +3001,28 @@ int mgs_erase_logs(struct obd_device *obd, char *fsname)
                 RETURN(rc);
         }
 
-        down(&mgs->mgs_sem);
+        cfs_mutex_lock(&mgs->mgs_mutex);
 
         /* Delete the fs db */
         fsdb = mgs_find_fsdb(obd, fsname);
         if (fsdb)
                 mgs_free_fsdb(obd, fsdb);
 
-        list_for_each_entry_safe(dirent, n, &dentry_list, lld_list) {
-                list_del(&dirent->lld_list);
-                if (strncmp(fsname, dirent->lld_name, len) == 0) {
-                        CDEBUG(D_MGS, "Removing log %s\n", dirent->lld_name);
-                        mgs_erase_log(obd, dirent->lld_name);
+        cfs_list_for_each_entry_safe(dirent, n, &dentry_list, lld_list) {
+                cfs_list_del(&dirent->lld_list);
+                suffix = strrchr(dirent->lld_name, '-');
+                if (suffix != NULL) {
+                        if ((len == suffix - dirent->lld_name) &&
+                            (strncmp(fsname, dirent->lld_name, len) == 0)) {
+                                CDEBUG(D_MGS, "Removing log %s\n",
+                                       dirent->lld_name);
+                                mgs_erase_log(obd, dirent->lld_name);
+                        }
                 }
                 OBD_FREE(dirent, sizeof(*dirent));
         }
 
-        up(&mgs->mgs_sem);
+        cfs_mutex_unlock(&mgs->mgs_mutex);
 
         RETURN(rc);
 }
@@ -3156,7 +3051,10 @@ static void print_lustre_cfg(struct lustre_cfg *lcfg)
         EXIT;
 }
 
-/* Set a permanent (config log) param for a target or fs */
+/* Set a permanent (config log) param for a target or fs
+ * \param lcfg buf0 may contain the device (testfs-MDT0000) name
+ *             buf1 contains the single parameter
+ */
 int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname)
 {
         struct fs_db *fsdb;
@@ -3191,18 +3089,23 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname)
         ptr = strrchr(devname, '-');
         memset(fsname, 0, MTI_NAME_MAXLEN);
         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);
+
                 strncpy(fsname, devname, ptr - devname);
         } else {
                 /* assume devname is the fsname */
                 strncpy(fsname, devname, MTI_NAME_MAXLEN);
         }
         fsname[MTI_NAME_MAXLEN - 1] = 0;
-        CDEBUG(D_MGS, "setparam on fs %s device %s\n", fsname, devname);
+        CDEBUG(D_MGS, "setparam fs='%s' device='%s'\n", fsname, devname);
 
         rc = mgs_find_or_make_fsdb(obd, fsname, &fsdb);
         if (rc)
                 RETURN(rc);
-        if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) {
+        if (!cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags) &&
+            cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) {
                 CERROR("No filesystem targets for %s.  cfg_device from lctl "
                        "is '%s'\n", fsname, devname);
                 mgs_free_fsdb(obd, fsdb);
@@ -3228,10 +3131,17 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname)
 
         mti->mti_flags = rc | LDD_F_PARAM;
 
-        down(&fsdb->fsdb_sem);
-        rc = mgs_write_log_params(obd, fsdb, mti);
-        up(&fsdb->fsdb_sem);
+        cfs_mutex_lock(&fsdb->fsdb_mutex);
+        rc = mgs_write_log_param(obd, fsdb, mti, mti->mti_params);
+        cfs_mutex_unlock(&fsdb->fsdb_mutex);
 
+        /*
+         * Revoke lock so everyone updates.  Should be alright if
+         * someone was already reading while we were updating the logs,
+         * so we don't really need to hold the lock while we're
+         * writing (above).
+         */
+        mgs_revoke_lock(obd, fsdb, CONFIG_T_CONFIG);
 out:
         OBD_FREE_PTR(mti);
         RETURN(rc);
@@ -3261,7 +3171,6 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd,
                  char *fsname, char *poolname, char *ostname)
 {
         struct fs_db *fsdb;
-        char mdt_index[16];
         char *lovname;
         char *logname;
         char *label = NULL, *canceled_label = NULL;
@@ -3275,7 +3184,7 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd,
                 CERROR("Can't get db for %s\n", fsname);
                 RETURN(rc);
         }
-        if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) {
+        if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) {
                 CERROR("%s is not defined\n", fsname);
                 mgs_free_fsdb(obd, fsdb);
                 RETURN(-EINVAL);
@@ -3334,7 +3243,7 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd,
         }
         }
 
-        down(&fsdb->fsdb_sem);
+        cfs_mutex_lock(&fsdb->fsdb_mutex);
 
         if (canceled_label != NULL) {
                 OBD_ALLOC_PTR(mti);
@@ -3342,12 +3251,10 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd,
                         GOTO(out, rc = -ENOMEM);
         }
 
-        /* loop on all potential MDT */
+        /* write pool def to all MDT logs */
         for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
-                 if (test_bit(i,  fsdb->fsdb_mdt_index_map)) {
-                        sprintf(mdt_index, "-MDT%04x", i);
-                        name_create(&logname, fsname, mdt_index);
-                        name_create(&lovname, logname, "-mdtlov");
+                 if (cfs_test_bit(i,  fsdb->fsdb_mdt_index_map)) {
+                        name_create_mdt_and_lov(&logname, &lovname, fsdb, i);
 
                         if (canceled_label != NULL) {
                                 strcpy(mti->mti_svname, "lov pool");
@@ -3372,7 +3279,9 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd,
                            cmd, fsname, poolname, ostname, label);
         name_destroy(&logname);
 
-        up(&fsdb->fsdb_sem);
+        cfs_mutex_unlock(&fsdb->fsdb_mutex);
+        /* request for update */
+        mgs_revoke_lock(obd, fsdb, CONFIG_T_CONFIG);
 
         EXIT;
 out: