Whamcloud - gitweb
LU-2988 mgs: Fix two "lctl replace_nids" resource leaks
[fs/lustre-release.git] / lustre / mgs / mgs_llog.c
index 911edb2..106b6d2 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, Whamcloud, Inc.
+ * Copyright (c) 2011, 2012, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -548,11 +548,6 @@ static int mgs_set_index(const struct lu_env *env,
                 imap = fsdb->fsdb_ost_index_map;
         } else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
                 imap = fsdb->fsdb_mdt_index_map;
-                if (fsdb->fsdb_mdt_count >= MAX_MDT_COUNT) {
-                        LCONSOLE_ERROR_MSG(0x13f, "The max mdt count"
-                                           "is %d\n", (int)MAX_MDT_COUNT);
-                       GOTO(out_up, rc = -ERANGE);
-                }
         } else {
                GOTO(out_up, rc = -EINVAL);
         }
@@ -616,9 +611,8 @@ static int mgs_modify_handler(const struct lu_env *env,
 {
        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) -
-                sizeof(struct llog_rec_tail);
+       struct lustre_cfg *lcfg = REC_DATA(rec);
+       int cfg_len = REC_DATA_LEN(rec);
         int rc;
         ENTRY;
 
@@ -725,7 +719,66 @@ out_pop:
         RETURN(rc);
 }
 
-/******************** config log recording functions *********************/
+/** This structure is passed to mgs_replace_handler */
+struct mgs_replace_uuid_lookup {
+       /* Nids are replaced for this target device */
+       struct mgs_target_info target;
+       /* Temporary modified llog */
+       struct llog_handle *temp_llh;
+       /* Flag is set if in target block*/
+       int in_target_device;
+       /* Nids already added. Just skip (multiple nids) */
+       int device_nids_added;
+       /* Flag is set if this block should not be copied */
+       int skip_it;
+};
+
+/**
+ * Check: a) if block should be skipped
+ * b) is it target block
+ *
+ * \param[in] lcfg
+ * \param[in] mrul
+ *
+ * \retval 0 should not to be skipped
+ * \retval 1 should to be skipped
+ */
+static int check_markers(struct lustre_cfg *lcfg,
+                        struct mgs_replace_uuid_lookup *mrul)
+{
+        struct cfg_marker *marker;
+
+       /* Track markers. Find given device */
+       if (lcfg->lcfg_command == LCFG_MARKER) {
+               marker = lustre_cfg_buf(lcfg, 1);
+               /* Clean llog from records marked as CM_EXCLUDE.
+                  CM_SKIP records are used for "active" command
+                  and can be restored if needed */
+               if ((marker->cm_flags & (CM_EXCLUDE | CM_START)) ==
+                   (CM_EXCLUDE | CM_START)) {
+                       mrul->skip_it = 1;
+                       return 1;
+               }
+
+               if ((marker->cm_flags & (CM_EXCLUDE | CM_END)) ==
+                   (CM_EXCLUDE | CM_END)) {
+                       mrul->skip_it = 0;
+                       return 1;
+               }
+
+               if (strcmp(mrul->target.mti_svname, marker->cm_tgtname) == 0) {
+                       LASSERT(!(marker->cm_flags & CM_START) ||
+                               !(marker->cm_flags & CM_END));
+                       if (marker->cm_flags & CM_START) {
+                               mrul->in_target_device = 1;
+                               mrul->device_nids_added = 0;
+                       } else if (marker->cm_flags & CM_END)
+                               mrul->in_target_device = 0;
+               }
+       }
+
+       return 0;
+}
 
 static int record_lcfg(const struct lu_env *env, struct llog_handle *llh,
                       struct lustre_cfg *lcfg)
@@ -787,13 +840,11 @@ static int record_base(const struct lu_env *env, struct llog_handle *llh,
        return rc;
 }
 
