X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmgs%2Fmgs_llog.c;h=6ba85cabc1d7a27a801417c02ffe0d85caacd755;hp=f3cc75472dce9f314c6bcf61f057d642cb57da2d;hb=f52e7ac294e9091b1ef8e9f8151bd47625be5d8d;hpb=392471b575ad15eb64a10e83e3080aeaf94bca9e diff --git a/lustre/mgs/mgs_llog.c b/lustre/mgs/mgs_llog.c index f3cc754..6ba85ca 100644 --- a/lustre/mgs/mgs_llog.c +++ b/lustre/mgs/mgs_llog.c @@ -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, 2013, Intel Corporation. + * Copyright (c) 2011, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -46,6 +46,7 @@ #define D_MGS D_CONFIG #include +#include #include #include #include @@ -54,8 +55,9 @@ /********************** Class functions ********************/ +/* Find all logs in CONFIG directory and link then into list */ int class_dentry_readdir(const struct lu_env *env, - struct mgs_device *mgs, cfs_list_t *list) + struct mgs_device *mgs, struct list_head *log_list) { struct dt_object *dir = mgs->mgs_configs_dir; const struct dt_it_ops *iops; @@ -64,13 +66,13 @@ int class_dentry_readdir(const struct lu_env *env, char *key; int rc, key_sz; - CFS_INIT_LIST_HEAD(list); + INIT_LIST_HEAD(log_list); LASSERT(dir); LASSERT(dir->do_index_ops); iops = &dir->do_index_ops->dio_it; - it = iops->init(env, dir, LUDA_64BITHASH, BYPASS_CAPA); + it = iops->init(env, dir, LUDA_64BITHASH); if (IS_ERR(it)) RETURN(PTR_ERR(it)); @@ -104,10 +106,10 @@ int class_dentry_readdir(const struct lu_env *env, break; } - memcpy(de->name, key, key_sz); - de->name[key_sz] = 0; + memcpy(de->mde_name, key, key_sz); + de->mde_name[key_sz] = 0; - cfs_list_add(&de->list, list); + list_add(&de->mde_list, log_list); next: rc = iops->next(env, it); @@ -312,10 +314,10 @@ static void mgs_free_fsdb_srpc(struct fs_db *fsdb) struct fs_db *mgs_find_fsdb(struct mgs_device *mgs, char *fsname) { struct fs_db *fsdb; - cfs_list_t *tmp; + struct list_head *tmp; - cfs_list_for_each(tmp, &mgs->mgs_fs_db_list) { - fsdb = cfs_list_entry(tmp, struct fs_db, fsdb_list); + list_for_each(tmp, &mgs->mgs_fs_db_list) { + fsdb = list_entry(tmp, struct fs_db, fsdb_list); if (strcmp(fsdb->fsdb_name, fsname) == 0) return fsdb; } @@ -332,12 +334,12 @@ static struct fs_db *mgs_new_fsdb(const struct lu_env *env, if (strlen(fsname) >= sizeof(fsdb->fsdb_name)) { CERROR("fsname %s is too long\n", fsname); - RETURN(NULL); + RETURN(ERR_PTR(-EINVAL)); } OBD_ALLOC_PTR(fsdb); if (!fsdb) - RETURN(NULL); + RETURN(ERR_PTR(-ENOMEM)); strcpy(fsdb->fsdb_name, fsname); mutex_init(&fsdb->fsdb_mutex); @@ -346,6 +348,7 @@ static struct fs_db *mgs_new_fsdb(const struct lu_env *env, if (strcmp(fsname, MGSSELF_NAME) == 0) { set_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags); + fsdb->fsdb_mgs = mgs; } else { OBD_ALLOC(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE); OBD_ALLOC(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE); @@ -367,7 +370,7 @@ static struct fs_db *mgs_new_fsdb(const struct lu_env *env, lproc_mgs_add_live(mgs, fsdb); } - cfs_list_add(&fsdb->fsdb_list, &mgs->mgs_fs_db_list); + list_add(&fsdb->fsdb_list, &mgs->mgs_fs_db_list); RETURN(fsdb); err: @@ -378,15 +381,15 @@ err: name_destroy(&fsdb->fsdb_clilov); name_destroy(&fsdb->fsdb_clilmv); OBD_FREE_PTR(fsdb); - RETURN(NULL); + RETURN(ERR_PTR(rc)); } static void mgs_free_fsdb(struct mgs_device *mgs, struct fs_db *fsdb) { - /* wait for anyone with the sem */ + /* wait for anyone with the sem */ mutex_lock(&fsdb->fsdb_mutex); lproc_mgs_del_live(mgs, fsdb); - cfs_list_del(&fsdb->fsdb_list); + list_del(&fsdb->fsdb_list); /* deinitialize fsr */ mgs_ir_fini_fs(mgs, fsdb); @@ -404,21 +407,22 @@ static void mgs_free_fsdb(struct mgs_device *mgs, struct fs_db *fsdb) int mgs_init_fsdb_list(struct mgs_device *mgs) { - CFS_INIT_LIST_HEAD(&mgs->mgs_fs_db_list); + INIT_LIST_HEAD(&mgs->mgs_fs_db_list); return 0; } int mgs_cleanup_fsdb_list(struct mgs_device *mgs) { - struct fs_db *fsdb; - cfs_list_t *tmp, *tmp2; + struct fs_db *fsdb; + struct list_head *tmp, *tmp2; + 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); + list_for_each_safe(tmp, tmp2, &mgs->mgs_fs_db_list) { + fsdb = list_entry(tmp, struct fs_db, fsdb_list); mgs_free_fsdb(mgs, fsdb); - } + } mutex_unlock(&mgs->mgs_mutex); - return 0; + return 0; } int mgs_find_or_make_fsdb(const struct lu_env *env, @@ -440,11 +444,11 @@ int mgs_find_or_make_fsdb(const struct lu_env *env, CDEBUG(D_MGS, "Creating new db\n"); fsdb = mgs_new_fsdb(env, mgs, name); /* lock fsdb_mutex until the db is loaded from llogs */ - if (fsdb) + if (!IS_ERR(fsdb)) mutex_lock(&fsdb->fsdb_mutex); mutex_unlock(&mgs->mgs_mutex); - if (!fsdb) - RETURN(-ENOMEM); + if (IS_ERR(fsdb)) + RETURN(PTR_ERR(fsdb)); if (!test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) { /* populate the db from the client llog */ @@ -556,13 +560,14 @@ static int mgs_set_index(const struct lu_env *env, fsdb->fsdb_mdt_count ++; } - if (mti->mti_stripe_index >= INDEX_MAP_SIZE * 8) { - LCONSOLE_ERROR_MSG(0x13f, "Server %s requested index %d, " - "but the max index is %d.\n", - mti->mti_svname, mti->mti_stripe_index, - INDEX_MAP_SIZE * 8); + /* the last index(0xffff) is reserved for default value. */ + if (mti->mti_stripe_index >= INDEX_MAP_SIZE * 8 - 1) { + LCONSOLE_ERROR_MSG(0x13f, "Server %s requested index %u, " + "but index must be less than %u.\n", + mti->mti_svname, mti->mti_stripe_index, + INDEX_MAP_SIZE * 8 - 1); GOTO(out_up, rc = -ERANGE); - } + } if (test_bit(mti->mti_stripe_index, imap)) { if ((mti->mti_flags & LDD_F_VIRGIN) && @@ -639,11 +644,7 @@ static int mgs_modify_handler(const struct lu_env *env, marker->cm_flags &= ~CM_EXCLUDE; /* in case we're unexcluding */ marker->cm_flags |= mml->mml_marker.cm_flags; marker->cm_canceltime = mml->mml_marker.cm_canceltime; - /* Header and tail are added back to lrh_len in - llog_lvfs_write_rec */ - rec->lrh_len = cfg_len; - rc = llog_write(env, llh, rec, NULL, 0, (void *)lcfg, - rec->lrh_index); + rc = llog_write(env, llh, rec, rec->lrh_index); if (!rc) mml->mml_modified++; } @@ -783,35 +784,12 @@ static int check_markers(struct lustre_cfg *lcfg, return 0; } -static int record_lcfg(const struct lu_env *env, struct llog_handle *llh, - struct lustre_cfg *lcfg) -{ - struct llog_rec_hdr rec; - int buflen, rc; - - if (!lcfg || !llh) - return -ENOMEM; - - LASSERT(llh->lgh_ctxt); - - buflen = lustre_cfg_len(lcfg->lcfg_bufcount, - lcfg->lcfg_buflens); - rec.lrh_len = llog_data_len(buflen); - rec.lrh_type = OBD_CFG_REC; - - /* idx = -1 means append */ - rc = llog_write(env, llh, &rec, NULL, 0, (void *)lcfg, -1); - if (rc) - CERROR("failed %d\n", rc); - return rc; -} - static int record_base(const struct lu_env *env, struct llog_handle *llh, char *cfgname, lnet_nid_t nid, int cmd, char *s1, char *s2, char *s3, char *s4) { - struct mgs_thread_info *mgi = mgs_env_info(env); - struct lustre_cfg *lcfg; + struct mgs_thread_info *mgi = mgs_env_info(env); + struct llog_cfg_rec *lcr; int rc; CDEBUG(D_MGS, "lcfg %s %#x %s %s %s %s\n", cfgname, @@ -827,19 +805,19 @@ static int record_base(const struct lu_env *env, struct llog_handle *llh, if (s4) lustre_cfg_bufs_set_string(&mgi->mgi_bufs, 4, s4); - lcfg = lustre_cfg_new(cmd, &mgi->mgi_bufs); - if (!lcfg) + lcr = lustre_cfg_rec_new(cmd, &mgi->mgi_bufs); + if (lcr == NULL) return -ENOMEM; - lcfg->lcfg_nid = nid; - rc = record_lcfg(env, llh, lcfg); + lcr->lcr_cfg.lcfg_nid = nid; + rc = llog_write(env, llh, &lcr->lcr_hdr, LLOG_NEXT_IDX); - lustre_cfg_free(lcfg); + lustre_cfg_rec_free(lcr); - if (rc) { - CERROR("error %d: lcfg %s %#x %s %s %s %s\n", rc, cfgname, - cmd, s1, s2, s3, s4); - } + if (rc < 0) + CDEBUG(D_MGS, + "failed to write lcfg %s %#x %s %s %s %s: rc = %d\n", + cfgname, cmd, s1, s2, s3, s4, rc); return rc; } @@ -847,21 +825,24 @@ 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); + return record_base(env, llh, NULL, nid, LCFG_ADD_UUID, uuid, + NULL, NULL, NULL); } static inline int record_add_conn(const struct lu_env *env, struct llog_handle *llh, char *devname, char *uuid) { - return record_base(env, llh, devname, 0, LCFG_ADD_CONN, uuid, 0, 0, 0); + return record_base(env, llh, devname, 0, LCFG_ADD_CONN, uuid, + NULL, NULL, NULL); } static inline int record_attach(const struct lu_env *env, struct llog_handle *llh, char *devname, char *type, char *uuid) { - return record_base(env, llh,devname, 0, LCFG_ATTACH, type, uuid, 0, 0); + return record_base(env, llh, devname, 0, LCFG_ATTACH, type, uuid, + NULL, NULL); } static inline int record_setup(const struct lu_env *env, @@ -996,7 +977,7 @@ static int mgs_replace_handler(const struct lu_env *env, RETURN(0); copy_out: /* Record is placed in temporary llog as is */ - rc = llog_write(env, mrul->temp_llh, rec, NULL, 0, NULL, -1); + rc = llog_write(env, mrul->temp_llh, rec, LLOG_NEXT_IDX); 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, @@ -1092,9 +1073,10 @@ static int mgs_replace_nids_log(const struct lu_env *env, 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); + strlcpy(mrul->target.mti_svname, devname, + sizeof(mrul->target.mti_svname)); /* parse nids later */ - strncpy(mrul->target.mti_params, nids, MTI_PARAM_MAXLEN); + strlcpy(mrul->target.mti_params, nids, sizeof(mrul->target.mti_params)); /* Copy records to this temporary llog */ mrul->temp_llh = orig_llh; @@ -1290,35 +1272,36 @@ out: static int record_lov_setup(const struct lu_env *env, struct llog_handle *llh, char *devname, struct lov_desc *desc) { - struct mgs_thread_info *mgi = mgs_env_info(env); - struct lustre_cfg *lcfg; + struct mgs_thread_info *mgi = mgs_env_info(env); + struct llog_cfg_rec *lcr; int rc; lustre_cfg_bufs_reset(&mgi->mgi_bufs, devname); lustre_cfg_bufs_set(&mgi->mgi_bufs, 1, desc, sizeof(*desc)); - lcfg = lustre_cfg_new(LCFG_SETUP, &mgi->mgi_bufs); - if (!lcfg) + lcr = lustre_cfg_rec_new(LCFG_SETUP, &mgi->mgi_bufs); + if (lcr == NULL) return -ENOMEM; - rc = record_lcfg(env, llh, lcfg); - lustre_cfg_free(lcfg); + rc = llog_write(env, llh, &lcr->lcr_hdr, LLOG_NEXT_IDX); + lustre_cfg_rec_free(lcr); return rc; } static int record_lmv_setup(const struct lu_env *env, struct llog_handle *llh, char *devname, struct lmv_desc *desc) { - struct mgs_thread_info *mgi = mgs_env_info(env); - struct lustre_cfg *lcfg; + struct mgs_thread_info *mgi = mgs_env_info(env); + struct llog_cfg_rec *lcr; int rc; lustre_cfg_bufs_reset(&mgi->mgi_bufs, devname); lustre_cfg_bufs_set(&mgi->mgi_bufs, 1, desc, sizeof(*desc)); - lcfg = lustre_cfg_new(LCFG_SETUP, &mgi->mgi_bufs); - - rc = record_lcfg(env, llh, lcfg); + lcr = lustre_cfg_rec_new(LCFG_SETUP, &mgi->mgi_bufs); + if (lcr == NULL) + return -ENOMEM; - lustre_cfg_free(lcfg); + rc = llog_write(env, llh, &lcr->lcr_hdr, LLOG_NEXT_IDX); + lustre_cfg_rec_free(lcr); return rc; } @@ -1337,8 +1320,8 @@ static inline int record_lov_add(const struct lu_env *env, char *lov_name, char *ost_uuid, char *index, char *gen) { - return record_base(env,llh,lov_name,0,LCFG_LOV_ADD_OBD, - ost_uuid, index, gen, 0); + return record_base(env, llh, lov_name, 0, LCFG_LOV_ADD_OBD, + ost_uuid, index, gen, NULL); } static inline int record_mount_opt(const struct lu_env *env, @@ -1346,8 +1329,8 @@ static inline int record_mount_opt(const struct lu_env *env, char *profile, char *lov_name, char *mdc_name) { - return record_base(env,llh,NULL,0,LCFG_MOUNTOPT, - profile,lov_name,mdc_name,0); + return record_base(env, llh, NULL, 0, LCFG_MOUNTOPT, + profile, lov_name, mdc_name, NULL); } static int record_marker(const struct lu_env *env, @@ -1356,7 +1339,7 @@ static int record_marker(const struct lu_env *env, char *tgtname, char *comment) { struct mgs_thread_info *mgi = mgs_env_info(env); - struct lustre_cfg *lcfg; + struct llog_cfg_rec *lcr; int rc; int cplen = 0; @@ -1378,12 +1361,12 @@ static int record_marker(const struct lu_env *env, lustre_cfg_bufs_reset(&mgi->mgi_bufs, NULL); lustre_cfg_bufs_set(&mgi->mgi_bufs, 1, &mgi->mgi_marker, sizeof(mgi->mgi_marker)); - lcfg = lustre_cfg_new(LCFG_MARKER, &mgi->mgi_bufs); - if (!lcfg) + lcr = lustre_cfg_rec_new(LCFG_MARKER, &mgi->mgi_bufs); + if (lcr == NULL) return -ENOMEM; - rc = record_lcfg(env, llh, lcfg); - lustre_cfg_free(lcfg); + rc = llog_write(env, llh, &lcr->lcr_hdr, LLOG_NEXT_IDX); + lustre_cfg_rec_free(lcr); return rc; } @@ -1435,25 +1418,23 @@ static int record_end_log(const struct lu_env *env, struct llog_handle **llh) /* write an lcfg directly into a log (with markers) */ static int mgs_write_log_direct(const struct lu_env *env, struct mgs_device *mgs, struct fs_db *fsdb, - char *logname, struct lustre_cfg *lcfg, - char *devname, char *comment) + char *logname, struct llog_cfg_rec *lcr, + char *devname, char *comment) { - struct llog_handle *llh = NULL; - int rc; - ENTRY; + struct llog_handle *llh = NULL; + int rc; - if (!lcfg) - RETURN(-ENOMEM); + ENTRY; rc = record_start_log(env, mgs, &llh, logname); - if (rc) - RETURN(rc); + if (rc) + RETURN(rc); /* FIXME These should be a single journal transaction */ rc = record_marker(env, llh, fsdb, CM_START, devname, comment); if (rc) GOTO(out_end, rc); - rc = record_lcfg(env, llh, lcfg); + rc = llog_write(env, llh, &lcr->lcr_hdr, LLOG_NEXT_IDX); if (rc) GOTO(out_end, rc); rc = record_marker(env, llh, fsdb, CM_END, devname, comment); @@ -1465,79 +1446,60 @@ out_end: } /* write the lcfg in all logs for the given fs */ -int mgs_write_log_direct_all(const struct lu_env *env, - struct mgs_device *mgs, - struct fs_db *fsdb, - struct mgs_target_info *mti, - struct lustre_cfg *lcfg, - char *devname, char *comment, - int server_only) +static int mgs_write_log_direct_all(const struct lu_env *env, + struct mgs_device *mgs, + struct fs_db *fsdb, + struct mgs_target_info *mti, + struct llog_cfg_rec *lcr, char *devname, + char *comment, int server_only) { - cfs_list_t list; - struct mgs_direntry *dirent, *n; - char *fsname = mti->mti_fsname; - char *logname; - int rc = 0, len = strlen(fsname); - ENTRY; + struct list_head log_list; + struct mgs_direntry *dirent, *n; + char *fsname = mti->mti_fsname; + int rc = 0, len = strlen(fsname); - /* We need to set params for any future logs - as well. FIXME Append this file to every new log. - Actually, we should store as params (text), not llogs. Or - in a database. */ - rc = name_create(&logname, fsname, "-params"); + ENTRY; + /* Find all the logs in the CONFIGS directory */ + rc = class_dentry_readdir(env, mgs, &log_list); if (rc) RETURN(rc); - if (mgs_log_is_empty(env, mgs, logname)) { - struct llog_handle *llh = NULL; - rc = record_start_log(env, mgs, &llh, logname); - if (rc == 0) - record_end_log(env, &llh); - } - name_destroy(&logname); - if (rc) - RETURN(rc); - /* Find all the logs in the CONFIGS directory */ - rc = class_dentry_readdir(env, mgs, &list); - if (rc) - RETURN(rc); - - /* Could use fsdb index maps instead of directory listing */ - cfs_list_for_each_entry_safe(dirent, n, &list, list) { - cfs_list_del(&dirent->list); - /* don't write to sptlrpc rule log */ - if (strstr(dirent->name, "-sptlrpc") != NULL) + /* Could use fsdb index maps instead of directory listing */ + list_for_each_entry_safe(dirent, n, &log_list, mde_list) { + list_del_init(&dirent->mde_list); + /* don't write to sptlrpc rule log */ + if (strstr(dirent->mde_name, "-sptlrpc") != NULL) goto next; /* caller wants write server logs only */ - if (server_only && strstr(dirent->name, "-client") != NULL) + if (server_only && strstr(dirent->mde_name, "-client") != NULL) goto next; - if (strncmp(fsname, dirent->name, len) == 0) { - CDEBUG(D_MGS, "Changing log %s\n", dirent->name); - /* Erase any old settings of this same parameter */ - rc = mgs_modify(env, mgs, fsdb, mti, dirent->name, - devname, comment, CM_SKIP); - if (rc < 0) - CERROR("%s: Can't modify llog %s: rc = %d\n", - mgs->mgs_obd->obd_name, dirent->name,rc); - /* Write the new one */ - if (lcfg) { - rc = mgs_write_log_direct(env, mgs, fsdb, - dirent->name, - lcfg, devname, - comment); - if (rc) - CERROR("%s: writing log %s: rc = %d\n", - mgs->mgs_obd->obd_name, - dirent->name, rc); - } - } + if (strlen(dirent->mde_name) <= len || + strncmp(fsname, dirent->mde_name, len) != 0 || + dirent->mde_name[len] != '-') + goto next; + + CDEBUG(D_MGS, "Changing log %s\n", dirent->mde_name); + /* Erase any old settings of this same parameter */ + rc = mgs_modify(env, mgs, fsdb, mti, dirent->mde_name, + devname, comment, CM_SKIP); + if (rc < 0) + CERROR("%s: Can't modify llog %s: rc = %d\n", + mgs->mgs_obd->obd_name, dirent->mde_name, rc); + if (lcr == NULL) + goto next; + /* Write the new one */ + rc = mgs_write_log_direct(env, mgs, fsdb, dirent->mde_name, + lcr, devname, comment); + if (rc != 0) + CERROR("%s: writing log %s: rc = %d\n", + mgs->mgs_obd->obd_name, dirent->mde_name, rc); next: mgs_direntry_free(dirent); - } + } - RETURN(rc); + RETURN(rc); } static int mgs_write_log_osp_to_mdt(const struct lu_env *env, @@ -1681,7 +1643,7 @@ static int mgs_steal_client_llog_handler(const struct lu_env *env, RETURN(rc); if (lcfg->lcfg_command == LCFG_ADD_UUID) { - uint64_t nodenid = lcfg->lcfg_nid; + __u64 nodenid = lcfg->lcfg_nid; if (strlen(tmti->mti_uuid) == 0) { /* target uuid not set, this config record is before @@ -1690,9 +1652,12 @@ static int mgs_steal_client_llog_handler(const struct lu_env *env, tmti->mti_nids[tmti->mti_nid_count] = nodenid; tmti->mti_nid_count++; } else { + char nidstr[LNET_NIDSTR_SIZE]; + /* failover node nid */ + libcfs_nid2str_r(nodenid, nidstr, sizeof(nidstr)); rc = add_param(tmti->mti_params, PARAM_FAILNODE, - libcfs_nid2str(nodenid)); + nidstr); } RETURN(rc); @@ -1930,30 +1895,48 @@ static int mgs_write_log_failnids(const struct lu_env *env, #07 L add_conn 0:OSC_uml1_ost1_mdsA 1:uml2_UUID */ - /* Pull failnid info out of params string */ + /* + * Pull failnid info out of params string, which may contain something + * like ",:,". class_parse_nid() does not + * complain about abnormal inputs like ",:", ":,", + * etc. However, convert_hostnames() should have caught those. + */ while (class_find_param(ptr, PARAM_FAILNODE, &ptr) == 0) { while (class_parse_nid(ptr, &nid, &ptr) == 0) { - if (failnodeuuid == NULL) { - /* We don't know the failover node name, - so just use the first nid as the uuid */ - rc = name_create(&failnodeuuid, - libcfs_nid2str(nid), ""); - if (rc) - return rc; - } - CDEBUG(D_MGS, "add nid %s for failover uuid %s, " - "client %s\n", libcfs_nid2str(nid), - failnodeuuid, cliname); + char nidstr[LNET_NIDSTR_SIZE]; + + if (failnodeuuid == NULL) { + /* We don't know the failover node name, + * so just use the first nid as the uuid */ + libcfs_nid2str_r(nid, nidstr, sizeof(nidstr)); + rc = name_create(&failnodeuuid, nidstr, ""); + if (rc != 0) + return rc; + } + CDEBUG(D_MGS, "add nid %s for failover uuid %s, " + "client %s\n", + libcfs_nid2str_r(nid, nidstr, sizeof(nidstr)), + failnodeuuid, cliname); rc = record_add_uuid(env, llh, nid, failnodeuuid); - } + /* + * If *ptr is ':', we have added all NIDs for + * failnodeuuid. + */ + if (*ptr == ':') { + rc = record_add_conn(env, llh, cliname, + failnodeuuid); + name_destroy(&failnodeuuid); + failnodeuuid = NULL; + } + } if (failnodeuuid) { rc = record_add_conn(env, llh, cliname, failnodeuuid); name_destroy(&failnodeuuid); failnodeuuid = NULL; } - } + } - return rc; + return rc; } static int mgs_write_log_mdc_to_lmv(const struct lu_env *env, @@ -1967,9 +1950,10 @@ static int mgs_write_log_mdc_to_lmv(const struct lu_env *env, char *nodeuuid = NULL; char *mdcuuid = NULL; char *lmvuuid = NULL; - char index[6]; - int i, rc; - ENTRY; + char index[6]; + char nidstr[LNET_NIDSTR_SIZE]; + int i, rc; + ENTRY; if (mgs_log_is_empty(env, mgs, logname)) { CERROR("log is empty! Logical error\n"); @@ -1979,7 +1963,8 @@ static int mgs_write_log_mdc_to_lmv(const struct lu_env *env, CDEBUG(D_MGS, "adding mdc for %s to log %s:lmv(%s)\n", mti->mti_svname, logname, lmvname); - rc = name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), ""); + libcfs_nid2str_r(mti->mti_nids[0], nidstr, sizeof(nidstr)); + rc = name_create(&nodeuuid, nidstr, ""); if (rc) RETURN(rc); rc = name_create(&mdcname, mti->mti_svname, "-mdc"); @@ -1999,19 +1984,21 @@ static int mgs_write_log_mdc_to_lmv(const struct lu_env *env, "add mdc"); 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])); + for (i = 0; i < mti->mti_nid_count; i++) { + CDEBUG(D_MGS, "add nid %s for mdt\n", + libcfs_nid2str_r(mti->mti_nids[i], + nidstr, sizeof(nidstr))); 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, lmvuuid); if (rc) GOTO(out_end, rc); - rc = record_setup(env, llh, mdcname, mti->mti_uuid, nodeuuid, 0, 0); + rc = record_setup(env, llh, mdcname, mti->mti_uuid, nodeuuid, + NULL, NULL); if (rc) GOTO(out_end, rc); rc = mgs_write_log_failnids(env, mti, llh, mdcname); @@ -2094,6 +2081,7 @@ static int mgs_write_log_osp_to_mdt(const struct lu_env *env, char *mdtname = NULL; char *lovname = NULL; char index_str[16]; + char nidstr[LNET_NIDSTR_SIZE]; int i, rc; ENTRY; @@ -2109,7 +2097,8 @@ static int mgs_write_log_osp_to_mdt(const struct lu_env *env, if (rc) RETURN(rc); - rc = name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), ""); + libcfs_nid2str_r(mti->mti_nids[0], nidstr, sizeof(nidstr)); + rc = name_create(&nodeuuid, nidstr, ""); if (rc) GOTO(out_destory, rc); @@ -2145,11 +2134,12 @@ static int mgs_write_log_osp_to_mdt(const struct lu_env *env, for (i = 0; i < mti->mti_nid_count; i++) { CDEBUG(D_MGS, "add nid %s for mdt\n", - libcfs_nid2str(mti->mti_nids[i])); + libcfs_nid2str_r(mti->mti_nids[i], + nidstr, sizeof(nidstr))); rc = record_add_uuid(env, llh, mti->mti_nids[i], nodeuuid); if (rc) GOTO(out_end, rc); - } + } rc = record_attach(env, llh, ospname, LUSTRE_OSP_NAME, lovuuid); if (rc) @@ -2165,8 +2155,7 @@ static int mgs_write_log_osp_to_mdt(const struct lu_env *env, GOTO(out_end, rc); /* Add mdc(osp) to lod */ - snprintf(index_str, sizeof(mti->mti_stripe_index), "%d", - mti->mti_stripe_index); + snprintf(index_str, sizeof(index_str), "%d", mti->mti_stripe_index); rc = record_base(env, llh, lovname, 0, LCFG_ADD_MDC, mti->mti_uuid, index_str, "1", NULL); if (rc) @@ -2367,25 +2356,27 @@ static int mgs_write_log_osc_to_lov(const struct lu_env *env, char *logname, char *suffix, char *lovname, enum lustre_sec_part sec_part, int flags) { - struct llog_handle *llh = NULL; + struct llog_handle *llh = NULL; char *nodeuuid = NULL; char *oscname = NULL; char *oscuuid = NULL; char *lovuuid = NULL; char *svname = NULL; - char index[6]; - int i, rc; + char index[6]; + char nidstr[LNET_NIDSTR_SIZE]; + int i, rc; + ENTRY; - ENTRY; - CDEBUG(D_INFO, "adding osc for %s to log %s\n", - mti->mti_svname, logname); + CDEBUG(D_INFO, "adding osc for %s to log %s\n", + mti->mti_svname, logname); if (mgs_log_is_empty(env, mgs, logname)) { - CERROR("log is empty! Logical error\n"); - RETURN (-EINVAL); - } + CERROR("log is empty! Logical error\n"); + RETURN(-EINVAL); + } - rc = name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), ""); + libcfs_nid2str_r(mti->mti_nids[0], nidstr, sizeof(nidstr)); + rc = name_create(&nodeuuid, nidstr, ""); if (rc) RETURN(rc); rc = name_create(&svname, mti->mti_svname, "-osc"); @@ -2436,16 +2427,19 @@ static int mgs_write_log_osc_to_lov(const struct lu_env *env, * (multiple interfaces), while nids after as failover node nids. * 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])); + for (i = 0; i < mti->mti_nid_count; i++) { + CDEBUG(D_MGS, "add nid %s\n", + libcfs_nid2str_r(mti->mti_nids[i], + nidstr, sizeof(nidstr))); rc = record_add_uuid(env, llh, mti->mti_nids[i], nodeuuid); if (rc) GOTO(out_end, rc); - } + } rc = record_attach(env, llh, oscname, LUSTRE_OSC_NAME, lovuuid); if (rc) GOTO(out_end, rc); - rc = record_setup(env, llh, oscname, mti->mti_uuid, nodeuuid, 0, 0); + rc = record_setup(env, llh, oscname, mti->mti_uuid, nodeuuid, + NULL, NULL); if (rc) GOTO(out_end, rc); rc = mgs_write_log_failnids(env, mti, llh, oscname); @@ -2519,7 +2513,7 @@ static int mgs_write_log_ost(const struct lu_env *env, GOTO(out_end, rc); rc = record_setup(env, llh, mti->mti_svname, "dev"/*ignored*/, "type"/*ignored*/, - failout ? "n" : "f", 0/*options*/); + failout ? "n" : "f", NULL/*options*/); if (rc) GOTO(out_end, rc); rc = record_marker(env, llh, fsdb, CM_END, mti->mti_svname, "add ost"); @@ -2585,7 +2579,7 @@ out_end: GOTO(out_free, rc); } rc = mgs_write_log_osc_to_lov(env, mgs, fsdb, mti, logname, "", - fsdb->fsdb_clilov, LUSTRE_SP_CLI, 0); + fsdb->fsdb_clilov, LUSTRE_SP_CLI, flags); out_free: name_destroy(&logname); RETURN(rc); @@ -2714,45 +2708,51 @@ static int mgs_write_log_add_failnid(const struct lu_env *env, static int mgs_wlp_lcfg(const struct lu_env *env, struct mgs_device *mgs, struct fs_db *fsdb, - struct mgs_target_info *mti, - char *logname, struct lustre_cfg_bufs *bufs, - char *tgtname, char *ptr) + struct mgs_target_info *mti, + char *logname, struct lustre_cfg_bufs *bufs, + char *tgtname, char *ptr) { - char comment[MTI_NAME_MAXLEN]; - char *tmp; - struct lustre_cfg *lcfg; - int rc, del; - - /* Erase any old settings of this same parameter */ - memcpy(comment, ptr, MTI_NAME_MAXLEN); - comment[MTI_NAME_MAXLEN - 1] = 0; - /* But don't try to match the value. */ - if ((tmp = strchr(comment, '='))) - *tmp = 0; - /* FIXME we should skip settings that are the same as old values */ + char comment[MTI_NAME_MAXLEN]; + char *tmp; + struct llog_cfg_rec *lcr; + int rc, del; + + /* Erase any old settings of this same parameter */ + memcpy(comment, ptr, MTI_NAME_MAXLEN); + comment[MTI_NAME_MAXLEN - 1] = 0; + /* But don't try to match the value. */ + tmp = strchr(comment, '='); + if (tmp != NULL) + *tmp = 0; + /* FIXME we should skip settings that are the same as old values */ rc = mgs_modify(env, mgs, fsdb, mti, logname, tgtname, comment,CM_SKIP); if (rc < 0) return rc; - del = mgs_param_empty(ptr); + 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; + LCONSOLE_INFO("%s parameter %s.%s in log %s\n", del ? "Disabling" : rc ? + "Setting" : "Modifying", tgtname, comment, logname); + if (del) { + /* mgs_modify() will return 1 if nothing had to be done */ + if (rc == 1) + rc = 0; + return rc; + } - lustre_cfg_bufs_reset(bufs, tgtname); + lustre_cfg_bufs_reset(bufs, tgtname); lustre_cfg_bufs_set_string(bufs, 1, ptr); if (mti->mti_flags & LDD_F_PARAM2) lustre_cfg_bufs_set_string(bufs, 2, LCTL_UPCALL); - lcfg = lustre_cfg_new((mti->mti_flags & LDD_F_PARAM2) ? - LCFG_SET_PARAM : LCFG_PARAM, bufs); + lcr = lustre_cfg_rec_new((mti->mti_flags & LDD_F_PARAM2) ? + LCFG_SET_PARAM : LCFG_PARAM, bufs); + if (lcr == NULL) + return -ENOMEM; - if (!lcfg) - return -ENOMEM; - rc = mgs_write_log_direct(env, mgs, fsdb, logname,lcfg,tgtname,comment); - lustre_cfg_free(lcfg); - return rc; + rc = mgs_write_log_direct(env, mgs, fsdb, logname, lcr, tgtname, + comment); + lustre_cfg_rec_free(lcr); + return rc; } static int mgs_write_log_param2(const struct lu_env *env, @@ -2776,8 +2776,9 @@ static int mgs_write_log_sys(const struct lu_env *env, struct mgs_device *mgs, struct fs_db *fsdb, struct mgs_target_info *mti, char *sys, char *ptr) { - struct mgs_thread_info *mgi = mgs_env_info(env); - struct lustre_cfg *lcfg; + struct mgs_thread_info *mgi = mgs_env_info(env); + struct lustre_cfg *lcfg; + struct llog_cfg_rec *lcr; char *tmp, sep; int rc, cmd, convert = 1; @@ -2808,7 +2809,11 @@ static int mgs_write_log_sys(const struct lu_env *env, lustre_cfg_bufs_set_string(&mgi->mgi_bufs, 1, sys); if (!convert && *tmp != '\0') lustre_cfg_bufs_set_string(&mgi->mgi_bufs, 2, tmp); - lcfg = lustre_cfg_new(cmd, &mgi->mgi_bufs); + lcr = lustre_cfg_rec_new(cmd, &mgi->mgi_bufs); + if (lcr == NULL) + return -ENOMEM; + + lcfg = &lcr->lcr_cfg; lcfg->lcfg_num = convert ? simple_strtoul(tmp, NULL, 0) : 0; /* truncate the comment to the parameter name */ ptr = tmp - 1; @@ -2816,7 +2821,7 @@ static int mgs_write_log_sys(const struct lu_env *env, *ptr = '\0'; /* modify all servers and clients */ rc = mgs_write_log_direct_all(env, mgs, fsdb, mti, - *tmp == '\0' ? NULL : lcfg, + *tmp == '\0' ? NULL : lcr, mti->mti_fsname, sys, 0); if (rc == 0 && *tmp != '\0') { switch (cmd) { @@ -2833,7 +2838,7 @@ static int mgs_write_log_sys(const struct lu_env *env, } } *ptr = sep; - lustre_cfg_free(lcfg); + lustre_cfg_rec_free(lcr); return rc; } @@ -2843,7 +2848,7 @@ static int mgs_write_log_quota(const struct lu_env *env, struct mgs_device *mgs, char *quota, char *ptr) { struct mgs_thread_info *mgi = mgs_env_info(env); - struct lustre_cfg *lcfg; + struct llog_cfg_rec *lcr; char *tmp; char sep; int rc, cmd = LCFG_PARAM; @@ -2870,7 +2875,10 @@ static int mgs_write_log_quota(const struct lu_env *env, struct mgs_device *mgs, lustre_cfg_bufs_reset(&mgi->mgi_bufs, mti->mti_fsname); lustre_cfg_bufs_set_string(&mgi->mgi_bufs, 1, quota); - lcfg = lustre_cfg_new(cmd, &mgi->mgi_bufs); + lcr = lustre_cfg_rec_new(cmd, &mgi->mgi_bufs); + if (lcr == NULL) + return -ENOMEM; + /* truncate the comment to the parameter name */ ptr = tmp - 1; sep = *ptr; @@ -2881,10 +2889,10 @@ static int mgs_write_log_quota(const struct lu_env *env, struct mgs_device *mgs, * log once we cleanup the config log for global param. */ /* modify all servers */ rc = mgs_write_log_direct_all(env, mgs, fsdb, mti, - *tmp == '\0' ? NULL : lcfg, + *tmp == '\0' ? NULL : lcr, mti->mti_fsname, quota, 1); *ptr = sep; - lustre_cfg_free(lcfg); + lustre_cfg_rec_free(lcr); return rc < 0 ? rc : 0; } @@ -2894,61 +2902,63 @@ static int mgs_srpc_set_param_disk(const struct lu_env *env, struct mgs_target_info *mti, char *param) { - struct mgs_thread_info *mgi = mgs_env_info(env); - struct llog_handle *llh = NULL; - char *logname; - char *comment, *ptr; - struct lustre_cfg *lcfg; - int rc, len; - ENTRY; + struct mgs_thread_info *mgi = mgs_env_info(env); + struct llog_cfg_rec *lcr; + struct llog_handle *llh = NULL; + char *logname; + char *comment, *ptr; + int rc, len; - /* get comment */ - ptr = strchr(param, '='); - LASSERT(ptr); - len = ptr - param; + ENTRY; - OBD_ALLOC(comment, len + 1); - if (comment == NULL) - RETURN(-ENOMEM); - strncpy(comment, param, len); - comment[len] = '\0'; + /* get comment */ + ptr = strchr(param, '='); + LASSERT(ptr != NULL); + len = ptr - param; - /* prepare lcfg */ + OBD_ALLOC(comment, len + 1); + if (comment == NULL) + RETURN(-ENOMEM); + strncpy(comment, param, len); + comment[len] = '\0'; + + /* prepare lcfg */ lustre_cfg_bufs_reset(&mgi->mgi_bufs, mti->mti_svname); lustre_cfg_bufs_set_string(&mgi->mgi_bufs, 1, param); - lcfg = lustre_cfg_new(LCFG_SPTLRPC_CONF, &mgi->mgi_bufs); - if (lcfg == NULL) - GOTO(out_comment, rc = -ENOMEM); + lcr = lustre_cfg_rec_new(LCFG_SPTLRPC_CONF, &mgi->mgi_bufs); + if (lcr == NULL) + GOTO(out_comment, rc = -ENOMEM); - /* construct log name */ - rc = name_create(&logname, mti->mti_fsname, "-sptlrpc"); - if (rc) - GOTO(out_lcfg, rc); + /* construct log name */ + rc = name_create(&logname, mti->mti_fsname, "-sptlrpc"); + if (rc < 0) + GOTO(out_lcfg, rc); if (mgs_log_is_empty(env, mgs, logname)) { rc = record_start_log(env, mgs, &llh, logname); - if (rc) - GOTO(out, rc); + if (rc < 0) + GOTO(out, rc); record_end_log(env, &llh); - } + } - /* obsolete old one */ + /* obsolete old one */ rc = mgs_modify(env, mgs, fsdb, mti, logname, mti->mti_svname, comment, CM_SKIP); if (rc < 0) GOTO(out, rc); - /* write the new one */ - rc = mgs_write_log_direct(env, mgs, fsdb, logname, lcfg, - mti->mti_svname, comment); + /* write the new one */ + rc = mgs_write_log_direct(env, mgs, fsdb, logname, lcr, + mti->mti_svname, comment); if (rc) - CERROR("err %d writing log %s\n", rc, logname); + CERROR("%s: error writing log %s: rc = %d\n", + mgs->mgs_obd->obd_name, logname, rc); out: - name_destroy(&logname); + name_destroy(&logname); out_lcfg: - lustre_cfg_free(lcfg); + lustre_cfg_rec_free(lcr); out_comment: - OBD_FREE(comment, len + 1); - RETURN(rc); + OBD_FREE(comment, len + 1); + RETURN(rc); } static int mgs_srpc_set_param_udesc_mem(struct fs_db *fsdb, @@ -3062,6 +3072,9 @@ static int mgs_srpc_set_param_mem(struct fs_db *fsdb, } rset = &tgtconf->mtsc_rset; + } else if (strcmp(svname, MGSSELF_NAME) == 0) { + /* put _mgs related srpc rule directly in mgs ruleset */ + rset = &fsdb->fsdb_mgs->mgs_lut.lut_sptlrpc_rset; } else { rset = &fsdb->fsdb_srpc_gen; } @@ -3136,8 +3149,7 @@ static int mgs_srpc_read_handler(const struct lu_env *env, RETURN(-EINVAL); } - cfg_len = rec->lrh_len - sizeof(struct llog_rec_hdr) - - sizeof(struct llog_rec_tail); + cfg_len = REC_DATA_LEN(rec); rc = lustre_cfg_sanity_check(lcfg, cfg_len); if (rc) { @@ -3306,61 +3318,77 @@ static int mgs_write_log_param(const struct lu_env *env, GOTO(end, rc); } - 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 (class_match_param(ptr, PARAM_OSC PARAM_ACTIVE, &tmp) == 0 || + class_match_param(ptr, PARAM_MDC PARAM_ACTIVE, &tmp) == 0) { + /* active=0 means off, anything else means on */ + int flag = (*tmp == '0') ? CM_EXCLUDE : 0; + bool deactive_osc = memcmp(ptr, PARAM_OSC PARAM_ACTIVE, + strlen(PARAM_OSC PARAM_ACTIVE)) == 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 */ + if (!deactive_osc) { + __u32 index; + + rc = server_name2index(mti->mti_svname, &index, NULL); + if (rc < 0) + GOTO(end, rc); + + if (index == 0) { + LCONSOLE_ERROR_MSG(0x144, "%s: MDC0 can not 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 */ rc = name_create(&logname, mti->mti_fsname, "-client"); - if (rc) + if (rc < 0) GOTO(end, rc); rc = mgs_modify(env, mgs, 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++) { + mti->mti_svname, + deactive_osc ? "add osc" : "add mdc", flag); + name_destroy(&logname); + if (rc < 0) + goto active_err; + + /* Modify mdtlov */ + /* Add to all MDT logs for DNE */ + for (i = 0; i < INDEX_MAP_SIZE * 8; i++) { if (!test_bit(i, fsdb->fsdb_mdt_index_map)) - continue; + continue; rc = name_create_mdt(&logname, mti->mti_fsname, i); - if (rc) + if (rc < 0) GOTO(end, rc); rc = mgs_modify(env, mgs, 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); + mti->mti_svname, + deactive_osc ? "add osc" : "add osp", + flag); + name_destroy(&logname); + if (rc < 0) + goto active_err; + } +active_err: + if (rc < 0) { + 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 (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. */ - } + 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/mdc proc for deactivating live + OSC/OSP on running MDT / clients. */ + } /* Below here, let obd's XXX_process_config methods handle it */ /* All lov. in proc */ @@ -3429,9 +3457,22 @@ static int mgs_write_log_param(const struct lu_env *env, if (rc) GOTO(end, rc); - CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4); + /* Forbid direct update of llite root squash parameters. + * These parameters are indirectly set via the MDT settings. + * See (LU-1778) */ + if ((class_match_param(ptr, PARAM_LLITE, &tmp) == 0) && + ((memcmp(tmp, "root_squash=", 12) == 0) || + (memcmp(tmp, "nosquash_nids=", 14) == 0))) { + LCONSOLE_ERROR("%s: root squash parameters can only " + "be updated through MDT component\n", + mti->mti_fsname); + name_destroy(&cname); + GOTO(end, rc = -EINVAL); + } - /* Modify client */ + CDEBUG(D_MGS, "%.3s param %s\n", ptr, ptr + 4); + + /* Modify client */ rc = name_create(&logname, mti->mti_fsname, "-client"); if (rc) { name_destroy(&cname); @@ -3467,13 +3508,85 @@ static int mgs_write_log_param(const struct lu_env *env, } } } - name_destroy(&logname); - name_destroy(&cname); - GOTO(end, rc); - } - /* All mdt. params in proc */ - if (class_match_param(ptr, PARAM_MDT, NULL) == 0) { + /* For mdc activate/deactivate, it affects OSP on MDT as well */ + if (class_match_param(ptr, PARAM_MDC PARAM_ACTIVE, &tmp) == 0 && + rc == 0) { + char suffix[16]; + char *lodname = NULL; + char *param_str = NULL; + int i; + int index; + + /* replace mdc with osp */ + memcpy(ptr, PARAM_OSP, strlen(PARAM_OSP)); + rc = server_name2index(mti->mti_svname, &index, NULL); + if (rc < 0) { + memcpy(ptr, PARAM_MDC, strlen(PARAM_MDC)); + GOTO(end, rc); + } + + for (i = 0; i < INDEX_MAP_SIZE * 8; i++) { + if (!test_bit(i, fsdb->fsdb_mdt_index_map)) + continue; + + if (i == index) + continue; + + name_destroy(&logname); + rc = name_create_mdt(&logname, mti->mti_fsname, + i); + if (rc < 0) + break; + + if (mgs_log_is_empty(env, mgs, logname)) + continue; + + snprintf(suffix, sizeof(suffix), "-osp-MDT%04x", + i); + name_destroy(&cname); + rc = name_create(&cname, mti->mti_svname, + suffix); + if (rc < 0) + break; + + rc = mgs_wlp_lcfg(env, mgs, fsdb, mti, logname, + &mgi->mgi_bufs, cname, ptr); + if (rc < 0) + break; + + /* Add configuration log for noitfying LOD + * to active/deactive the OSP. */ + name_destroy(¶m_str); + rc = name_create(¶m_str, cname, + (*tmp == '0') ? ".active=0" : + ".active=1"); + if (rc < 0) + break; + + name_destroy(&lodname); + rc = name_create(&lodname, logname, "-mdtlov"); + if (rc < 0) + break; + + rc = mgs_wlp_lcfg(env, mgs, fsdb, mti, logname, + &mgi->mgi_bufs, lodname, + param_str); + if (rc < 0) + break; + } + memcpy(ptr, PARAM_MDC, strlen(PARAM_MDC)); + name_destroy(&lodname); + name_destroy(¶m_str); + } + + name_destroy(&logname); + name_destroy(&cname); + GOTO(end, rc); + } + + /* All mdt. params in proc */ + if (class_match_param(ptr, PARAM_MDT, &tmp) == 0) { int i; __u32 idx; @@ -3499,20 +3612,56 @@ static int mgs_write_log_param(const struct lu_env *env, goto active_err; rc = mgs_wlp_lcfg(env, mgs, fsdb, mti, logname, &mgi->mgi_bufs, - logname, ptr); - name_destroy(&logname); - if (rc) - goto active_err; - } - } else { + logname, ptr); + name_destroy(&logname); + if (rc) + goto active_err; + } + } else { + if ((memcmp(tmp, "root_squash=", 12) == 0) || + (memcmp(tmp, "nosquash_nids=", 14) == 0)) { + LCONSOLE_ERROR("%s: root squash parameters " + "cannot be applied to a single MDT\n", + mti->mti_fsname); + GOTO(end, rc = -EINVAL); + } rc = mgs_wlp_lcfg(env, mgs, fsdb, mti, mti->mti_svname, &mgi->mgi_bufs, - mti->mti_svname, ptr); - if (rc) - goto active_err; - } - GOTO(end, rc); - } + mti->mti_svname, ptr); + if (rc) + goto active_err; + } + + /* root squash settings are also applied to llite + * config log (see LU-1778) */ + if (rc == 0 && + ((memcmp(tmp, "root_squash=", 12) == 0) || + (memcmp(tmp, "nosquash_nids=", 14) == 0))) { + char *cname; + char *ptr2; + + rc = name_create(&cname, mti->mti_fsname, "-client"); + if (rc) + GOTO(end, rc); + rc = name_create(&logname, mti->mti_fsname, "-client"); + if (rc) { + name_destroy(&cname); + GOTO(end, rc); + } + rc = name_create(&ptr2, PARAM_LLITE, tmp); + if (rc) { + name_destroy(&cname); + name_destroy(&logname); + GOTO(end, rc); + } + rc = mgs_wlp_lcfg(env, mgs, fsdb, mti, logname, + &mgi->mgi_bufs, cname, ptr2); + name_destroy(&ptr2); + name_destroy(&logname); + name_destroy(&cname); + } + GOTO(end, rc); + } /* All mdd., ost. and osd. params in proc */ if ((class_match_param(ptr, PARAM_MDD, NULL) == 0) || @@ -3563,27 +3712,26 @@ int mgs_check_failnid(const struct lu_env *env, struct mgs_device *mgs, mutex_lock(&fsdb->fsdb_mutex); rc = mgs_write_log_add_failnid(obd, fsdb, mti); mutex_unlock(&fsdb->fsdb_mutex); + char *buf, *params; + int rc = -EINVAL; RETURN(rc); #endif return 0; } -int mgs_write_log_target(const struct lu_env *env, - struct mgs_device *mgs, - struct mgs_target_info *mti, - struct fs_db *fsdb) +int mgs_write_log_target(const struct lu_env *env, struct mgs_device *mgs, + struct mgs_target_info *mti, struct fs_db *fsdb) { - int rc = -EINVAL; - char *buf, *params; - ENTRY; + char *buf, *params; + int rc = -EINVAL; + + ENTRY; - /* set/check the new target index */ + /* set/check the new target index */ rc = mgs_set_index(env, mgs, mti); - if (rc < 0) { - CERROR("Can't get index (%d)\n", rc); - RETURN(rc); - } + if (rc < 0) + RETURN(rc); if (rc == EALREADY) { LCONSOLE_WARN("Found index %d for %s, updating log\n", @@ -3679,14 +3827,14 @@ int mgs_erase_log(const struct lu_env *env, struct mgs_device *mgs, char *name) int mgs_erase_logs(const struct lu_env *env, struct mgs_device *mgs, char *fsname) { struct fs_db *fsdb; - cfs_list_t list; + struct list_head log_list; struct mgs_direntry *dirent, *n; int rc, len = strlen(fsname); char *suffix; ENTRY; /* Find all the logs in the CONFIGS directory */ - rc = class_dentry_readdir(env, mgs, &list); + rc = class_dentry_readdir(env, mgs, &log_list); if (rc) RETURN(rc); @@ -3699,15 +3847,15 @@ int mgs_erase_logs(const struct lu_env *env, struct mgs_device *mgs, char *fsnam mutex_unlock(&mgs->mgs_mutex); - cfs_list_for_each_entry_safe(dirent, n, &list, list) { - cfs_list_del(&dirent->list); - suffix = strrchr(dirent->name, '-'); + list_for_each_entry_safe(dirent, n, &log_list, mde_list) { + list_del_init(&dirent->mde_list); + suffix = strrchr(dirent->mde_name, '-'); if (suffix != NULL) { - if ((len == suffix - dirent->name) && - (strncmp(fsname, dirent->name, len) == 0)) { + if ((len == suffix - dirent->mde_name) && + (strncmp(fsname, dirent->mde_name, len) == 0)) { CDEBUG(D_MGS, "Removing log %s\n", - dirent->name); - mgs_erase_log(env, mgs, dirent->name); + dirent->mde_name); + mgs_erase_log(env, mgs, dirent->mde_name); } } mgs_direntry_free(dirent); @@ -3720,7 +3868,7 @@ int mgs_erase_logs(const struct lu_env *env, struct mgs_device *mgs, char *fsnam int mgs_list_logs(const struct lu_env *env, struct mgs_device *mgs, struct obd_ioctl_data *data) { - cfs_list_t list; + struct list_head log_list; struct mgs_direntry *dirent, *n; char *out, *suffix; int l, remains, rc; @@ -3728,21 +3876,18 @@ int mgs_list_logs(const struct lu_env *env, struct mgs_device *mgs, ENTRY; /* Find all the logs in the CONFIGS directory */ - rc = class_dentry_readdir(env, mgs, &list); - if (rc) { - CERROR("%s: can't read %s dir = %d\n", - mgs->mgs_obd->obd_name, MOUNT_CONFIGS_DIR, rc); + rc = class_dentry_readdir(env, mgs, &log_list); + if (rc) RETURN(rc); - } out = data->ioc_bulk; remains = data->ioc_inllen1; - cfs_list_for_each_entry_safe(dirent, n, &list, list) { - cfs_list_del(&dirent->list); - suffix = strrchr(dirent->name, '-'); + list_for_each_entry_safe(dirent, n, &log_list, mde_list) { + list_del_init(&dirent->mde_list); + suffix = strrchr(dirent->mde_name, '-'); if (suffix != NULL) { l = snprintf(out, remains, "config log: $%s\n", - dirent->name); + dirent->mde_name); out += l; remains -= l; } @@ -3777,6 +3922,19 @@ static void print_lustre_cfg(struct lustre_cfg *lcfg) EXIT; } +/* Setup _mgs fsdb and log + */ +int mgs__mgs_fsdb_setup(const struct lu_env *env, struct mgs_device *mgs, + struct fs_db *fsdb) +{ + int rc; + ENTRY; + + rc = mgs_find_or_make_fsdb(env, mgs, MGSSELF_NAME, &fsdb); + + RETURN(rc); +} + /* Setup params fsdb and log */ int mgs_params_fsdb_setup(const struct lu_env *env, struct mgs_device *mgs, @@ -3849,9 +4007,7 @@ int mgs_setparam(const struct lu_env *env, struct mgs_device *mgs, RETURN(-EINVAL); } else { /* assume devname is the fsname */ - memset(fsname, 0, MTI_NAME_MAXLEN); - strncpy(fsname, devname, MTI_NAME_MAXLEN); - fsname[MTI_NAME_MAXLEN - 1] = 0; + strlcpy(fsname, devname, MTI_NAME_MAXLEN); } CDEBUG(D_MGS, "setparam fs='%s' device='%s'\n", fsname, devname); @@ -3934,7 +4090,7 @@ static int mgs_write_log_pool(const struct lu_env *env, if (rc) goto out; rc = record_base(env, llh, tgtname, 0, cmd, - fsname, poolname, ostname, 0); + fsname, poolname, ostname, NULL); if (rc) goto out; rc = record_marker(env, llh, fsdb, CM_END, tgtname, comment); @@ -3945,7 +4101,7 @@ out: int mgs_nodemap_cmd(const struct lu_env *env, struct mgs_device *mgs, enum lcfg_command_type cmd, const char *nodemap_name, - const char *param) + char *param) { lnet_nid_t nid[2]; __u32 idmap[2];