Whamcloud - gitweb
- make HEAD from b_post_cmd3
[fs/lustre-release.git] / lustre / obdclass / obd_config.c
index ca283d1..676a7ad 100644 (file)
@@ -98,7 +98,7 @@ int class_parse_nid(char *buf, lnet_nid_t *nid, char **endh)
         *endp = '\0';
         *nid = libcfs_str2nid(buf);
         if (*nid == LNET_NID_ANY) {
-                LCONSOLE_ERROR("Can't parse NID '%s'\n", buf);
+                LCONSOLE_ERROR_MSG(0x159, "Can't parse NID '%s'\n", buf);
                 *endp = tmp;
                 return -EINVAL;
         }
@@ -147,26 +147,6 @@ int class_attach(struct lustre_cfg *lcfg)
         CDEBUG(D_IOCTL, "attach type %s name: %s uuid: %s\n",
                MKSTR(typename), MKSTR(name), MKSTR(uuid));
 
-        /* Mountconf transitional hack, should go away after 1.6.
-           1.4.7 uses the old names, so translate back if the
-           mountconf flag is set.
-           1.6 should set this flag, and translate the other way here
-           if not set. */
-        if (lcfg->lcfg_flags & LCFG_FLG_MOUNTCONF){
-                char *tmp = NULL;
-                if (strcmp(typename, "mds") == 0)
-                        tmp = "mdt";
-                if (strcmp(typename, "mdt") == 0)
-                        tmp = "mds";
-                if (strcmp(typename, "osd") == 0)
-                        tmp = "obdfilter";
-                if (tmp) {
-                        LCONSOLE_WARN("Using type %s for %s %s\n", tmp,
-                                      MKSTR(typename), MKSTR(name));
-                        typename = tmp;
-                }
-        }
-
         obd = class_newdev(typename, name);
         if (IS_ERR(obd)) {
                 /* Already exists or out of obds */
@@ -199,8 +179,9 @@ int class_attach(struct lustre_cfg *lcfg)
         cfs_init_timer(&obd->obd_recovery_timer);
         spin_lock_init(&obd->obd_processing_task_lock);
         cfs_waitq_init(&obd->obd_next_transno_waitq);
-        CFS_INIT_LIST_HEAD(&obd->obd_recovery_queue);
-        CFS_INIT_LIST_HEAD(&obd->obd_delayed_reply_queue);
+        CFS_INIT_LIST_HEAD(&obd->obd_req_replay_queue);
+        CFS_INIT_LIST_HEAD(&obd->obd_lock_replay_queue);
+        CFS_INIT_LIST_HEAD(&obd->obd_final_req_queue);
 
         spin_lock_init(&obd->obd_uncommitted_replies_lock);
         CFS_INIT_LIST_HEAD(&obd->obd_uncommitted_replies);
@@ -280,11 +261,12 @@ int class_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
         list_del_init(&exp->exp_obd_chain_timed);
         class_export_put(exp);
 
-        err = obd_setup(obd, sizeof(*lcfg), lcfg);
+        err = obd_setup(obd, lcfg);
         if (err)
                 GOTO(err_exp, err);
 
         obd->obd_set_up = 1;
+        
         spin_lock(&obd->obd_dev_lock);
         /* cleanup drops this */
         class_incref(obd);
@@ -387,7 +369,7 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg)
                                 obd->obd_force = 1;
                                 break;
                         case 'A':
-                                LCONSOLE_WARN("Failing over %s\n", 
+                                LCONSOLE_WARN("Failing over %s\n",
                                               obd->obd_name);
                                 obd->obd_fail = 1;
                                 obd->obd_no_transno = 1;
@@ -416,7 +398,6 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg)
                         dump_exports(obd);
                         /* Allow a failed cleanup to try again. */
                         obd->obd_stopping = 0;