-
 static inline int record_add_uuid(const struct lu_env *env,
                                  struct llog_handle *llh,
                                  uint64_t nid, char *uuid)
 {
        return record_base(env, llh, NULL, nid, LCFG_ADD_UUID, uuid, 0, 0, 0);
-
 }
 
 static inline int record_add_conn(const struct lu_env *env,
@@ -817,6 +868,465 @@ static inline int record_setup(const struct lu_env *env,
        return record_base(env, llh, devname, 0, LCFG_SETUP, s1, s2, s3, s4);
 }
 
+/**
+ * \retval <0 record processing error
+ * \retval n record is processed. No need copy original one.
+ * \retval 0 record is not processed.
+ */
+static int process_command(const struct lu_env *env, struct lustre_cfg *lcfg,
+                          struct mgs_replace_uuid_lookup *mrul)
+{
+       int nids_added = 0;
+       lnet_nid_t nid;
+       char *ptr;
+       int rc;
+
+       if (lcfg->lcfg_command == LCFG_ADD_UUID) {
+               /* LCFG_ADD_UUID command found. Let's skip original command
+                  and add passed nids */
+               ptr = mrul->target.mti_params;
+               while (class_parse_nid(ptr, &nid, &ptr) == 0) {
+                       CDEBUG(D_MGS, "add nid %s with uuid %s, "
+                              "device %s\n", libcfs_nid2str(nid),
+                               mrul->target.mti_params,
+                               mrul->target.mti_svname);
+                       rc = record_add_uuid(env,
+                                            mrul->temp_llh, nid,
+                                            mrul->target.mti_params);
+                       if (!rc)
+                               nids_added++;
+               }
+
+               if (nids_added == 0) {
+                       CERROR("No new nids were added, nid %s with uuid %s, "
+                              "device %s\n", libcfs_nid2str(nid),
+                              mrul->target.mti_params,
+                              mrul->target.mti_svname);
+                       RETURN(-ENXIO);
+               } else {
+                       mrul->device_nids_added = 1;
+               }
+
+               return nids_added;
+       }
+
+       if (mrul->device_nids_added && lcfg->lcfg_command == LCFG_SETUP) {
+               /* LCFG_SETUP command found. UUID should be changed */
+               rc = record_setup(env,
+                                 mrul->temp_llh,
+                                 /* devname the same */
+                                 lustre_cfg_string(lcfg, 0),
+                                 /* s1 is not changed */
+                                 lustre_cfg_string(lcfg, 1),
+                                 /* new uuid should be
+                                 the full nidlist */
+                                 mrul->target.mti_params,
+                                 /* s3 is not changed */
+                                 lustre_cfg_string(lcfg, 3),
+                                 /* s4 is not changed */
+                                 lustre_cfg_string(lcfg, 4));
+               return rc ? rc : 1;
+       }
+
+       /* Another commands in target device block */
+       return 0;
+}
+
+/**
+ * Handler that called for every record in llog.
+ * Records are processed in order they placed in llog.
+ *
+ * \param[in] llh       log to be processed
+ * \param[in] rec       current record
+ * \param[in] data      mgs_replace_uuid_lookup structure
+ *
+ * \retval 0    success
+ */
+static int mgs_replace_handler(const struct lu_env *env,
+                              struct llog_handle *llh,
+                              struct llog_rec_hdr *rec,
+                              void *data)
+{
+       struct llog_rec_hdr local_rec = *rec;
+       struct mgs_replace_uuid_lookup *mrul;
+       struct lustre_cfg *lcfg = REC_DATA(rec);
+       int cfg_len = REC_DATA_LEN(rec);
+       int rc;
+       ENTRY;
+
+       mrul = (struct mgs_replace_uuid_lookup *)data;
+
+       if (rec->lrh_type != OBD_CFG_REC) {
+               CERROR("unhandled lrh_type: %#x, cmd %x %s %s\n",
+                      rec->lrh_type, lcfg->lcfg_command,
+                      lustre_cfg_string(lcfg, 0),
+                      lustre_cfg_string(lcfg, 1));
+               RETURN(-EINVAL);
+       }
+
+       rc = lustre_cfg_sanity_check(lcfg, cfg_len);
+       if (rc) {
+               /* Do not copy any invalidated records */
+               GOTO(skip_out, rc = 0);
+       }
+
+       rc = check_markers(lcfg, mrul);
+       if (rc || mrul->skip_it)
+               GOTO(skip_out, rc = 0);
+
+       /* Write to new log all commands outside target device block */
+       if (!mrul->in_target_device)
+               GOTO(copy_out, rc = 0);
+
+       /* Skip all other LCFG_ADD_UUID and LCFG_ADD_CONN records
+          (failover nids) for this target, assuming that if then
+          primary is changing then so is the failover */
+       if (mrul->device_nids_added &&
+           (lcfg->lcfg_command == LCFG_ADD_UUID ||
+            lcfg->lcfg_command == LCFG_ADD_CONN))
+               GOTO(skip_out, rc = 0);
+
+       rc = process_command(env, lcfg, mrul);
+       if (rc < 0)
+               RETURN(rc);
+
+       if (rc)
+               RETURN(0);
+copy_out:
+       /* Record is placed in temporary llog as is */
+       local_rec.lrh_len -= sizeof(*rec) + sizeof(struct llog_rec_tail);
+       rc = llog_write(env, mrul->temp_llh, &local_rec, NULL, 0,
+                        (void *)lcfg, -1);
+
+       CDEBUG(D_MGS, "Copied idx=%d, rc=%d, len=%d, cmd %x %s %s\n",
+              rec->lrh_index, rc, rec->lrh_len, lcfg->lcfg_command,
+              lustre_cfg_string(lcfg, 0), lustre_cfg_string(lcfg, 1));
+       RETURN(rc);
+
+skip_out:
+       CDEBUG(D_MGS, "Skipped idx=%d, rc=%d, len=%d, cmd %x %s %s\n",
+              rec->lrh_index, rc, rec->lrh_len, lcfg->lcfg_command,
+              lustre_cfg_string(lcfg, 0), lustre_cfg_string(lcfg, 1));
+       RETURN(rc);
+}
+
+static int mgs_backup_llog(const struct lu_env *env,
+                          struct obd_device *mgs,
+                          char *fsname, char *backup)
+{
+       struct obd_uuid *uuid;
+       struct llog_handle *orig_llh, *bak_llh;
+       struct llog_ctxt *lctxt;
+       int rc, rc2;
+       ENTRY;
+
+       lctxt = llog_get_context(mgs, LLOG_CONFIG_ORIG_CTXT);
+       if (!lctxt) {
+               CERROR("%s: missing llog context\n", mgs->obd_name);
+               GOTO(out, rc = -EINVAL);
+       }
+
+       /* Make sure there's no old backup log */
+       rc = llog_erase(env, lctxt, NULL, backup);
+       if (rc < 0 && rc != -ENOENT)
+               GOTO(out_put, rc);
+
+       /* open backup log */
+       rc = llog_open_create(env, lctxt, &bak_llh, NULL, backup);
+       if (rc) {
+               CERROR("%s: backup logfile open %s: rc = %d\n",
+                      mgs->obd_name, backup, rc);
+               GOTO(out_put, rc);
+       }
+
+       /* set the log header uuid */
+       OBD_ALLOC_PTR(uuid);
+       if (uuid == NULL)
+                GOTO(out_put, rc = -ENOMEM);
+       obd_str2uuid(uuid, backup);
+       rc = llog_init_handle(env, bak_llh, LLOG_F_IS_PLAIN, uuid);
+       OBD_FREE_PTR(uuid);
+       if (rc)
+               GOTO(out_close1, rc);
+
+       /* open original log */
+       rc = llog_open(env, lctxt, &orig_llh, NULL, fsname,
+                      LLOG_OPEN_EXISTS);
+       if (rc < 0) {
+               if (rc == -ENOENT)
+                       rc = 0;
+               GOTO(out_close1, rc);
+       }
+
+       rc = llog_init_handle(env, orig_llh, LLOG_F_IS_PLAIN, NULL);
+       if (rc)
+               GOTO(out_close2, rc);
+
+       /* Copy remote log */
+       rc = llog_process(env, orig_llh, llog_copy_handler,
+                         (void *)bak_llh, NULL);
+
+out_close2:
+       rc2 = llog_close(env, orig_llh);
+       if (!rc)
+               rc = rc2;
+out_close1:
+       rc2 = llog_close(env, bak_llh);
+        if (!rc)
+                rc = rc2;
+out_put:
+       if (lctxt)
+               llog_ctxt_put(lctxt);
+out:
+       if (rc)
+               CERROR("%s: Failed to backup log %s: rc = %d\n",
+                      mgs->obd_name, fsname, rc);
+       RETURN(rc);
+}
+
+static int mgs_log_is_empty(const struct lu_env *env, struct mgs_device *mgs,
+                           char *name);
+
+static int mgs_replace_nids_log(const struct lu_env *env,
+                               struct obd_device *mgs, struct fs_db *fsdb,
+                               char *logname, char *devname, char *nids)
+{
+       struct llog_handle *orig_llh, *backup_llh;
+       struct llog_ctxt *ctxt;
+       struct mgs_replace_uuid_lookup *mrul;
+       struct mgs_device *mgs_dev = lu2mgs_dev(mgs->obd_lu_dev);
+       char *backup;
+       int rc, rc2;
+       ENTRY;
+
+       CDEBUG(D_MGS, "Replace nids for %s in %s\n", devname, logname);
+
+       ctxt = llog_get_context(mgs, LLOG_CONFIG_ORIG_CTXT);
+       LASSERT(ctxt != NULL);
+
+       if (mgs_log_is_empty(env, mgs_dev, logname)) {
+               /* Log is empty. Nothing to replace */
+               GOTO(out_put, rc = 0);
+       }
+
+       OBD_ALLOC(backup, strlen(logname) + strlen(".bak") + 1);
+       if (backup == NULL)
+               GOTO(out_put, rc = -ENOMEM);
+
+       sprintf(backup, "%s.bak", logname);
+
+       rc = mgs_backup_llog(env, mgs, logname, backup);
+       if (rc < 0) {
+               CERROR("%s: can't make backup for %s: rc = %d\n",
+                      mgs->obd_name, logname, rc);
+               GOTO(out_free,rc);
+       }
+
+       /* Now erase original log file. Connections are not allowed.
+          Backup is already saved */
+       rc = llog_erase(env, ctxt, NULL, logname);
+       if (rc < 0 && rc != -ENOENT)
+               GOTO(out_free, rc);
+
+       /* open local log */
+       rc = llog_open_create(env, ctxt, &orig_llh, NULL, logname);
+       if (rc)
+               GOTO(out_restore, rc);
+
+       rc = llog_init_handle(env, orig_llh, LLOG_F_IS_PLAIN, NULL);
+       if (rc)
+               GOTO(out_closel, rc);
+
+       /* open backup llog */
+       rc = llog_open(env, ctxt, &backup_llh, NULL, backup,
+                      LLOG_OPEN_EXISTS);
+       if (rc)
+               GOTO(out_closel, rc);
+
+       rc = llog_init_handle(env, backup_llh, LLOG_F_IS_PLAIN, NULL);
+       if (rc)
+               GOTO(out_close, rc);
+
+       if (llog_get_size(backup_llh) <= 1)
+               GOTO(out_close, rc = 0);
+
+       OBD_ALLOC_PTR(mrul);
+       if (!mrul)
+               GOTO(out_close, rc = -ENOMEM);
+       /* devname is only needed information to replace UUID records */
+       strncpy(mrul->target.mti_svname, devname, MTI_NAME_MAXLEN);
+       /* parse nids later */
+       strncpy(mrul->target.mti_params, nids, MTI_PARAM_MAXLEN);
+       /* Copy records to this temporary llog */
+       mrul->temp_llh = orig_llh;
+
+       rc = llog_process(env, backup_llh, mgs_replace_handler,
+                         (void *)mrul, NULL);
+       OBD_FREE_PTR(mrul);
+out_close:
+       rc2 = llog_close(NULL, backup_llh);
+       if (!rc)
+               rc = rc2;
+out_closel:
+       rc2 = llog_close(NULL, orig_llh);
+       if (!rc)
+               rc = rc2;
+
+out_restore:
+       if (rc) {
+               CERROR("%s: llog should be restored: rc = %d\n",
+                      mgs->obd_name, rc);
+               rc2 = mgs_backup_llog(env, mgs, backup, logname);
+               if (rc2 < 0)
+                       CERROR("%s: can't restore backup %s: rc = %d\n",
+                              mgs->obd_name, logname, rc2);
+       }
+
+out_free:
+       OBD_FREE(backup, strlen(backup) + 1);
+
+out_put:
+       llog_ctxt_put(ctxt);
+
+       if (rc)
+               CERROR("%s: failed to replace nids in log %s: rc = %d\n",
+                      mgs->obd_name, logname, rc);
+
+       RETURN(rc);
+}
+
+/**
+ * Parse device name and get file system name and/or device index
+ *
+ * \param[in]   devname device name (ex. lustre-MDT0000)
+ * \param[out]  fsname  file system name(optional)
+ * \param[out]  index   device index(optional)
+ *
+ * \retval 0    success
+ */
+static int mgs_parse_devname(char *devname, char *fsname, __u32 *index)
+{
+       char *ptr;
+       ENTRY;
+
+       /* Extract fsname */
+       ptr = strrchr(devname, '-');
+
+       if (fsname) {
+               if (!ptr) {
+                       CDEBUG(D_MGS, "Device name %s without fsname\n",
+                              devname);
+                       RETURN(-EINVAL);
+               }
+               memset(fsname, 0, MTI_NAME_MAXLEN);
+               strncpy(fsname, devname, ptr - devname);
+               fsname[MTI_NAME_MAXLEN - 1] = 0;
+       }
+
+       if (index) {
+               if (server_name2index(ptr, index, NULL) < 0) {
+                       CDEBUG(D_MGS, "Device name with wrong index\n");
+                       RETURN(-EINVAL);
+               }
+       }
+
+       RETURN(0);
+}
+
+static int only_mgs_is_running(struct obd_device *mgs_obd)
+{
+       /* TDB: Is global variable with devices count exists? */
+       int num_devices = get_devices_count();
+       /* osd, MGS and MGC + self_export
+          (wc -l /proc/fs/lustre/devices <= 2) && (num_exports <= 2) */
+       return (num_devices <= 3) && (mgs_obd->obd_num_exports <= 2);
+}
+
+static int name_create_mdt(char **logname, char *fsname, int i)
+{
+       char mdt_index[9];
+
+       sprintf(mdt_index, "-MDT%04x", i);
+       return name_create(logname, fsname, mdt_index);
+}
+
+/**
+ * Replace nids for \a device to \a nids values
+ *
+ * \param obd           MGS obd device
+ * \param devname       nids need to be replaced for this device
+ * (ex. lustre-OST0000)
+ * \param nids          nids list (ex. nid1,nid2,nid3)
+ *
+ * \retval 0    success
+ */
+int mgs_replace_nids(const struct lu_env *env,
+                    struct mgs_device *mgs,
+                    char *devname, char *nids)
+{
+       /* Assume fsname is part of device name */
+       char fsname[MTI_NAME_MAXLEN];
+       int rc;
+       __u32 index;
+       char *logname;
+       struct fs_db *fsdb;
+       unsigned int i;
+       int conn_state;
+       struct obd_device *mgs_obd = mgs->mgs_obd;
+       ENTRY;
+
+       /* We can only change NIDs if no other nodes are connected */
+       spin_lock(&mgs_obd->obd_dev_lock);
+       conn_state = mgs_obd->obd_no_conn;
+       mgs_obd->obd_no_conn = 1;
+       spin_unlock(&mgs_obd->obd_dev_lock);
+
+       /* We can not change nids if not only MGS is started */
+       if (!only_mgs_is_running(mgs_obd)) {
+               CERROR("Only MGS is allowed to be started\n");
+               GOTO(out, rc = -EINPROGRESS);
+       }
+
+       /* Get fsname and index*/
+       rc = mgs_parse_devname(devname, fsname, &index);
+       if (rc)
+               GOTO(out, rc);
+
+       rc = mgs_find_or_make_fsdb(env, mgs, fsname, &fsdb);
+       if (rc) {
+               CERROR("%s: can't find fsdb: rc = %d\n", fsname, rc);
+               GOTO(out, rc);
+       }
+
+       /* Process client llogs */
+       name_create(&logname, fsname, "-client");
+       rc = mgs_replace_nids_log(env, mgs_obd, fsdb, logname, devname, nids);
+       name_destroy(&logname);
+       if (rc) {
+               CERROR("%s: error while replacing NIDs for %s: rc = %d\n",
+                      fsname, devname, rc);
+               GOTO(out, rc);
+       }
+
+       /* Process MDT llogs */
+       for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+               if (!test_bit(i, fsdb->fsdb_mdt_index_map))
+                       continue;
+               name_create_mdt(&logname, fsname, i);
+               rc = mgs_replace_nids_log(env, mgs_obd, fsdb, logname, devname, nids);
+               name_destroy(&logname);
+               if (rc)
+                       GOTO(out, rc);
+       }
+
+out:
+       spin_lock(&mgs_obd->obd_dev_lock);
+       mgs_obd->obd_no_conn = conn_state;
+       spin_unlock(&mgs_obd->obd_dev_lock);
+
+       RETURN(rc);
+}
+
 static int record_lov_setup(const struct lu_env *env, struct llog_handle *llh,
                            char *devname, struct lov_desc *desc)
 {
@@ -868,7 +1378,7 @@ static inline int record_lov_add(const struct lu_env *env,
                                  char *index, char *gen)
 {
        return record_base(env,llh,lov_name,0,LCFG_LOV_ADD_OBD,
-                           ost_uuid,index,gen,0);
+                          ost_uuid, index, gen, 0);
 }
 
 static inline int record_mount_opt(const struct lu_env *env,
@@ -888,16 +1398,21 @@ static int record_marker(const struct lu_env *env,
        struct mgs_thread_info *mgi = mgs_env_info(env);
        struct lustre_cfg *lcfg;
        int rc;
+       int cplen = 0;
 
        if (flags & CM_START)
                fsdb->fsdb_gen++;
        mgi->mgi_marker.cm_step = fsdb->fsdb_gen;
        mgi->mgi_marker.cm_flags = flags;
        mgi->mgi_marker.cm_vers = LUSTRE_VERSION_CODE;
-       strncpy(mgi->mgi_marker.cm_tgtname, tgtname,
-               sizeof(mgi->mgi_marker.cm_tgtname));
-       strncpy(mgi->mgi_marker.cm_comment, comment,
-               sizeof(mgi->mgi_marker.cm_comment));
+       cplen = strlcpy(mgi->mgi_marker.cm_tgtname, tgtname,
+                       sizeof(mgi->mgi_marker.cm_tgtname));
+       if (cplen >= sizeof(mgi->mgi_marker.cm_tgtname))
+               return -E2BIG;
+       cplen = strlcpy(mgi->mgi_marker.cm_comment, comment,
+                       sizeof(mgi->mgi_marker.cm_comment));
+       if (cplen >= sizeof(mgi->mgi_marker.cm_comment))
+               return -E2BIG;
        mgi->mgi_marker.cm_createtime = cfs_time_current_sec();
        mgi->mgi_marker.cm_canceltime = 0;
        lustre_cfg_bufs_reset(&mgi->mgi_bufs, NULL);
@@ -970,7 +1485,7 @@ static int mgs_log_is_empty(const struct lu_env *env,
                GOTO(out_ctxt, rc);
        }
 
-       llog_init_handle(env, llh, LLOG_F_IS_PLAIN, NULL);
+       rc = llog_init_handle(env, llh, LLOG_F_IS_PLAIN, NULL);
        if (rc)
                GOTO(out_close, rc);
        rc = llog_get_size(llh);
@@ -1092,16 +1607,16 @@ next:
         RETURN(rc);
 }
 
-static int mgs_write_log_mdc_to_mdt(const struct lu_env *env,
+static int mgs_write_log_osp_to_mdt(const struct lu_env *env,
                                    struct mgs_device *mgs,
                                    struct fs_db *fsdb,
                                    struct mgs_target_info *mti,
-                                   char *logname);
+                                   int index, char *logname);
 static int mgs_write_log_osc_to_lov(const struct lu_env *env,
                                    struct mgs_device *mgs,
                                    struct fs_db *fsdb,
                                     struct mgs_target_info *mti,
-                                    char *logname, char *suffix, char *lovname,
+                                   char *logname, char *suffix, char *lovname,
                                     enum lustre_sec_part sec_part, int flags);
 static int name_create_mdt_and_lov(char **logname, char **lovname,
                                   struct fs_db *fsdb, int i);
@@ -1124,9 +1639,13 @@ static int add_param(char *params, char *key, char *val)
        return 0;
 }
 
