#endif
#include <linux/lustre_log.h>
#include <linux/lprocfs_status.h>
-#include <portals/list.h>
+#include <libcfs/list.h>
/* Create a new device and set the type, name and uuid. If
* successful, the new device can be accessed by either name or uuid.
*/
-int class_attach(struct lustre_cfg *lcfg)
+static int class_attach(struct lustre_cfg *lcfg)
{
- int minor;
struct obd_type *type;
- int err = 0;
- int len;
- char *typename;
- char *name;
- char *uuid;
struct obd_device *obd;
- int dev;
+ char *typename, *name, *uuid;
+ int rc, len, cleanup_phase = 0;
- if (!lcfg->lcfg_inllen1 || !lcfg->lcfg_inlbuf1) {
+ if (!LUSTRE_CFG_BUFLEN(lcfg, 1)) {
CERROR("No type passed!\n");
RETURN(-EINVAL);
}
- if (lcfg->lcfg_inlbuf1[lcfg->lcfg_inllen1 - 1] != 0) {
- CERROR("Type not nul terminated!\n");
- RETURN(-EINVAL);
- }
- typename = lcfg->lcfg_inlbuf1;
+ typename = lustre_cfg_string(lcfg, 1);
- if (!lcfg->lcfg_dev_namelen || !lcfg->lcfg_dev_name) {
+ if (!LUSTRE_CFG_BUFLEN(lcfg, 0)) {
CERROR("No name passed!\n");
RETURN(-EINVAL);
}
- if (lcfg->lcfg_dev_name[lcfg->lcfg_dev_namelen - 1] != 0) {
- CERROR("Name not nul terminated!\n");
- RETURN(-EINVAL);
- }
- name = lcfg->lcfg_dev_name;
+ name = lustre_cfg_string(lcfg, 0);
- if (!lcfg->lcfg_inllen2 || !lcfg->lcfg_inlbuf2) {
+ if (!LUSTRE_CFG_BUFLEN(lcfg, 2)) {
CERROR("No UUID passed!\n");
RETURN(-EINVAL);
}
- if (lcfg->lcfg_inlbuf2[lcfg->lcfg_inllen2 - 1] != 0) {
- CERROR("UUID not nul terminated!\n");
- RETURN(-EINVAL);
- }
- uuid = lcfg->lcfg_inlbuf2;
+ uuid = lustre_cfg_string(lcfg, 2);
- CDEBUG(D_IOCTL, "attach type %s name: %s uuid: %s\n",
- MKSTR(lcfg->lcfg_inlbuf1),
- MKSTR(lcfg->lcfg_dev_name), MKSTR(lcfg->lcfg_inlbuf2));
+ CDEBUG(D_CONFIG, "attach type %s name: %s uuid: %s\n",
+ MKSTR(typename), MKSTR(name), MKSTR(uuid));
/* find the type */
type = class_get_type(typename);
CERROR("OBD: unknown type: %s\n", typename);
RETURN(-EINVAL);
}
+ cleanup_phase = 1; /* class_put_type */
obd = class_name2obd(name);
if (obd != NULL) {
CERROR("obd %s already attached\n", name);
- RETURN(-EEXIST);
+ GOTO(out, rc = -EEXIST);
}
- obd = class_newdev(&dev);
+ obd = class_newdev(type);
if (obd == NULL)
- RETURN(-EINVAL);
-
- /* have we attached a type to this device */
- if (obd->obd_attached || obd->obd_type) {
- CERROR("OBD: Device %d already typed as %s.\n",
- obd->obd_minor, MKSTR(obd->obd_type->typ_name));
- RETURN(-EBUSY);
- }
-
- LASSERT(obd == (obd_dev + obd->obd_minor));
+ GOTO(out, rc = -EINVAL);
- minor = obd->obd_minor;
- memset(obd, 0, sizeof(*obd));
- obd->obd_minor = minor;
- obd->obd_type = type;
+ cleanup_phase = 2; /* class_release_dev */
+
INIT_LIST_HEAD(&obd->obd_exports);
obd->obd_num_exports = 0;
spin_lock_init(&obd->obd_dev_lock);
+ spin_lock_init(&obd->obd_osfs_lock);
+ obd->obd_osfs_age = jiffies - 1000 * HZ;
init_waitqueue_head(&obd->obd_refcount_waitq);
/* XXX belongs in setup not attach */
/* recovery data */
+ init_timer(&obd->obd_recovery_timer);
spin_lock_init(&obd->obd_processing_task_lock);
init_waitqueue_head(&obd->obd_next_transno_waitq);
- INIT_LIST_HEAD(&obd->obd_recovery_queue);
- INIT_LIST_HEAD(&obd->obd_delayed_reply_queue);
+ INIT_LIST_HEAD(&obd->obd_req_replay_queue);
+ INIT_LIST_HEAD(&obd->obd_lock_replay_queue);
+ INIT_LIST_HEAD(&obd->obd_final_req_queue);
- init_waitqueue_head(&obd->obd_commit_waitq);
+ spin_lock_init(&obd->obd_uncommitted_replies_lock);
+ INIT_LIST_HEAD(&obd->obd_uncommitted_replies);
len = strlen(name) + 1;
OBD_ALLOC(obd->obd_name, len);
- if (!obd->obd_name) {
- class_put_type(obd->obd_type);
- obd->obd_type = NULL;
- RETURN(-ENOMEM);
- }
+ if (!obd->obd_name)
+ GOTO(out, rc = -ENOMEM);
memcpy(obd->obd_name, name, len);
+
+ cleanup_phase = 3; /* free obd_name */
len = strlen(uuid);
if (len >= sizeof(obd->obd_uuid)) {
CERROR("uuid must be < "LPSZ" bytes long\n",
sizeof(obd->obd_uuid));
- OBD_FREE(obd->obd_name, strlen(obd->obd_name) + 1);
- class_put_type(obd->obd_type);
- obd->obd_type = NULL;
- RETURN(-EINVAL);
+ GOTO(out, rc = -EINVAL);
}
memcpy(obd->obd_uuid.uuid, uuid, len);
/* do the attach */
- if (OBP(obd, attach))
- err = OBP(obd,attach)(obd, sizeof *lcfg, lcfg);
+ if (OBP(obd, attach)) {
+ rc = OBP(obd,attach)(obd, sizeof *lcfg, lcfg);
+ if (rc)
+ GOTO(out, rc = -EINVAL);
+ }
- if (err) {
+ obd->obd_attached = 1;
+ type->typ_refcnt++;
+ CDEBUG(D_IOCTL, "OBD: dev %d attached type %s\n",
+ obd->obd_minor, typename);
+ RETURN(0);
+ out:
+ switch (cleanup_phase) {
+ case 3:
OBD_FREE(obd->obd_name, strlen(obd->obd_name) + 1);
- class_put_type(obd->obd_type);
- obd->obd_type = NULL;
- } else {
- obd->obd_attached = 1;
- type->typ_refcnt++;
- CDEBUG(D_IOCTL, "OBD: dev %d attached type %s\n",
- obd->obd_minor, typename);
+ case 2:
+ class_release_dev(obd);
+ case 1:
+ class_put_type(type);
}
- RETURN(err);
+ return rc;
}
-int class_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
+static int class_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
{
int err = 0;
struct obd_export *exp;
RETURN(err);
}
-int class_detach(struct obd_device *obd, struct lustre_cfg *lcfg)
+static int class_detach(struct obd_device *obd, struct lustre_cfg *lcfg)
{
- int minor;
int err = 0;
ENTRY;
obd->obd_attached = 0;
obd->obd_type->typ_refcnt--;
class_put_type(obd->obd_type);
- obd->obd_type = NULL;
- minor = obd->obd_minor;
- memset(obd, 0, sizeof(*obd));
- obd->obd_minor = minor;
+ class_release_dev(obd);
RETURN(err);
}
struct obd_export *exp, *n;
list_for_each_entry_safe(exp, n, &obd->obd_exports, exp_obd_chain) {
- CERROR("%s: %p %s %d %d %p\n",
+ struct ptlrpc_reply_state *rs;
+ struct ptlrpc_reply_state *first_reply = NULL;
+ int nreplies = 0;
+
+ list_for_each_entry (rs, &exp->exp_outstanding_replies,
+ rs_exp_list) {
+ if (nreplies == 0)
+ first_reply = rs;
+ nreplies++;
+ }
+
+ CERROR("%s: %p %s %d %d %d: %p %s\n",
obd->obd_name, exp, exp->exp_client_uuid.uuid,
atomic_read(&exp->exp_refcount),
- exp->exp_failed, exp->exp_outstanding_reply );
+ exp->exp_failed, nreplies, first_reply,
+ nreplies > 3 ? "..." : "");
}
}
-int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg)
+static int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg)
{
int flags = 0;
int err = 0;
CERROR("Device %d not setup\n", obd->obd_minor);
RETURN(-ENODEV);
}
-
- if (lcfg->lcfg_inlbuf1) {
- for (flag = lcfg->lcfg_inlbuf1; *flag != 0; flag++)
+ if (LUSTRE_CFG_BUFLEN(lcfg, 1) > 0) {
+ for (flag = lustre_cfg_string(lcfg, 1); *flag != 0; flag++)
switch (*flag) {
case 'F':
flags |= OBD_OPT_FORCE;
int rc;
if (!(flags & OBD_OPT_FORCE)) {
- CERROR("OBD device %d (%p) has refcount %d\n",
- obd->obd_minor, obd,
+ CERROR("OBD device %d (%p,%s) has refcount %d\n",
+ obd->obd_minor, obd, obd->obd_name,
atomic_read(&obd->obd_refcount));
+ portals_debug_dumplog();
dump_exports(obd);
GOTO(out, err = -EBUSY);
}
obd->obd_set_up = obd->obd_stopping = 0;
obd->obd_type->typ_refcnt--;
/* XXX this should be an LASSERT */
- if (atomic_read(&obd->obd_refcount) > 0)
- CERROR("%s still has refcount %d after "
- "cleanup.\n", obd->obd_name,
+ if (atomic_read(&obd->obd_refcount) > 0) {
+ CERROR("%s (%p) still has refcount %d after "
+ "cleanup.\n", obd->obd_name, obd,
atomic_read(&obd->obd_refcount));
+ dump_exports(obd);
+ }
}
RETURN(err);
+}
+
+int class_add_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
+{
+ struct obd_import *imp;
+ struct obd_uuid uuid;
+ int rc;
+ ENTRY;
+
+ if (LUSTRE_CFG_BUFLEN(lcfg, 1) < 1 ||
+ LUSTRE_CFG_BUFLEN(lcfg, 1) > sizeof(struct obd_uuid)) {
+ CERROR("invalid conn_uuid\n");
+ RETURN(-EINVAL);
+ }
+
+ if (strcmp(obd->obd_type->typ_name, OBD_MDC_DEVICENAME) &&
+ strcmp(obd->obd_type->typ_name, OBD_OSC_DEVICENAME)) {
+ CERROR("can't add connection on non-client dev\n");
+ RETURN(-EINVAL);
+ }
+ imp = obd->u.cli.cl_import;
+ if (!imp) {
+ CERROR("try to add conn on immature client dev\n");
+ RETURN(-EINVAL);
+ }
+
+ obd_str2uuid(&uuid, lustre_cfg_string(lcfg, 1));
+ rc = obd_add_conn(imp, &uuid, lcfg->lcfg_num);
+
+ RETURN(rc);
+}
+
+int class_del_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
+{
+ struct obd_import *imp;
+ struct obd_uuid uuid;
+ int rc;
+ ENTRY;
+
+ if (LUSTRE_CFG_BUFLEN(lcfg, 1) < 1 ||
+ LUSTRE_CFG_BUFLEN(lcfg, 1) > sizeof(struct obd_uuid)) {
+ CERROR("invalid conn_uuid\n");
+ RETURN(-EINVAL);
+ }
+
+ if (strcmp(obd->obd_type->typ_name, OBD_MDC_DEVICENAME) &&
+ strcmp(obd->obd_type->typ_name, OBD_OSC_DEVICENAME)) {
+ CERROR("can't add connection on non-client dev\n");
+ RETURN(-EINVAL);
+ }
+
+ imp = obd->u.cli.cl_import;
+ if (!imp) {
+ CERROR("try to del conn on immature client dev\n");
+ RETURN(-EINVAL);
+ }
+
+ obd_str2uuid(&uuid, lustre_cfg_string(lcfg, 1));
+ rc = obd_del_conn(imp, &uuid);
+
+ RETURN(rc);
}
LIST_HEAD(lustre_profile_list);
RETURN(NULL);
}
-int class_add_profile(int proflen, char *prof, int osclen, char *osc,
- int mdclen, char *mdc)
+int class_add_profile(int proflen, char *prof,
+ int lovlen, char *lov,
+ int lmvlen, char *lmv,
+ int gkclen, char *gkc)
{
struct lustre_profile *lprof;
int err = 0;
GOTO(out, err = -ENOMEM);
memcpy(lprof->lp_profile, prof, proflen);
- LASSERT(osclen == (strlen(osc) + 1));
- OBD_ALLOC(lprof->lp_osc, osclen);
+ LASSERT(lovlen == (strlen(lov) + 1));
+ OBD_ALLOC(lprof->lp_lov, lovlen);
if (lprof->lp_profile == NULL)
GOTO(out, err = -ENOMEM);
- memcpy(lprof->lp_osc, osc, osclen);
+ memcpy(lprof->lp_lov, lov, lovlen);
- if (mdclen > 0) {
- LASSERT(mdclen == (strlen(mdc) + 1));
- OBD_ALLOC(lprof->lp_mdc, mdclen);
- if (lprof->lp_mdc == NULL)
+ if (lmvlen > 0) {
+ LASSERT(lmvlen == (strlen(lmv) + 1));
+ OBD_ALLOC(lprof->lp_lmv, lmvlen);
+ if (lprof->lp_lmv == NULL)
GOTO(out, err = -ENOMEM);
- memcpy(lprof->lp_mdc, mdc, mdclen);
+ memcpy(lprof->lp_lmv, lmv, lmvlen);
}
-
+ if (gkclen > 0 ) {
+ LASSERT(gkclen == (strlen(gkc) + 1));
+ OBD_ALLOC(lprof->lp_gkc, gkclen);
+ if (lprof->lp_gkc == NULL)
+ GOTO(out, err = -ENOMEM);
+ memcpy(lprof->lp_gkc, gkc, gkclen);
+ }
+
list_add(&lprof->lp_list, &lustre_profile_list);
-
out:
RETURN(err);
}
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_lov, strlen(lprof->lp_lov) + 1);
+ if (lprof->lp_lmv)
+ OBD_FREE(lprof->lp_lmv, strlen(lprof->lp_lmv) + 1);
+ if (lprof->lp_gkc)
+ OBD_FREE(lprof->lp_gkc, strlen(lprof->lp_gkc) + 1);
OBD_FREE(lprof, sizeof *lprof);
}
}
struct obd_device *obd;
char str[PTL_NALFMT_SIZE];
int err;
+ ENTRY;
LASSERT(lcfg && !IS_ERR(lcfg));
- CDEBUG(D_IOCTL, "processing cmd: %x\n", lcfg->lcfg_command);
+ CDEBUG(D_CONFIG, "processing cmd: %x\n", lcfg->lcfg_command);
/* Commands that don't need a device */
switch(lcfg->lcfg_command) {
GOTO(out, err);
}
case LCFG_ADD_UUID: {
- CDEBUG(D_IOCTL, "adding mapping from uuid %s to nid "LPX64
- " (%s), nal %d\n", lcfg->lcfg_inlbuf1, lcfg->lcfg_nid,
+ CDEBUG(D_CONFIG, "adding mapping from uuid %s to nid "LPX64
+ " (%s), nal %x\n", lustre_cfg_string(lcfg, 1),
+ lcfg->lcfg_nid,
portals_nid2str(lcfg->lcfg_nal, lcfg->lcfg_nid, str),
lcfg->lcfg_nal);
- err = class_add_uuid(lcfg->lcfg_inlbuf1, lcfg->lcfg_nid,
- lcfg->lcfg_nal);
- GOTO(out, err);
+ err = class_add_uuid(lustre_cfg_string(lcfg, 1), lcfg->lcfg_nid,
+ lcfg->lcfg_nal);
+ GOTO(out, err);
}
case LCFG_DEL_UUID: {
- CDEBUG(D_IOCTL, "removing mappings for uuid %s\n",
- lcfg->lcfg_inlbuf1 == NULL ? "<all uuids>" :
- lcfg->lcfg_inlbuf1);
+ CDEBUG(D_CONFIG, "removing mappings for uuid %s\n",
+ (lcfg->lcfg_bufcount < 2 || LUSTRE_CFG_BUFLEN(lcfg, 1) == 0)
+ ? "<all uuids>" : lustre_cfg_string(lcfg, 1));
- err = class_del_uuid(lcfg->lcfg_inlbuf1);
+ err = class_del_uuid(lustre_cfg_string(lcfg, 1));
GOTO(out, err);
}
case LCFG_MOUNTOPT: {
- CDEBUG(D_IOCTL, "mountopt: profile %s osc %s mdc %s\n",
- lcfg->lcfg_inlbuf1, lcfg->lcfg_inlbuf2,
- lcfg->lcfg_inlbuf3);
+ CDEBUG(D_CONFIG, "mountopt: profile %s osc %s mdc %s gkc %s \n",
+ lustre_cfg_string(lcfg, 1),
+ lustre_cfg_string(lcfg, 2),
+ lustre_cfg_string(lcfg, 3),
+ lustre_cfg_string(lcfg, 4));
/* set these mount options somewhere, so ll_fill_super
* can find them. */
- err = class_add_profile(lcfg->lcfg_inllen1, lcfg->lcfg_inlbuf1,
- lcfg->lcfg_inllen2, lcfg->lcfg_inlbuf2,
- lcfg->lcfg_inllen3, lcfg->lcfg_inlbuf3);
+ err = class_add_profile(LUSTRE_CFG_BUFLEN(lcfg, 1),
+ lustre_cfg_string(lcfg, 1),
+ LUSTRE_CFG_BUFLEN(lcfg, 2),
+ lustre_cfg_string(lcfg, 2),
+ LUSTRE_CFG_BUFLEN(lcfg, 3),
+ lustre_cfg_string(lcfg, 3),
+ LUSTRE_CFG_BUFLEN(lcfg, 4),
+ lustre_cfg_string(lcfg, 4));
GOTO(out, err);
}
case LCFG_DEL_MOUNTOPT: {
- CDEBUG(D_IOCTL, "mountopt: profile %s\n", lcfg->lcfg_inlbuf1);
+ CDEBUG(D_CONFIG, "mountopt: profile %s\n",
+ lustre_cfg_string(lcfg, 1));
/* set these mount options somewhere, so ll_fill_super
* can find them. */
- class_del_profile(lcfg->lcfg_inlbuf1);
+ class_del_profile(lustre_cfg_string(lcfg, 1));
GOTO(out, err = 0);
}
case LCFG_SET_TIMEOUT: {
- CDEBUG(D_IOCTL, "changing lustre timeout from %d to %d\n",
+ CDEBUG(D_CONFIG, "changing lustre timeout from %d to %d\n",
obd_timeout,
lcfg->lcfg_num);
obd_timeout = lcfg->lcfg_num;
GOTO(out, err = 0);
}
case LCFG_SET_UPCALL: {
- CDEBUG(D_IOCTL, "setting lustre ucpall to: %s\n",
- lcfg->lcfg_inlbuf1);
- if (lcfg->lcfg_inllen1 > sizeof obd_lustre_upcall)
+ CDEBUG(D_CONFIG, "setting lustre ucpall to: %s\n",
+ lustre_cfg_string(lcfg, 1));
+ if (LUSTRE_CFG_BUFLEN(lcfg, 1) > sizeof obd_lustre_upcall)
GOTO(out, err = -EINVAL);
- memcpy(obd_lustre_upcall, lcfg->lcfg_inlbuf1,
- lcfg->lcfg_inllen1);
+ strncpy(obd_lustre_upcall, lustre_cfg_string(lcfg, 1),
+ sizeof (obd_lustre_upcall));
GOTO(out, err = 0);
}
}
-
+
/* Commands that require a device */
- obd = class_name2obd(lcfg->lcfg_dev_name);
+ obd = class_name2obd(lustre_cfg_string(lcfg, 0));
if (obd == NULL) {
- if (lcfg->lcfg_dev_name == NULL)
- CERROR("this lcfg command requires a device name\n");
+ if (!LUSTRE_CFG_BUFLEN(lcfg, 0))
+ CERROR("this lcfg command %d requires a device name\n",
+ lcfg->lcfg_command);
else
- CERROR("no device for: %s\n", lcfg->lcfg_dev_name);
+ CERROR("no device for: %s\n",
+ lustre_cfg_string(lcfg, 0));
GOTO(out, err = -EINVAL);
}
err = class_cleanup(obd, lcfg);
GOTO(out, err = 0);
}
+ case LCFG_ADD_CONN: {
+ err = class_add_conn(obd, lcfg);
+ GOTO(out, err = 0);
+ }
+ case LCFG_DEL_CONN: {
+ err = class_del_conn(obd, lcfg);
+ GOTO(out, err = 0);
+ }
default: {
- CERROR("Unknown command: %d\n", lcfg->lcfg_command);
- GOTO(out, err = -EINVAL);
+ err = obd_process_config(obd, sizeof(*lcfg), lcfg);
+ GOTO(out, err);
}
}
out:
- RETURN(err);
+ return err;
}
-static int class_config_llog_handler(struct llog_handle * handle,
- struct llog_rec_hdr *rec, void *data)
+static int class_config_parse_handler(struct llog_handle * handle,
+ struct llog_rec_hdr *rec, void *data)
{
struct config_llog_instance *cfg = data;
int cfg_len = rec->lrh_len;
char *cfg_buf = (char*) (rec + 1);
int rc = 0;
+ ENTRY;
if (rec->lrh_type == OBD_CFG_REC) {
- char *buf;
- struct lustre_cfg *lcfg;
- char *old_name = NULL;
- int old_len = 0;
- char *old_uuid = NULL;
- int old_uuid_len = 0;
+ struct lustre_cfg *lcfg, *lcfg_new;
+ struct lustre_cfg_bufs bufs;
char *inst_name = NULL;
int inst_len = 0;
- rc = lustre_cfg_getdata(&buf, cfg_len, cfg_buf, 1);
+ lcfg = (struct lustre_cfg *)cfg_buf;
+ if (lcfg->lcfg_version == __swab32(LUSTRE_CFG_VERSION))
+ lustre_swab_lustre_cfg(lcfg);
+
+ rc = lustre_cfg_sanity_check(cfg_buf, cfg_len);
if (rc)
GOTO(out, rc);
- lcfg = (struct lustre_cfg* ) buf;
-
- if (cfg && cfg->cfg_instance && lcfg->lcfg_dev_name) {
- inst_len = strlen(lcfg->lcfg_dev_name) +
- strlen(cfg->cfg_instance) + 2;
- OBD_ALLOC(inst_name, inst_len);
- if (inst_name == NULL)
- GOTO(out, rc = -ENOMEM);
- sprintf(inst_name, "%s-%s", lcfg->lcfg_dev_name,
- cfg->cfg_instance);
- old_name = lcfg->lcfg_dev_name;
- old_len = lcfg->lcfg_dev_namelen;
- lcfg->lcfg_dev_name = inst_name;
- lcfg->lcfg_dev_namelen = strlen(inst_name) + 1;
- }
-
- if (cfg && lcfg->lcfg_command == LCFG_ATTACH) {
- old_uuid = lcfg->lcfg_inlbuf2;
- old_uuid_len = lcfg->lcfg_inllen2;
- lcfg->lcfg_inlbuf2 = (char*)&cfg->cfg_uuid.uuid;
- lcfg->lcfg_inllen2 = sizeof(cfg->cfg_uuid);
+ lustre_cfg_bufs_init(&bufs, lcfg);
+ if (cfg && cfg->cfg_instance) {
+ if (LUSTRE_CFG_BUFLEN(lcfg, 0) > 0) {
+ inst_len = LUSTRE_CFG_BUFLEN(lcfg, 0) +
+ strlen(cfg->cfg_instance) + 1;
+ OBD_ALLOC(inst_name, inst_len);
+ if (inst_name == NULL)
+ GOTO(out, rc = -ENOMEM);
+ sprintf(inst_name, "%s-%s",
+ lustre_cfg_string(lcfg, 0),
+ cfg->cfg_instance);
+ lustre_cfg_bufs_set_string(&bufs, 0, inst_name);
+ }
+ if (lcfg->lcfg_command == LCFG_SETUP) {
+ /*add cfg_instance to the end of lcfg buffers*/
+ lustre_cfg_bufs_set_string(&bufs,
+ bufs.lcfg_bufcount,
+ cfg->cfg_instance);
+ }
}
- rc = class_process_config(lcfg);
-
- if (old_name) {
- lcfg->lcfg_dev_name = old_name;
- lcfg->lcfg_dev_namelen = old_len;
- OBD_FREE(inst_name, inst_len);
+ if (cfg && (lcfg->lcfg_command == LCFG_ATTACH)){
+ /*Very Dirty Hack fix here, for mds add,
+ *the mdc in mds should not
+ *change uuid FIXME: Wangdi
+ */
+ if (memcmp(lustre_cfg_string(lcfg, 1), OBD_MDC_DEVICENAME,
+ strlen(OBD_MDC_DEVICENAME)) ||
+ (cfg->cfg_flags & CFG_MODIFY_UUID_FL))
+ lustre_cfg_bufs_set_string(&bufs, 2,
+ (char *)cfg->cfg_uuid.uuid);
}
+ lcfg_new = lustre_cfg_new(lcfg->lcfg_command, &bufs);
- if (old_uuid) {
- lcfg->lcfg_inlbuf2 = old_uuid;
- lcfg->lcfg_inllen2 = old_uuid_len;
- }
+ lcfg_new->lcfg_num = lcfg->lcfg_num;
+ lcfg_new->lcfg_flags = lcfg->lcfg_flags;
+ lcfg_new->lcfg_nid = lcfg->lcfg_nid;
+ lcfg_new->lcfg_nal = lcfg->lcfg_nal;
+
+ rc = class_process_config(lcfg_new);
+ lustre_cfg_free(lcfg_new);
- lustre_cfg_freedata(buf, cfg_len);
+ if (inst_name)
+ OBD_FREE(inst_name, inst_len);
} else if (rec->lrh_type == PTL_CFG_REC) {
struct portals_cfg *pcfg = (struct portals_cfg *)cfg_buf;
- if (pcfg->pcfg_command ==NAL_CMD_REGISTER_MYNID &&
+ if (pcfg->pcfg_command == NAL_CMD_REGISTER_MYNID &&
cfg->cfg_local_nid != PTL_NID_ANY) {
pcfg->pcfg_nid = cfg->cfg_local_nid;
}
- rc = kportal_nal_cmd(pcfg);
+ rc = libcfs_nal_cmd(pcfg);
+ } else {
+ CERROR("unrecognized record type: 0x%x\n", rec->lrh_type);
}
out:
RETURN(rc);
}
-int class_config_parse_llog(struct llog_ctxt *ctxt, char *name,
- struct config_llog_instance *cfg)
+int class_config_process_llog(struct llog_ctxt *ctxt, char *name,
+ struct config_llog_instance *cfg)
{
struct llog_handle *llh;
int rc, rc2;
ENTRY;
- rc = llog_create(ctxt, &llh, NULL, name);
+ rc = llog_open(ctxt, &llh, NULL, name, 0);
if (rc)
RETURN(rc);
rc = llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL);
- if (rc)
- GOTO(parse_out, rc);
+ if (rc == 0)
+ rc = llog_process(llh, class_config_parse_handler, cfg, NULL);
- rc = llog_process(llh, class_config_llog_handler, cfg, NULL);
-parse_out:
rc2 = llog_close(llh);
if (rc == 0)
rc = rc2;
RETURN(rc);
-
}
-static int class_config_dump_handler(struct llog_handle * handle,
- struct llog_rec_hdr *rec, void *data)
+int class_config_dump_handler(struct llog_handle * handle,
+ struct llog_rec_hdr *rec, void *data)
{
int cfg_len = rec->lrh_len;
char *cfg_buf = (char*) (rec + 1);
int rc = 0;
-
+ ENTRY;
if (rec->lrh_type == OBD_CFG_REC) {
- char *buf;
struct lustre_cfg *lcfg;
+ int i;
- rc = lustre_cfg_getdata(&buf, cfg_len, cfg_buf, 1);
+ rc = lustre_cfg_sanity_check(cfg_buf, cfg_len);
if (rc)
GOTO(out, rc);
- lcfg = (struct lustre_cfg* ) buf;
+ lcfg = (struct lustre_cfg *)cfg_buf;
CDEBUG(D_INFO, "lcfg command: %x\n", lcfg->lcfg_command);
- if (lcfg->lcfg_dev_name)
+ if (LUSTRE_CFG_BUFLEN(lcfg, 0) > 0)
CDEBUG(D_INFO, " devname: %s\n",
- lcfg->lcfg_dev_name);
+ lustre_cfg_string(lcfg, 0));
if (lcfg->lcfg_flags)
CDEBUG(D_INFO, " flags: %x\n", lcfg->lcfg_flags);
if (lcfg->lcfg_nid)
CDEBUG(D_INFO, " nal: %x\n", lcfg->lcfg_nal);
if (lcfg->lcfg_num)
CDEBUG(D_INFO, " nal: %x\n", lcfg->lcfg_num);
- if (lcfg->lcfg_inlbuf1)
- CDEBUG(D_INFO, " inlbuf1: %s\n",lcfg->lcfg_inlbuf1);
- if (lcfg->lcfg_inlbuf2)
- CDEBUG(D_INFO, " inlbuf1: %s\n",lcfg->lcfg_inlbuf2);
- if (lcfg->lcfg_inlbuf3)
- CDEBUG(D_INFO, " inlbuf1: %s\n",lcfg->lcfg_inlbuf3);
- if (lcfg->lcfg_inlbuf4)
- CDEBUG(D_INFO, " inlbuf1: %s\n",lcfg->lcfg_inlbuf4);
-
- lustre_cfg_freedata(buf, cfg_len);
+ for (i = 1; i < lcfg->lcfg_bufcount; i++)
+ if (LUSTRE_CFG_BUFLEN(lcfg, i) > 0)
+ CDEBUG(D_INFO, " inlbuf%d: %s\n", i,
+ lustre_cfg_string(lcfg, i));
} else if (rec->lrh_type == PTL_CFG_REC) {
struct portals_cfg *pcfg = (struct portals_cfg *)cfg_buf;
-
CDEBUG(D_INFO, "pcfg command: %d\n", pcfg->pcfg_command);
if (pcfg->pcfg_nal)
- CDEBUG(D_INFO, " nal: %d\n",
+ CDEBUG(D_INFO, " nal: %x\n",
pcfg->pcfg_nal);
if (pcfg->pcfg_gw_nal)
- CDEBUG(D_INFO, " gw_nal: %d\n",
+ CDEBUG(D_INFO, " gw_nal: %x\n",
pcfg->pcfg_gw_nal);
if (pcfg->pcfg_nid)
CDEBUG(D_INFO, " nid: "LPX64"\n",
if (pcfg->pcfg_flags)
CDEBUG(D_INFO, " flags: %x\n",
pcfg->pcfg_flags);
+ } else {
+ CERROR("unhandled lrh_type: %#x\n", rec->lrh_type);
+ rc = -EINVAL;
}
out:
RETURN(rc);
int rc, rc2;
ENTRY;
- rc = llog_create(ctxt, &llh, NULL, name);
+ rc = llog_open(ctxt, &llh, NULL, name, 0);
if (rc)
RETURN(rc);
rc = llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL);
- if (rc)
- GOTO(parse_out, rc);
+ if (rc == 0)
+ rc = llog_process(llh, class_config_dump_handler, cfg, NULL);
- rc = llog_process(llh, class_config_dump_handler, cfg, NULL);
-parse_out:
rc2 = llog_close(llh);
if (rc == 0)
rc = rc2;
RETURN(rc);
-
}