-                        RETURN(-EBUSY);
                 }
 #endif
                 /* refcounf - 3 might be the number of real exports 
@@ -427,7 +408,6 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg)
                 dump_exports(obd);
                 class_disconnect_exports(obd);
         }
-
         LASSERT(obd->obd_self_export);
 
         /* Precleanup stage 1, we must make sure all exports (other than the
@@ -439,7 +419,6 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg)
 
         class_decref(obd);
         obd->obd_set_up = 0;
-
         RETURN(0);
 }
 
@@ -475,7 +454,7 @@ void class_decref(struct obd_device *obd)
                 if (err)
                         CERROR("Precleanup %s returned %d\n",
                                obd->obd_name, err);
-
+                
                 spin_lock(&obd->obd_self_export->exp_lock);
                 obd->obd_self_export->exp_flags |=
                         (obd->obd_fail ? OBD_OPT_FAILOVER : 0) |
@@ -520,7 +499,7 @@ int class_add_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
                 RETURN(-EINVAL);
         }
         if (strcmp(obd->obd_type->typ_name, LUSTRE_MDC_NAME) &&
-            strcmp(obd->obd_type->typ_name, LUSTRE_OSC_NAME) && 
+            strcmp(obd->obd_type->typ_name, LUSTRE_OSC_NAME) &&
             strcmp(obd->obd_type->typ_name, LUSTRE_MGC_NAME)) {
                 CERROR("can't add connection on non-client dev\n");
                 RETURN(-EINVAL);
@@ -568,9 +547,39 @@ int class_del_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
         RETURN(rc);
 }
 
+int class_sec_flavor(struct obd_device *obd, struct lustre_cfg *lcfg)
+{
+        struct sec_flavor_config *conf;
+        ENTRY;
+
+        if (strcmp(obd->obd_type->typ_name, LUSTRE_MDC_NAME) &&
+            strcmp(obd->obd_type->typ_name, LUSTRE_OSC_NAME)) {
+                CERROR("Can't set security flavor on obd %s\n",
+                       obd->obd_type->typ_name);
+                RETURN(-EINVAL);
+        }
+
+        if (LUSTRE_CFG_BUFLEN(lcfg, 1) != sizeof(*conf)) {
+                CERROR("invalid data\n");
+                RETURN(-EINVAL);
+        }
+
+        conf = &obd->u.cli.cl_sec_conf;
+        memcpy(conf, lustre_cfg_buf(lcfg, 1), sizeof(*conf));
+
+#ifdef __BIG_ENDIAN
+        __swab32s(&conf->sfc_rpc_flavor);
+        __swab32s(&conf->sfc_bulk_csum);
+        __swab32s(&conf->sfc_bulk_priv);
+        __swab32s(&conf->sfc_flags);
+#endif
+
+        RETURN(0);
+}
+
 CFS_LIST_HEAD(lustre_profile_list);
 
-struct lustre_profile *class_get_profile(char * prof)
+struct lustre_profile *class_get_profile(const char * prof)
 {
         struct lustre_profile *lprof;
 
@@ -604,34 +613,34 @@ int class_add_profile(int proflen, char *prof, int osclen, char *osc,
         memcpy(lprof->lp_profile, prof, proflen);
 
         LASSERT(osclen == (strlen(osc) + 1));
-        OBD_ALLOC(lprof->lp_osc, osclen);
-        if (lprof->lp_osc == NULL)
+        OBD_ALLOC(lprof->lp_dt, osclen);
+        if (lprof->lp_dt == NULL)
                 GOTO(out, err = -ENOMEM);
-        memcpy(lprof->lp_osc, osc, osclen);
+        memcpy(lprof->lp_dt, osc, osclen);
 
         if (mdclen > 0) {
                 LASSERT(mdclen == (strlen(mdc) + 1));
-                OBD_ALLOC(lprof->lp_mdc, mdclen);
-                if (lprof->lp_mdc == NULL)
+                OBD_ALLOC(lprof->lp_md, mdclen);
+                if (lprof->lp_md == NULL)
                         GOTO(out, err = -ENOMEM);
-                memcpy(lprof->lp_mdc, mdc, mdclen);
+                memcpy(lprof->lp_md, mdc, mdclen);
         }
 
         list_add(&lprof->lp_list, &lustre_profile_list);
         RETURN(err);
 
 out:
-        if (lprof->lp_mdc)
-                OBD_FREE(lprof->lp_mdc, mdclen);
-        if (lprof->lp_osc)
-                OBD_FREE(lprof->lp_osc, osclen);
+        if (lprof->lp_md)
+                OBD_FREE(lprof->lp_md, mdclen);
+        if (lprof->lp_dt)
+                OBD_FREE(lprof->lp_dt, osclen);
         if (lprof->lp_profile)
                 OBD_FREE(lprof->lp_profile, proflen);
         OBD_FREE(lprof, sizeof(*lprof));        
         RETURN(err);
 }
 
-void class_del_profile(char *prof)
+void class_del_profile(const char *prof)
 {
         struct lustre_profile *lprof;
         ENTRY;
@@ -642,9 +651,9 @@ void class_del_profile(char *prof)
         if (lprof) {
                 list_del(&lprof->lp_list);
                 OBD_FREE(lprof->lp_profile, strlen(lprof->lp_profile) + 1);
-                OBD_FREE(lprof->lp_osc, strlen(lprof->lp_osc) + 1);
-                if (lprof->lp_mdc)
-                        OBD_FREE(lprof->lp_mdc, strlen(lprof->lp_mdc) + 1);
+                OBD_FREE(lprof->lp_dt, strlen(lprof->lp_dt) + 1);
+                if (lprof->lp_md)
+                        OBD_FREE(lprof->lp_md, strlen(lprof->lp_md) + 1);
                 OBD_FREE(lprof, sizeof *lprof);
         }
         EXIT;
@@ -659,9 +668,9 @@ void class_del_profiles(void)
         list_for_each_entry_safe(lprof, n, &lustre_profile_list, lp_list) {
                 list_del(&lprof->lp_list);
                 OBD_FREE(lprof->lp_profile, strlen(lprof->lp_profile) + 1);
-                OBD_FREE(lprof->lp_osc, strlen(lprof->lp_osc) + 1);
-                if (lprof->lp_mdc)
-                        OBD_FREE(lprof->lp_mdc, strlen(lprof->lp_mdc) + 1);
+                OBD_FREE(lprof->lp_dt, strlen(lprof->lp_dt) + 1);
+                if (lprof->lp_md)
+                        OBD_FREE(lprof->lp_md, strlen(lprof->lp_md) + 1);
                 OBD_FREE(lprof, sizeof *lprof);
         }
         EXIT;
@@ -735,7 +744,7 @@ int class_process_config(struct lustre_cfg *lcfg)
                 GOTO(out, err = 0);
         }
         case LCFG_SET_UPCALL: {
-                LCONSOLE_ERROR("recovery upcall is deprecated\n");
+                LCONSOLE_ERROR_MSG(0x15a, "recovery upcall is deprecated\n");
                 /* COMPAT_146 Don't fail on old configs */
                 GOTO(out, err = 0);
         }