-static int mgs_steal_llog_handler(const struct lu_env *env,
-                                 struct llog_handle *llh,
-                                 struct llog_rec_hdr *rec, void *data)
+/**
+ * Walk through client config log record and convert the related records
+ * into the target.
+ **/
+static int mgs_steal_client_llog_handler(const struct lu_env *env,
+                                        struct llog_handle *llh,
+                                        struct llog_rec_hdr *rec, void *data)
 {
        struct mgs_device *mgs;
        struct obd_device *obd;
@@ -1143,6 +1662,7 @@ static int mgs_steal_llog_handler(const struct lu_env *env,
            2: found mdc;
         */
         static int last_step = -1;
+       int cplen = 0;
 
         ENTRY;
 
@@ -1166,55 +1686,63 @@ static int mgs_steal_llog_handler(const struct lu_env *env,
 
         lcfg = (struct lustre_cfg *)cfg_buf;
 
-        if (lcfg->lcfg_command == LCFG_MARKER) {
-                struct cfg_marker *marker;
-                marker = lustre_cfg_buf(lcfg, 1);
-                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));
+       if (lcfg->lcfg_command == LCFG_MARKER) {
+               struct cfg_marker *marker;
+               marker = lustre_cfg_buf(lcfg, 1);
+               if (!strncmp(marker->cm_comment, "add osc", 7) &&
+                   (marker->cm_flags & CM_START) &&
+                    !(marker->cm_flags & CM_SKIP)) {
+                       got_an_osc_or_mdc = 1;
+                       cplen = strlcpy(tmti->mti_svname, marker->cm_tgtname,
+                                       sizeof(tmti->mti_svname));
+                       if (cplen >= sizeof(tmti->mti_svname))
+                               RETURN(-E2BIG);
                        rc = record_start_log(env, mgs, &mdt_llh,
                                              mti->mti_svname);
                        if (rc)
                                RETURN(rc);
                        rc = record_marker(env, mdt_llh, fsdb, CM_START,
-                                           mti->mti_svname,"add osc(copied)");
+                                          mti->mti_svname, "add osc(copied)");
                        record_end_log(env, &mdt_llh);
-                        last_step = marker->cm_step;
-                        RETURN(rc);
-                }
-                if (!strncmp(marker->cm_comment,"add osc",7) &&
-                    (marker->cm_flags & CM_END)){
-                        LASSERT(last_step == marker->cm_step);
-                        last_step = -1;
-                        got_an_osc_or_mdc = 0;
+                       last_step = marker->cm_step;
+                       RETURN(rc);
+               }
+               if (!strncmp(marker->cm_comment, "add osc", 7) &&
+                   (marker->cm_flags & CM_END) &&
+                    !(marker->cm_flags & CM_SKIP)) {
+                       LASSERT(last_step == marker->cm_step);
+                       last_step = -1;
+                       got_an_osc_or_mdc = 0;
+                       memset(tmti, 0, sizeof(*tmti));
                        rc = record_start_log(env, mgs, &mdt_llh,
                                              mti->mti_svname);
                        if (rc)
                                RETURN(rc);
                        rc = record_marker(env, mdt_llh, fsdb, CM_END,
-                                           mti->mti_svname,"add osc(copied)");
+                                          mti->mti_svname, "add osc(copied)");
                        record_end_log(env, &mdt_llh);
-                        RETURN(rc);
-                }
-                if (!strncmp(marker->cm_comment,"add mdc",7) &&
-                    (marker->cm_flags & CM_START)){
-                        got_an_osc_or_mdc = 2;
-                        last_step = marker->cm_step;
-                        memcpy(tmti->mti_svname, marker->cm_tgtname,
-                               strlen(marker->cm_tgtname));
-
-                        RETURN(rc);
-                }
-                if (!strncmp(marker->cm_comment,"add mdc",7) &&
-                    (marker->cm_flags & CM_END)){
-                        LASSERT(last_step == marker->cm_step);
-                        last_step = -1;
-                        got_an_osc_or_mdc = 0;
-                        RETURN(rc);
-                }
-        }
+                       RETURN(rc);
+               }
+               if (!strncmp(marker->cm_comment, "add mdc", 7) &&
+                   (marker->cm_flags & CM_START) &&
+                    !(marker->cm_flags & CM_SKIP)) {
+                       got_an_osc_or_mdc = 2;
+                       last_step = marker->cm_step;
+                       memcpy(tmti->mti_svname, marker->cm_tgtname,
+                              strlen(marker->cm_tgtname));
+
+                       RETURN(rc);
+               }
+               if (!strncmp(marker->cm_comment, "add mdc", 7) &&
+                   (marker->cm_flags & CM_END) &&
+                    !(marker->cm_flags & CM_SKIP)) {
+                       LASSERT(last_step == marker->cm_step);
+                       last_step = -1;
+                       got_an_osc_or_mdc = 0;
+                       memset(tmti, 0, sizeof(*tmti));
+                       RETURN(rc);
+               }
+       }
 
         if (got_an_osc_or_mdc == 0 || last_step < 0)
                 RETURN(rc);
