Whamcloud - gitweb
LU-350 fix bug in mgs to allow starting OST before MDT
[fs/lustre-release.git] / lustre / mgs / mgs_llog.c
index 1b99b6c..4c64911 100644 (file)
@@ -89,7 +89,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));
@@ -1073,6 +1073,12 @@ 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,
@@ -1119,6 +1125,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)");
@@ -1194,6 +1202,30 @@ 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);
 }
 
@@ -1437,7 +1469,7 @@ static int mgs_write_log_mdc_to_mdt(struct obd_device *obd, struct fs_db *fsdb,
         int i, rc;
 
         ENTRY;
-        if (mgs_log_is_empty(obd, mti->mti_svname)) {
+        if (mgs_log_is_empty(obd, logname)) {
                 CERROR("log is empty! Logical error\n");
                 RETURN (-EINVAL);
         }
@@ -1686,9 +1718,8 @@ static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb,
                mti->mti_svname, logname);
 
         if (mgs_log_is_empty(obd, logname)) {
-                /* The first item in the log must be the lov, so we have
-                   somewhere to add our osc. */
-                rc = mgs_write_log_lov(obd, fsdb, mti, logname, lovname);
+                CERROR("log is empty! Logical error\n");
+                RETURN (-EINVAL);
         }
 
         name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
@@ -1818,8 +1849,15 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb,
 
         /* Append ost info to the client log */
         name_create(&logname, mti->mti_fsname, "-client");
+        if (mgs_log_is_empty(obd, logname)) {
+                /* Start client log */
+                rc = mgs_write_log_lov(obd, fsdb, mti, logname,
+                                       fsdb->fsdb_clilov);
+                rc = mgs_write_log_lmv(obd, fsdb, mti, logname,
+                                       fsdb->fsdb_clilmv);
+        }
         mgs_write_log_osc_to_lov(obd, fsdb, mti, logname, "",
-                                 fsdb->fsdb_clilov, LUSTRE_SP_CLI, 0);
+                                 fsdb->fsdb_clilov, LUSTRE_SP_CLI, flags);
         name_destroy(&logname);
         RETURN(rc);
 }
@@ -2051,13 +2089,12 @@ static int mgs_srpc_set_param_disk(struct obd_device *obd,
         /* obsolete old one */
         mgs_modify(obd, fsdb, mti, logname, mti->mti_svname, comment, CM_SKIP);
 
-        if (!mgs_param_empty(param)) {
-                /* write the new one */
-                rc = mgs_write_log_direct(obd, fsdb, logname, lcfg,
-                                          mti->mti_svname, comment);
-                if (rc)
-                        CERROR("err %d writing log %s\n", rc, logname);
-        }
+        /* write the new one */
+        rc = mgs_write_log_direct(obd, fsdb, logname, lcfg,
+                                  mti->mti_svname, comment);
+        if (rc)
+                CERROR("err %d writing log %s\n", rc, logname);
+
 out:
         name_destroy(&logname);
 out_lcfg:
@@ -2193,7 +2230,7 @@ static int mgs_srpc_set_param(struct obd_device *obd,
                               char *param)
 {
         char                   *copy;
-        int                     rc, copy_size, del;
+        int                     rc, copy_size;
         ENTRY;
 
 #ifndef HAVE_GSS
@@ -2207,12 +2244,9 @@ static int mgs_srpc_set_param(struct obd_device *obd,
                 return -ENOMEM;
         memcpy(copy, param, copy_size);
 
-        del = mgs_param_empty(param);
-        if (!del) {
-                rc = mgs_srpc_set_param_mem(fsdb, mti->mti_svname, param);
-                if (rc)
-                        goto out_free;
-        }
+        rc = mgs_srpc_set_param_mem(fsdb, mti->mti_svname, param);
+        if (rc)
+                goto out_free;
 
         /* previous steps guaranteed the syntax is correct */
         rc = mgs_srpc_set_param_disk(obd, fsdb, mti, copy);
@@ -2365,7 +2399,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
         struct lustre_cfg_bufs bufs;
         char *logname;
         char *tmp;
-        int rc = 0;
+        int rc = 0, rc2 = 0;
         ENTRY;
 
         /* For various parameter settings, we have to figure out which logs
@@ -2379,6 +2413,10 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
         if (class_match_param(ptr, PARAM_MGSNODE, NULL) == 0)
                 GOTO(end, rc);
 
+       /* Processed in ost/mdt */
+       if (class_match_param(ptr, PARAM_NETWORK, NULL) == 0)
+               GOTO(end, rc);
+
         /* Processed in mgs_write_log_ost */
         if (class_match_param(ptr, PARAM_FAILMODE, NULL) == 0) {
                 if (mti->mti_flags & LDD_F_PARAM) {
@@ -2618,12 +2656,13 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb,
         }
 
         LCONSOLE_WARN("Ignoring unrecognized param '%s'\n", ptr);
+        rc2 = -ENOSYS;
 
 end:
         if (rc)
                 CERROR("err %d on param '%s'\n", rc, ptr);
 
-        RETURN(rc);
+        RETURN(rc ?: rc2);
 }
 
 /* Not implementing automatic failover nid addition at this time. */