@@ -743,7 +752,7 @@ int class_process_config(struct lustre_cfg *lcfg)
                 struct cfg_marker *marker;
                 marker = lustre_cfg_buf(lcfg, 1);
                 CDEBUG(D_IOCTL, "marker %d (%#x) %.16s %s\n", marker->cm_step,
-                      marker->cm_flags, marker->cm_tgtname, marker->cm_comment);
+                       marker->cm_flags, marker->cm_tgtname, marker->cm_comment);
                 GOTO(out, err = 0);
         }
         case LCFG_PARAM: {
@@ -792,6 +801,10 @@ int class_process_config(struct lustre_cfg *lcfg)
                 err = class_del_conn(obd, lcfg);
                 GOTO(out, err = 0);
         }
+        case LCFG_SEC_FLAVOR: {
+                err = class_sec_flavor(obd, lcfg);
+                GOTO(out, err = 0);
+        }
         default: {
                 err = obd_process_config(obd, sizeof(*lcfg), lcfg);
                 GOTO(out, err);
@@ -813,7 +826,7 @@ int class_process_proc_param(char *prefix, struct lprocfs_vars *lvars,
 #ifdef __KERNEL__
         struct lprocfs_vars *var;
         char *key, *sval;
-        int i, vallen;
+        int i, keylen, vallen;
         int matched = 0, j = 0;
         int rc = 0;
         ENTRY;
@@ -837,6 +850,7 @@ int class_process_proc_param(char *prefix, struct lprocfs_vars *lvars,
                         /* continue parsing other params */
                         continue;
                 }
+                keylen = sval - key;
                 sval++;
                 vallen = strlen(sval);
                 matched = 0;
@@ -844,7 +858,8 @@ int class_process_proc_param(char *prefix, struct lprocfs_vars *lvars,
                 /* Search proc entries */
                 while (lvars[j].name) {
                         var = &lvars[j];
-                        if (class_match_param(key, (char *)var->name, 0) == 0) {
+                        if (class_match_param(key, (char *)var->name, 0) == 0 &&
+                            keylen == strlen(var->name)) {
                                 matched++;
                                 rc = -EROFS;
                                 if (var->write_fptr) {
@@ -902,7 +917,7 @@ static int class_config_llog_handler(struct llog_handle * handle,
         char *cfg_buf = (char*) (rec + 1);
         int rc = 0;
         ENTRY;
-        
+
         //class_config_dump_handler(handle, rec, data);
 
         switch (rec->lrh_type) {
@@ -949,11 +964,12 @@ static int class_config_llog_handler(struct llog_handle * handle,
                 if (!(clli->cfg_flags & CFG_F_COMPAT146) &&
                     !(clli->cfg_flags & CFG_F_MARKER) && 
                     (lcfg->lcfg_command != LCFG_MARKER)) {
-                        CWARN("Config not inside markers, ignoring! (%#x)\n", 
-                              clli->cfg_flags);
+                        CWARN("Config not inside markers, ignoring! "
+                              "(inst: %s, uuid: %s, flags: %#x)\n",
+                              clli->cfg_instance ? clli->cfg_instance : "<null>",
+                              clli->cfg_uuid.uuid, clli->cfg_flags);
                         clli->cfg_flags |= CFG_F_SKIP;
                 }
-
                 if (clli->cfg_flags & CFG_F_SKIP) {
                         CDEBUG(D_CONFIG, "skipping %#x\n",
                                clli->cfg_flags);
@@ -981,7 +997,7 @@ static int class_config_llog_handler(struct llog_handle * handle,
                                 lustre_cfg_string(lcfg, 0),
                                 clli->cfg_instance);
                         lustre_cfg_bufs_set_string(&bufs, 0, inst_name);
-                        CDEBUG(D_CONFIG, "cmd %x, instance name: %s\n", 
+                        CDEBUG(D_CONFIG, "cmd %x, instance name: %s\n",
                                lcfg->lcfg_command, inst_name);
                 }
 
@@ -1061,6 +1077,7 @@ int class_config_parse_llog(struct llog_ctxt *ctxt, char *name,
 
         CDEBUG(D_CONFIG, "Processed log %s gen %d-%d (rc=%d)\n", name, 
                cd.first_idx + 1, cd.last_idx, rc);
+
         if (cfg)
                 cfg->cfg_last_idx = cd.last_idx;
 
@@ -1114,7 +1131,7 @@ int class_config_dump_handler(struct llog_handle * handle,
                 if (lcfg->lcfg_command == LCFG_MARKER) {
                         struct cfg_marker *marker = lustre_cfg_buf(lcfg, 1);
                         ptr += snprintf(ptr, end-ptr, "marker=%d(%#x)%s '%s'",
-                                        marker->cm_step, marker->cm_flags, 
+                                        marker->cm_step, marker->cm_flags,
                                         marker->cm_tgtname, marker->cm_comment);
                 } else {
                         for (i = 0; i <  lcfg->lcfg_bufcount; i++) {