@@ -1259,7 +1787,8 @@ static int mgs_steal_llog_handler(const struct lu_env *env,
                        strlen(mti->mti_fsname));
                 tmti->mti_stripe_index = index;
 
-               rc = mgs_write_log_mdc_to_mdt(env, mgs, fsdb, tmti,
+               rc = mgs_write_log_osp_to_mdt(env, mgs, fsdb, tmti,
+                                             mti->mti_stripe_index,
                                              mti->mti_svname);
                 memset(tmti, 0, sizeof(*tmti));
                 RETURN(rc);
@@ -1329,7 +1858,7 @@ static int mgs_steal_llog_for_mdt_from_client(const struct lu_env *env,
        if (rc)
                GOTO(out_close, rc);
 
-       rc = llog_process_or_fork(env, loghandle, mgs_steal_llog_handler,
+       rc = llog_process_or_fork(env, loghandle, mgs_steal_client_llog_handler,
                                  (void *)comp, NULL, false);
        CDEBUG(D_MGS, "steal llog re = %d\n", rc);
 out_close:
@@ -1572,83 +2101,158 @@ out_free:
         RETURN(rc);
 }
 
+static inline int name_create_lov(char **lovname, char *mdtname,
+                                 struct fs_db *fsdb, int index)
+{
+       /* COMPAT_180 */
+       if (index == 0 && test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
+               return name_create(lovname, fsdb->fsdb_name, "-mdtlov");
+       else
+               return name_create(lovname, mdtname, "-mdtlov");
+}
+
+static int name_create_mdt_and_lov(char **logname, char **lovname,
+                                  struct fs_db *fsdb, int i)
+{
+       int rc;
+
+       rc = name_create_mdt(logname, fsdb->fsdb_name, i);
+       if (rc)
+               return rc;
+       /* COMPAT_180 */
+       if (i == 0 && test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
+               rc = name_create(lovname, fsdb->fsdb_name, "-mdtlov");
+       else
+               rc = name_create(lovname, *logname, "-mdtlov");
+       if (rc) {
+               name_destroy(logname);
+               *logname = NULL;
+       }
+       return rc;
+}
+
+static inline int name_create_mdt_osc(char **oscname, char *ostname,
+                                     struct fs_db *fsdb, int i)
+{
+       char suffix[16];
+
+       if (i == 0 && test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
+               sprintf(suffix, "-osc");
+       else
+               sprintf(suffix, "-osc-MDT%04x", i);
+       return name_create(oscname, ostname, suffix);
+}
+
 /* add new mdc to already existent MDS */
-static int mgs_write_log_mdc_to_mdt(const struct lu_env *env,
+static int mgs_write_log_osp_to_mdt(const struct lu_env *env,
                                    struct mgs_device *mgs,
                                    struct fs_db *fsdb,
                                    struct mgs_target_info *mti,
-                                   char *logname)
-{
-        struct llog_handle *llh = NULL;
-       char *nodeuuid = NULL;
-       char *mdcname = NULL;
-       char *mdcuuid = NULL;
-       char *mdtuuid = NULL;
-        int idx = mti->mti_stripe_index;
-        char index[9];
-        int i, rc;
+                                   int mdt_index, char *logname)
+{
+       struct llog_handle      *llh = NULL;
+       char    *nodeuuid = NULL;
+       char    *ospname = NULL;
+       char    *lovuuid = NULL;
+       char    *mdtuuid = NULL;
+       char    *svname = NULL;
+       char    *mdtname = NULL;
+       char    *lovname = NULL;
+       char    index_str[16];
+       int     i, rc;
 
-        ENTRY;
-       if (mgs_log_is_empty(env, mgs, logname)) {
+       ENTRY;
+       if (mgs_log_is_empty(env, mgs, mti->mti_svname)) {
                 CERROR("log is empty! Logical error\n");
                 RETURN (-EINVAL);
         }
 
-        CDEBUG(D_MGS, "adding mdc index %d to %s\n", idx, logname);
+       CDEBUG(D_MGS, "adding osp index %d to %s\n", mti->mti_stripe_index,
+              logname);
 
-       rc = name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
+       rc = name_create_mdt(&mdtname, fsdb->fsdb_name, mti->mti_stripe_index);
        if (rc)
                RETURN(rc);
-       snprintf(index, sizeof(index), "-mdc%04x", idx);
-       rc = name_create(&mdcname, logname, index);
+
+       rc = name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
        if (rc)
-               GOTO(out_free, rc);
-       rc = name_create(&mdcuuid, mdcname, "_UUID");
+               GOTO(out_destory, rc);
+
+       rc = name_create(&svname, mdtname, "-osp");
        if (rc)
-               GOTO(out_free, rc);
-       rc = name_create(&mdtuuid, logname, "_UUID");
+               GOTO(out_destory, rc);
+
+       sprintf(index_str, "-MDT%04x", mdt_index);
+       rc = name_create(&ospname, svname, index_str);
        if (rc)
-               GOTO(out_free, rc);
+               GOTO(out_destory, rc);
+
+       rc = name_create_lov(&lovname, logname, fsdb, mdt_index);
+       if (rc)
+               GOTO(out_destory, rc);
+
+       rc = name_create(&lovuuid, lovname, "_UUID");
+       if (rc)
+               GOTO(out_destory, rc);
+
+       rc = name_create(&mdtuuid, mdtname, "_UUID");
+       if (rc)
+               GOTO(out_destory, rc);
 
        rc = record_start_log(env, mgs, &llh, logname);
        if (rc)
-               GOTO(out_free, rc);
-       rc = record_marker(env, llh, fsdb, CM_START, mti->mti_svname, "add mdc");
+               GOTO(out_destory, rc);
+
+       rc = record_marker(env, llh, fsdb, CM_START, mti->mti_svname,
+                          "add osp");
        if (rc)
-               GOTO(out_end, rc);
-        for (i = 0; i < mti->mti_nid_count; i++) {
-                CDEBUG(D_MGS, "add nid %s for mdt\n",
-                       libcfs_nid2str(mti->mti_nids[i]));
+               GOTO(out_destory, rc);
+
+       for (i = 0; i < mti->mti_nid_count; i++) {
+               CDEBUG(D_MGS, "add nid %s for mdt\n",
+                      libcfs_nid2str(mti->mti_nids[i]));
                rc = record_add_uuid(env, llh, mti->mti_nids[i], nodeuuid);
                if (rc)
                        GOTO(out_end, rc);
         }
-       rc = record_attach(env, llh, mdcname, LUSTRE_MDC_NAME, mdcuuid);
+
+       rc = record_attach(env, llh, ospname, LUSTRE_OSP_NAME, lovuuid);
        if (rc)
                GOTO(out_end, rc);
-       rc = record_setup(env, llh, mdcname, mti->mti_uuid, nodeuuid, 0, 0);
+
+       rc = record_setup(env, llh, ospname, mti->mti_uuid, nodeuuid,
+                         NULL, NULL);
        if (rc)
                GOTO(out_end, rc);
-       rc = mgs_write_log_failnids(env, mti, llh, mdcname);
+
+       rc = mgs_write_log_failnids(env, mti, llh, ospname);
        if (rc)
                GOTO(out_end, rc);
-        snprintf(index, sizeof(index), "%d", idx);
 
-       rc = record_mdc_add(env, llh, logname, mdcuuid, mti->mti_uuid,
-                            index, "1");
+       /* Add mdc(osp) to lod */
+       snprintf(index_str, sizeof(mti->mti_stripe_index), "%d",
+                mti->mti_stripe_index);
+       rc = record_base(env, llh, lovname, 0, LCFG_ADD_MDC, mti->mti_uuid,
+                        index_str, "1", NULL);
        if (rc)
                GOTO(out_end, rc);
-       rc = record_marker(env, llh, fsdb, CM_END, mti->mti_svname, "add mdc");
+
+       rc = record_marker(env, llh, fsdb, CM_END, mti->mti_svname, "add osp");
        if (rc)
                GOTO(out_end, rc);
+
 out_end:
        record_end_log(env, &llh);
-out_free:
+
+out_destory:
        name_destroy(&mdtuuid);
-        name_destroy(&mdcuuid);
-        name_destroy(&mdcname);
+       name_destroy(&lovuuid);
+       name_destroy(&lovname);
+       name_destroy(&ospname);
+       name_destroy(&svname);
         name_destroy(&nodeuuid);
-        RETURN(rc);
+       name_destroy(&mdtname);
+       RETURN(rc);
 }
 
 static int mgs_write_log_mdt0(const struct lu_env *env,
@@ -1715,46 +2319,6 @@ out_free:
         RETURN(rc);
 }
 
-static inline int name_create_mdt(char **logname, char *fsname, int i)
-{
-        char mdt_index[9];
-
-        sprintf(mdt_index, "-MDT%04x", i);
-       return name_create(logname, fsname, mdt_index);
-}
-
-static int name_create_mdt_and_lov(char **logname, char **lovname,
-                                    struct fs_db *fsdb, int i)
-{
-       int rc;
-
-       rc = name_create_mdt(logname, fsdb->fsdb_name, i);
-       if (rc)
-               return rc;
-        /* COMPAT_180 */
-       if (i == 0 && test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
-               rc = name_create(lovname, fsdb->fsdb_name, "-mdtlov");
-        else
-               rc = name_create(lovname, *logname, "-mdtlov");
-       if (rc) {
-               name_destroy(logname);
-               *logname = NULL;
-       }
-       return rc;
-}
-
-static inline int name_create_mdt_osc(char **oscname, char *ostname,
-                                       struct fs_db *fsdb, int i)
-{
-        char suffix[16];
-
-       if (i == 0 && test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
-                sprintf(suffix, "-osc");
-        else
-                sprintf(suffix, "-osc-MDT%04x", i);
-       return name_create(oscname, ostname, suffix);
-}
-
 /* envelope method for all layers log */
 static int mgs_write_log_mdt(const struct lu_env *env,
                             struct mgs_device *mgs,
@@ -1836,20 +2400,24 @@ static int mgs_write_log_mdt(const struct lu_env *env,
 
        if (rc)
                GOTO(out_end, rc);
+
        /* for_all_existing_mdt except current one */
-        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)) {
-                       rc = name_create_mdt(&mdtname, mti->mti_fsname, i);
+       for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+               if (i !=  mti->mti_stripe_index &&
+                   test_bit(i, fsdb->fsdb_mdt_index_map)) {
+                       char *logname;
+
+                       rc = name_create_mdt(&logname, fsdb->fsdb_name, i);
                        if (rc)
                                GOTO(out_end, rc);
-                       rc = mgs_write_log_mdc_to_mdt(env, mgs, fsdb, mti, mdtname);
-                        name_destroy(&mdtname);
+
+                       rc = mgs_write_log_osp_to_mdt(env, mgs, fsdb, mti,
+                                                     i, logname);
+                       name_destroy(&logname);
                        if (rc)
                                GOTO(out_end, rc);
-                }
-        }
+               }
+       }
 out_end:
        record_end_log(env, &llh);
 out_free:
@@ -1888,6 +2456,7 @@ static int mgs_write_log_osc_to_lov(const struct lu_env *env,
        rc = name_create(&svname, mti->mti_svname, "-osc");
        if (rc)
                GOTO(out_free, rc);
+
        /* for the system upgraded from old 1.8, keep using the old osc naming
         * style for mdt, see name_create_mdt_osc(). LU-1257 */
        if (test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
@@ -1896,6 +2465,7 @@ static int mgs_write_log_osc_to_lov(const struct lu_env *env,
                rc = name_create(&oscname, svname, suffix);
        if (rc)
                GOTO(out_free, rc);
+
        rc = name_create(&oscuuid, oscname, "_UUID");
        if (rc)
                GOTO(out_free, rc);
@@ -1903,6 +2473,7 @@ static int mgs_write_log_osc_to_lov(const struct lu_env *env,
        if (rc)
                GOTO(out_free, rc);
 
+
         /*
         #03 L add_uuid nid=uml1@tcp(0x20000c0a80201) 0:  1:uml1_UUID
         multihomed (#4)
@@ -1928,7 +2499,7 @@ static int mgs_write_log_osc_to_lov(const struct lu_env *env,
        /* NB: don't change record order, because upon MDT steal OSC config
         * from client, it treats all nids before LCFG_SETUP as target nids
         * (multiple interfaces), while nids after as failover node nids.
-        * See mgs_steal_llog_handler() LCFG_ADD_UUID.
+        * See mgs_steal_client_llog_handler() LCFG_ADD_UUID.
         */
         for (i = 0; i < mti->mti_nid_count; i++) {
                 CDEBUG(D_MGS, "add nid %s\n", libcfs_nid2str(mti->mti_nids[i]));
@@ -1945,7 +2516,9 @@ static int mgs_write_log_osc_to_lov(const struct lu_env *env,
        rc = mgs_write_log_failnids(env, mti, llh, oscname);
        if (rc)
                GOTO(out_end, rc);
-        snprintf(index, sizeof(index), "%d", mti->mti_stripe_index);
+
+       snprintf(index, sizeof(index), "%d", mti->mti_stripe_index);
+
        rc = record_lov_add(env, llh, lovname, mti->mti_uuid, index, "1");
        if (rc)
                GOTO(out_end, rc);
@@ -2356,7 +2929,7 @@ static int mgs_write_log_quota(const struct lu_env *env, struct mgs_device *mgs,
                                      mti->mti_fsname, quota, 1);
        *ptr = sep;
        lustre_cfg_free(lcfg);
-       return rc;
+       return rc < 0 ? rc : 0;
 }
 
 static int mgs_srpc_set_param_disk(const struct lu_env *env,
@@ -2597,7 +3170,7 @@ static int mgs_srpc_read_handler(const struct lu_env *env,
 {
        struct mgs_srpc_read_data *msrd = data;
         struct cfg_marker         *marker;
-        struct lustre_cfg         *lcfg = (struct lustre_cfg *)(rec + 1);
+       struct lustre_cfg         *lcfg = REC_DATA(rec);
         char                      *svname, *param;
         int                        cfg_len, rc;
         ENTRY;
@@ -3064,6 +3637,7 @@ int mgs_write_log_target(const struct lu_env *env,
                   get repeat setup instructions for already running
                   osc's. So don't update the client/mdt logs. */
                mti->mti_flags &= ~LDD_F_UPDATE;
+               rc = 0;
        }
 
        mutex_lock(&fsdb->fsdb_mutex);
@@ -3216,13 +3790,14 @@ static void print_lustre_cfg(struct lustre_cfg *lcfg)
 int mgs_setparam(const struct lu_env *env, struct mgs_device *mgs,
                 struct lustre_cfg *lcfg, char *fsname)
 {
-        struct fs_db *fsdb;
-        struct mgs_target_info *mti;
+       struct fs_db *fsdb;
+       struct mgs_target_info *mti;
         char *devname, *param;
-        char *ptr, *tmp;
-        __u32 index;
-        int rc = 0;
-        ENTRY;
+       char *ptr;
+       const char *tmp;
+       __u32 index;
+       int rc = 0;
+       ENTRY;
 
         print_lustre_cfg(lcfg);
 
@@ -3244,20 +3819,18 @@ int mgs_setparam(const struct lu_env *env, struct mgs_device *mgs,
                 RETURN(-ENOSYS);
         }
 
-        /* Extract fsname */
-        ptr = strrchr(devname, '-');
-        memset(fsname, 0, MTI_NAME_MAXLEN);
-        if (ptr && (server_name2index(ptr, &index, NULL) >= 0)) {
+       rc = mgs_parse_devname(devname, fsname, NULL);
+       if (rc == 0 && !mgs_parse_devname(devname, NULL, &index)) {
                 /* param related to llite isn't allowed to set by OST or MDT */
-                if (strncmp(param, PARAM_LLITE, sizeof(PARAM_LLITE)) == 0)
+               if (rc == 0 && strncmp(param, PARAM_LLITE,
+                                  sizeof(PARAM_LLITE)) == 0)
                         RETURN(-EINVAL);
-
-                strncpy(fsname, devname, ptr - devname);
         } else {
                 /* assume devname is the fsname */
+               memset(fsname, 0, MTI_NAME_MAXLEN);
                 strncpy(fsname, devname, MTI_NAME_MAXLEN);
+               fsname[MTI_NAME_MAXLEN - 1] = 0;
         }
-        fsname[MTI_NAME_MAXLEN - 1] = 0;
         CDEBUG(D_MGS, "setparam fs='%s' device='%s'\n", fsname, devname);
 
        rc = mgs_find_or_make_fsdb(env, mgs, fsname, &fsdb);
@@ -3275,9 +3848,15 @@ int mgs_setparam(const struct lu_env *env, struct mgs_device *mgs,
         OBD_ALLOC_PTR(mti);
         if (!mti)
                 GOTO(out, rc = -ENOMEM);
-        strncpy(mti->mti_fsname, fsname, MTI_NAME_MAXLEN);
-        strncpy(mti->mti_svname, devname, MTI_NAME_MAXLEN);
-        strncpy(mti->mti_params, param, sizeof(mti->mti_params));
+       if (strlcpy(mti->mti_fsname, fsname, sizeof(mti->mti_fsname))
+           >= sizeof(mti->mti_fsname))
+               GOTO(out, rc = -E2BIG);
+       if (strlcpy(mti->mti_svname, devname, sizeof(mti->mti_svname))
+           >= sizeof(mti->mti_svname))
+               GOTO(out, rc = -E2BIG);
+       if (strlcpy(mti->mti_params, param, sizeof(mti->mti_params))
+           >= sizeof(mti->mti_params))
+               GOTO(out, rc = -E2BIG);
         rc = server_name2index(mti->mti_svname, &mti->mti_stripe_index, &tmp);
         if (rc < 0)
                 /* Not a valid server; may be only fsname */
@@ -3475,63 +4054,4 @@ out_label:
         return rc;
 }
 
-#if 0
-/******************** unused *********************/
-static int mgs_backup_llog(struct obd_device *obd, char* fsname)
-{
-        struct file *filp, *bak_filp;
-        struct lvfs_run_ctxt saved;
-        char *logname, *buf;
-        loff_t soff = 0 , doff = 0;
-        int count = 4096, len;
-        int rc = 0;
-
-        OBD_ALLOC(logname, PATH_MAX);
-        if (logname == NULL)
-                return -ENOMEM;
-
-        OBD_ALLOC(buf, count);
-        if (!buf)
-                GOTO(out , rc = -ENOMEM);
-
-        len = snprintf(logname, PATH_MAX, "%s/%s.bak",
-                       MOUNT_CONFIGS_DIR, fsname);
-
-        if (len >= PATH_MAX - 1) {
-                GOTO(out, -ENAMETOOLONG);
-        }
-
-        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
 
-        bak_filp = l_filp_open(logname, O_RDWR|O_CREAT|O_TRUNC, 0660);
-        if (IS_ERR(bak_filp)) {
-                rc = PTR_ERR(bak_filp);
-                CERROR("backup logfile open %s: %d\n", logname, rc);
-                GOTO(pop, rc);
-        }
-        sprintf(logname, "%s/%s", MOUNT_CONFIGS_DIR, fsname);
-        filp = l_filp_open(logname, O_RDONLY, 0);
-        if (IS_ERR(filp)) {
-                rc = PTR_ERR(filp);
-                CERROR("logfile open %s: %d\n", logname, rc);
-                GOTO(close1f, rc);
-        }
-
-        while ((rc = lustre_fread(filp, buf, count, &soff)) > 0) {
-                rc = lustre_fwrite(bak_filp, buf, count, &doff);
-                break;
-        }
-
-        filp_close(filp, 0);
-close1f:
-        filp_close(bak_filp, 0);
-pop:
-        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-out:
-        if (buf)
-                OBD_FREE(buf, count);
-        OBD_FREE(logname, PATH_MAX);
-        return rc;
-}
-
-#endif