X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmgs%2Fmgs_llog.c;h=5cb82647afdd748dc0915c81b49c39471c24fcab;hp=e328f33c37e7188468247c34c97c81925901c740;hb=708bc9a21e4437a163e60492a0813a9bdf85dd29;hpb=83ed79c24dcfbe4b65dc019d57f0488c4df53366 diff --git a/lustre/mgs/mgs_llog.c b/lustre/mgs/mgs_llog.c index e328f33..5cb8264 100644 --- a/lustre/mgs/mgs_llog.c +++ b/lustre/mgs/mgs_llog.c @@ -44,7 +44,7 @@ #define EXPORT_SYMTAB #endif #define DEBUG_SUBSYSTEM S_MGS -#define D_MGS D_CONFIG /*|D_WARNING*/ +#define D_MGS D_CONFIG #ifdef __KERNEL__ #include @@ -70,7 +70,7 @@ /* Caller must list_del and OBD_FREE each dentry from the list */ int class_dentry_readdir(struct obd_device *obd, struct dentry *dir, struct vfsmount *inmnt, - struct list_head *dentry_list){ + cfs_list_t *dentry_list){ /* see mds_cleanup_pending */ struct lvfs_run_ctxt saved; struct file *file; @@ -123,19 +123,27 @@ static inline void name_destroy(char **name) *name = NULL; } +struct mgs_fsdb_handler_data +{ + struct fs_db *fsdb; + __u32 ver; +}; + /* from the (client) config log, figure out: 1. which ost's/mdt's are configured (by index) 2. what the last config step is 3. COMPAT_146 lov name 4. COMPAT_146 mdt lov name 5. COMPAT_146 mdc name + 6. COMPAT_18 osc name */ /* It might be better to have a separate db file, instead of parsing the info out of the client log. This is slow and potentially error-prone. */ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, void *data) { - struct fs_db *fsdb = (struct fs_db *)data; + struct mgs_fsdb_handler_data *d = (struct mgs_fsdb_handler_data *) data; + struct fs_db *fsdb = d->fsdb; int cfg_len = rec->lrh_len; char *cfg_buf = (char*) (rec + 1); struct lustre_cfg *lcfg; @@ -168,7 +176,7 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, CDEBUG(D_MGS, "OST index for %s is %u (%s)\n", lustre_cfg_string(lcfg, 1), index, lustre_cfg_string(lcfg, 2)); - set_bit(index, fsdb->fsdb_ost_index_map); + cfs_set_bit(index, fsdb->fsdb_ost_index_map); } /* Figure out mdt indicies */ @@ -184,7 +192,7 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, } rc = 0; CDEBUG(D_MGS, "MDT index is %u\n", index); - set_bit(index, fsdb->fsdb_mdt_index_map); + cfs_set_bit(index, fsdb->fsdb_mdt_index_map); } /* COMPAT_146 */ @@ -227,10 +235,26 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, } /* end COMPAT_146 */ - /* Keep track of the latest marker step */ + /* + * compat to 1.8, check osc name used by MDT0 to OSTs, bz18548. + */ + if (fsdb->fsdb_fl_oscname_18 == 0 && + lcfg->lcfg_command == LCFG_ATTACH && + strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_OSC_NAME) == 0) { + if (OBD_OCD_VERSION_MAJOR(d->ver) == 1 && + OBD_OCD_VERSION_MINOR(d->ver) <= 8) { + CWARN("MDT using 1.8 OSC name scheme\n"); + fsdb->fsdb_fl_oscname_18 = 1; + } + } + if (lcfg->lcfg_command == LCFG_MARKER) { struct cfg_marker *marker; marker = lustre_cfg_buf(lcfg, 1); + + d->ver = marker->cm_vers; + + /* Keep track of the latest marker step */ fsdb->fsdb_gen = max(fsdb->fsdb_gen, marker->cm_step); } @@ -244,13 +268,14 @@ static int mgs_get_fsdb_from_llog(struct obd_device *obd, struct fs_db *fsdb) struct llog_handle *loghandle; struct lvfs_run_ctxt saved; struct llog_ctxt *ctxt; + struct mgs_fsdb_handler_data d = { fsdb, 0 }; int rc, rc2; ENTRY; ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); LASSERT(ctxt != NULL); name_create(&logname, fsdb->fsdb_name, "-client"); - down(&fsdb->fsdb_sem); + cfs_down(&fsdb->fsdb_sem); push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); rc = llog_create(ctxt, &loghandle, NULL, logname); if (rc) @@ -263,7 +288,7 @@ static int mgs_get_fsdb_from_llog(struct obd_device *obd, struct fs_db *fsdb) if (llog_get_size(loghandle) <= 1) fsdb->fsdb_flags |= FSDB_LOG_EMPTY; - rc = llog_process(loghandle, mgs_fsdb_handler, (void *)fsdb, NULL); + rc = llog_process(loghandle, mgs_fsdb_handler, (void *) &d, NULL); CDEBUG(D_INFO, "get_db = %d\n", rc); out_close: rc2 = llog_close(loghandle); @@ -271,7 +296,7 @@ out_close: rc = rc2; out_pop: pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - up(&fsdb->fsdb_sem); + cfs_up(&fsdb->fsdb_sem); name_destroy(&logname); llog_ctxt_put(ctxt); @@ -302,10 +327,10 @@ static struct fs_db *mgs_find_fsdb(struct obd_device *obd, char *fsname) { struct mgs_obd *mgs = &obd->u.mgs; struct fs_db *fsdb; - struct list_head *tmp; + cfs_list_t *tmp; - list_for_each(tmp, &mgs->mgs_fs_db_list) { - fsdb = list_entry(tmp, struct fs_db, fsdb_list); + cfs_list_for_each(tmp, &mgs->mgs_fs_db_list) { + fsdb = cfs_list_entry(tmp, struct fs_db, fsdb_list); if (strcmp(fsdb->fsdb_name, fsname) == 0) return fsdb; } @@ -330,7 +355,7 @@ static struct fs_db *mgs_new_fsdb(struct obd_device *obd, char *fsname) RETURN(NULL); strcpy(fsdb->fsdb_name, fsname); - sema_init(&fsdb->fsdb_sem, 1); + cfs_sema_init(&fsdb->fsdb_sem, 1); fsdb->fsdb_fl_udesc = 1; if (strcmp(fsname, MGSSELF_NAME) == 0) { @@ -359,7 +384,7 @@ static struct fs_db *mgs_new_fsdb(struct obd_device *obd, char *fsname) lproc_mgs_add_live(obd, fsdb); } - list_add(&fsdb->fsdb_list, &mgs->mgs_fs_db_list); + cfs_list_add(&fsdb->fsdb_list, &mgs->mgs_fs_db_list); RETURN(fsdb); err: @@ -378,9 +403,9 @@ err: static void mgs_free_fsdb(struct obd_device *obd, struct fs_db *fsdb) { /* wait for anyone with the sem */ - down(&fsdb->fsdb_sem); + cfs_down(&fsdb->fsdb_sem); lproc_mgs_del_live(obd, fsdb); - list_del(&fsdb->fsdb_list); + cfs_list_del(&fsdb->fsdb_list); if (fsdb->fsdb_ost_index_map) OBD_FREE(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE); if (fsdb->fsdb_mdt_index_map) @@ -405,13 +430,13 @@ int mgs_cleanup_fsdb_list(struct obd_device *obd) { struct mgs_obd *mgs = &obd->u.mgs; struct fs_db *fsdb; - struct list_head *tmp, *tmp2; - down(&mgs->mgs_sem); - list_for_each_safe(tmp, tmp2, &mgs->mgs_fs_db_list) { - fsdb = list_entry(tmp, struct fs_db, fsdb_list); + cfs_list_t *tmp, *tmp2; + cfs_down(&mgs->mgs_sem); + cfs_list_for_each_safe(tmp, tmp2, &mgs->mgs_fs_db_list) { + fsdb = cfs_list_entry(tmp, struct fs_db, fsdb_list); mgs_free_fsdb(obd, fsdb); } - up(&mgs->mgs_sem); + cfs_up(&mgs->mgs_sem); return 0; } @@ -422,17 +447,17 @@ int mgs_find_or_make_fsdb(struct obd_device *obd, char *name, struct fs_db *fsdb; int rc = 0; - down(&mgs->mgs_sem); + cfs_down(&mgs->mgs_sem); fsdb = mgs_find_fsdb(obd, name); if (fsdb) { - up(&mgs->mgs_sem); + cfs_up(&mgs->mgs_sem); *dbh = fsdb; return 0; } CDEBUG(D_MGS, "Creating new db\n"); fsdb = mgs_new_fsdb(obd, name); - up(&mgs->mgs_sem); + cfs_up(&mgs->mgs_sem); if (!fsdb) return -ENOMEM; @@ -487,7 +512,7 @@ int mgs_check_index(struct obd_device *obd, struct mgs_target_info *mti) else RETURN(-EINVAL); - if (test_bit(mti->mti_stripe_index, imap)) + if (cfs_test_bit(mti->mti_stripe_index, imap)) RETURN(1); RETURN(0); } @@ -496,7 +521,7 @@ static __inline__ int next_index(void *index_map, int map_len) { int i; for (i = 0; i < map_len * 8; i++) - if (!test_bit(i, index_map)) { + if (!cfs_test_bit(i, index_map)) { return i; } CERROR("max index %d exceeded.\n", i); @@ -542,7 +567,7 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) RETURN(-ERANGE); } - if (test_bit(mti->mti_stripe_index, imap)) { + if (cfs_test_bit(mti->mti_stripe_index, imap)) { if ((mti->mti_flags & LDD_F_VIRGIN) && !(mti->mti_flags & LDD_F_WRITECONF)) { LCONSOLE_ERROR_MSG(0x140, "Server %s requested index " @@ -558,7 +583,7 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) } } - set_bit(mti->mti_stripe_index, imap); + cfs_set_bit(mti->mti_stripe_index, imap); fsdb->fsdb_flags &= ~FSDB_LOG_EMPTY; server_make_name(mti->mti_flags, mti->mti_stripe_index, mti->mti_fsname, mti->mti_svname); @@ -637,7 +662,8 @@ static int mgs_modify(struct obd_device *obd, struct fs_db *fsdb, int rc, rc2; ENTRY; - CDEBUG(D_MGS, "modify %s/%s/%s\n", logname, devname, comment); + CDEBUG(D_MGS, "modify %s/%s/%s fl=%x\n", logname, devname, comment, + flags); push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); @@ -972,7 +998,7 @@ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb, char *devname, char *comment) { struct mgs_obd *mgs = &obd->u.mgs; - struct list_head dentry_list; + cfs_list_t dentry_list; struct l_linux_dirent *dirent, *n; char *fsname = mti->mti_fsname; char *logname; @@ -1002,8 +1028,8 @@ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb, } /* Could use fsdb index maps instead of directory listing */ - list_for_each_entry_safe(dirent, n, &dentry_list, lld_list) { - list_del(&dirent->lld_list); + cfs_list_for_each_entry_safe(dirent, n, &dentry_list, lld_list) { + cfs_list_del(&dirent->lld_list); /* don't write to sptlrpc rule log */ if (strncmp(fsname, dirent->lld_name, len) == 0 && strstr(dirent->lld_name, "-sptlrpc") == NULL) { @@ -1012,11 +1038,15 @@ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb, mgs_modify(obd, fsdb, mti, dirent->lld_name, devname, comment, CM_SKIP); /* Write the new one */ - rc = mgs_write_log_direct(obd, fsdb, dirent->lld_name, - lcfg, devname, comment); - if (rc) - CERROR("err %d writing log %s\n", rc, - dirent->lld_name); + if (lcfg) { + rc = mgs_write_log_direct(obd, fsdb, + dirent->lld_name, + lcfg, devname, + comment); + if (rc) + CERROR("err %d writing log %s\n", rc, + dirent->lld_name); + } } OBD_FREE(dirent, sizeof(*dirent)); } @@ -1441,7 +1471,7 @@ static int mgs_write_log_mdt0(struct obd_device *obd, struct fs_db *fsdb, char *log = mti->mti_svname; struct llog_handle *llh = NULL; char *uuid, *lovname; - char mdt_index[5]; + char mdt_index[6]; char *ptr = mti->mti_params; int rc = 0, failout = 0; ENTRY; @@ -1458,7 +1488,7 @@ static int mgs_write_log_mdt0(struct obd_device *obd, struct fs_db *fsdb, rc = mgs_write_log_lov(obd, fsdb, mti, log, lovname); sprintf(uuid, "%s_UUID", log); - sprintf(mdt_index,"%d",mti->mti_stripe_index); + sprintf(mdt_index, "%d", mti->mti_stripe_index); /* add MDT itself */ rc = record_start_log(obd, &llh, log); @@ -1479,6 +1509,37 @@ out: RETURN(rc); } +static inline void name_create_mdt(char **logname, char *fsname, int i) +{ + char mdt_index[9]; + + sprintf(mdt_index, "-MDT%04x", i); + name_create(logname, fsname, mdt_index); +} + +static void name_create_mdt_and_lov(char **logname, char **lovname, + struct fs_db *fsdb, int i) +{ + name_create_mdt(logname, fsdb->fsdb_name, i); + /* COMPAT_180 */ + if (i == 0 && fsdb->fsdb_fl_oscname_18) + name_create(lovname, fsdb->fsdb_name, "-mdtlov"); + else + name_create(lovname, *logname, "-mdtlov"); +} + +static inline void name_create_mdt_osc(char **oscname, char *ostname, + struct fs_db *fsdb, int i) +{ + char suffix[16]; + + if (i == 0 && fsdb->fsdb_fl_oscname_18) + sprintf(suffix, "-osc"); + else + sprintf(suffix, "-osc-MDT%04x", i); + name_create(oscname, ostname, suffix); +} + /* envelope method for all layers log */ static int mgs_write_log_mdt(struct obd_device *obd, struct fs_db *fsdb, struct mgs_target_info *mti) @@ -1486,7 +1547,6 @@ static int mgs_write_log_mdt(struct obd_device *obd, struct fs_db *fsdb, struct llog_handle *llh = NULL; char *cliname; struct temp_comp comp = { 0 }; - char mdt_index[9]; int rc, i = 0; ENTRY; @@ -1591,10 +1651,8 @@ out: 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)) { - sprintf(mdt_index,"-MDT%04x",i); - - name_create(&mdtname, mti->mti_fsname, mdt_index); + cfs_test_bit(i, fsdb->fsdb_mdt_index_map)) { + name_create_mdt(&mdtname, mti->mti_fsname, i); rc = mgs_write_log_mdc_to_mdt(obd, fsdb, mti, mdtname); name_destroy(&mdtname); } @@ -1674,7 +1732,6 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb, { struct llog_handle *llh = NULL; char *logname, *lovname; - char mdt_index[9]; char *ptr = mti->mti_params; int rc, flags = 0, failout = 0, i; ENTRY; @@ -1735,12 +1792,13 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb, mti->mti_svname); } - // for_all_existing_mdt + /* Add ost to all MDT lov defs */ for (i = 0; i < INDEX_MAP_SIZE * 8; i++){ - if (test_bit(i, fsdb->fsdb_mdt_index_map)) { - sprintf(mdt_index,"-MDT%04x",i); - name_create(&logname, mti->mti_fsname, mdt_index); - name_create(&lovname, logname, "-mdtlov"); + if (cfs_test_bit(i, fsdb->fsdb_mdt_index_map)) { + char mdt_index[9]; + + name_create_mdt_and_lov(&logname, &lovname, fsdb, i); + sprintf(mdt_index, "-MDT%04x", i); mgs_write_log_osc_to_lov(obd, fsdb, mti, logname, mdt_index, lovname, LUSTRE_SP_MDT, flags); @@ -1757,6 +1815,46 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb, RETURN(rc); } +static __inline__ int mgs_param_empty(char *ptr) +{ + char *tmp; + + if ((tmp = strchr(ptr, '=')) && (*(++tmp) == '\0')) + return 1; + return 0; +} + +static int mgs_write_log_failnid_internal(struct obd_device *obd, + struct fs_db *fsdb, + struct mgs_target_info *mti, + char *logname, char *cliname) +{ + int rc; + struct llog_handle *llh = NULL; + + if (mgs_param_empty(mti->mti_params)) { + /* Remove _all_ failnids */ + rc = mgs_modify(obd, fsdb, mti, logname, + mti->mti_svname, "add failnid", CM_SKIP); + return rc; + } + + /* Otherwise failover nids are additive */ + rc = record_start_log(obd, &llh, logname); + if (!rc) { + /* FIXME this should be a single journal transaction */ + rc = record_marker(obd, llh, fsdb, CM_START, + mti->mti_svname, "add failnid"); + rc = mgs_write_log_failnids(obd, mti, llh, cliname); + rc = record_marker(obd, llh, fsdb, CM_END, + mti->mti_svname, "add failnid"); + rc = record_end_log(obd, &llh); + } + + return rc; +} + + /* Add additional failnids to an existing log. The mdc/osc must have been added to logs first */ /* tcp nids must be in dotted-quad ascii - @@ -1765,15 +1863,12 @@ static int mgs_write_log_add_failnid(struct obd_device *obd, struct fs_db *fsdb, struct mgs_target_info *mti) { char *logname, *cliname; - struct llog_handle *llh = NULL; int rc; ENTRY; - /* FIXME how do we delete a failnid? Currently --writeconf is the - only way. Maybe make --erase-params pass a flag to really - erase all params from logs - except it can't erase the failnids - given when a target first registers, since they aren't processed - as params... */ + /* FIXME we currently can't erase the failnids + * given when a target first registers, since they aren't part of + * an "add uuid" stanza */ /* Verify that we know about this target */ if (mgs_log_is_empty(obd, mti->mti_svname)) { @@ -1792,36 +1887,28 @@ static int mgs_write_log_add_failnid(struct obd_device *obd, struct fs_db *fsdb, RETURN(-EINVAL); } - /* Add failover nids to client log */ + /* Add failover nids to the client log */ name_create(&logname, mti->mti_fsname, "-client"); - rc = record_start_log(obd, &llh, logname); - if (!rc) { - /* FIXME this fn should be a single journal transaction */ - rc = record_marker(obd, llh, fsdb, CM_START, mti->mti_svname, - "add failnid"); - rc = mgs_write_log_failnids(obd, mti, llh, cliname); - rc = record_marker(obd, llh, fsdb, CM_END, mti->mti_svname, - "add failnid"); - rc = record_end_log(obd, &llh); - } + rc = mgs_write_log_failnid_internal(obd, fsdb, mti, logname, cliname); name_destroy(&logname); + name_destroy(&cliname); if (mti->mti_flags & LDD_F_SV_TYPE_OST) { - /* Add OST failover nids to the MDT log as well */ - name_create(&logname, mti->mti_fsname, "-MDT0000"); - rc = record_start_log(obd, &llh, logname); - if (!rc) { - rc = record_marker(obd, llh, fsdb, CM_START, - mti->mti_svname, "add failnid"); - rc = mgs_write_log_failnids(obd, mti, llh, cliname); - rc = record_marker(obd, llh, fsdb, CM_END, - mti->mti_svname, "add failnid"); - rc = record_end_log(obd, &llh); + /* Add OST failover nids to the MDT logs as well */ + int i; + + for (i = 0; i < INDEX_MAP_SIZE * 8; i++) { + if (!cfs_test_bit(i, fsdb->fsdb_mdt_index_map)) + continue; + name_create_mdt(&logname, mti->mti_fsname, i); + name_create_mdt_osc(&cliname, mti->mti_svname, fsdb, i); + rc = mgs_write_log_failnid_internal(obd, fsdb, mti, + logname, cliname); + name_destroy(&cliname); + name_destroy(&logname); } - name_destroy(&logname); } - name_destroy(&cliname); RETURN(rc); } @@ -1833,7 +1920,7 @@ static int mgs_wlp_lcfg(struct obd_device *obd, struct fs_db *fsdb, char comment[MTI_NAME_MAXLEN]; char *tmp; struct lustre_cfg *lcfg; - int rc; + int rc, del; /* Erase any old settings of this same parameter */ memcpy(comment, ptr, MTI_NAME_MAXLEN); @@ -1843,8 +1930,12 @@ static int mgs_wlp_lcfg(struct obd_device *obd, struct fs_db *fsdb, *tmp = 0; /* FIXME we should skip settings that are the same as old values */ rc = mgs_modify(obd, fsdb, mti, logname, tgtname, comment, CM_SKIP); - LCONSOLE_INFO("%sing parameter %s.%s in log %s\n", rc ? + 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; lustre_cfg_bufs_reset(bufs, tgtname); lustre_cfg_bufs_set_string(bufs, 1, ptr); @@ -1856,6 +1947,55 @@ static int mgs_wlp_lcfg(struct obd_device *obd, struct fs_db *fsdb, return rc; } +/* write global variable settings into log */ +static int mgs_write_log_sys(struct obd_device *obd, struct fs_db *fsdb, + struct mgs_target_info *mti, char *sys, char *ptr) +{ + struct lustre_cfg_bufs bufs; + struct lustre_cfg *lcfg; + char *tmp; + char sep; + int cmd, val; + int rc; + + if (class_match_param(ptr, PARAM_TIMEOUT, &tmp) == 0) + cmd = LCFG_SET_TIMEOUT; + else if (class_match_param(ptr, PARAM_LDLM_TIMEOUT, &tmp) == 0) + cmd = LCFG_SET_LDLM_TIMEOUT; + /* Check for known params here so we can return error to lctl */ + else if ((class_match_param(ptr, PARAM_AT_MIN, &tmp) == 0) + || (class_match_param(ptr, PARAM_AT_MAX, &tmp) == 0) + || (class_match_param(ptr, PARAM_AT_EXTRA, &tmp) == 0) + || (class_match_param(ptr, PARAM_AT_EARLY_MARGIN, &tmp) == 0) + || (class_match_param(ptr, PARAM_AT_HISTORY, &tmp) == 0)) + cmd = LCFG_PARAM; + else + return -EINVAL; + + /* separate the value */ + val = simple_strtoul(tmp, NULL, 0); + if (*tmp == '\0') + CDEBUG(D_MGS, "global '%s' removed\n", sys); + else + CDEBUG(D_MGS, "global '%s' val=%d\n", sys, val); + + lustre_cfg_bufs_reset(&bufs, NULL); + lustre_cfg_bufs_set_string(&bufs, 1, sys); + lcfg = lustre_cfg_new(cmd, &bufs); + lcfg->lcfg_num = val; + /* truncate the comment to the parameter name */ + ptr = tmp - 1; + sep = *ptr; + *ptr = '\0'; + /* modify all servers and clients */ + rc = mgs_write_log_direct_all(obd, fsdb, mti, + *tmp == '\0' ? NULL : lcfg, + mti->mti_fsname, sys); + *ptr = sep; + lustre_cfg_free(lcfg); + return rc; +} + static int mgs_srpc_set_param_disk(struct obd_device *obd, struct fs_db *fsdb, struct mgs_target_info *mti, @@ -1902,12 +2042,13 @@ 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); - /* 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); - + 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); + } out: name_destroy(&logname); out_lcfg: @@ -2032,7 +2173,7 @@ static int mgs_srpc_set_param_mem(struct fs_db *fsdb, rset = &fsdb->fsdb_srpc_gen; } - rc = sptlrpc_rule_set_merge(rset, &rule, 1); + rc = sptlrpc_rule_set_merge(rset, &rule); RETURN(rc); } @@ -2043,9 +2184,12 @@ static int mgs_srpc_set_param(struct obd_device *obd, char *param) { char *copy; - int rc, copy_size; + int rc, copy_size, del; ENTRY; +#ifndef HAVE_GSS + RETURN(-EINVAL); +#endif /* keep a copy of original param, which could be destroied * during parsing */ copy_size = strlen(param) + 1; @@ -2054,9 +2198,12 @@ static int mgs_srpc_set_param(struct obd_device *obd, return -ENOMEM; memcpy(copy, param, copy_size); - rc = mgs_srpc_set_param_mem(fsdb, mti->mti_svname, param); - if (rc) - goto out_free; + del = mgs_param_empty(param); + if (!del) { + 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); @@ -2198,11 +2345,15 @@ out: RETURN(rc); } +/* Permanent settings of all parameters by writing into the appropriate + * configuration logs. + * A parameter with null value ("='\0'") means to erase it out of + * the logs. + */ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, struct mgs_target_info *mti, char *ptr) { struct lustre_cfg_bufs bufs; - struct lustre_cfg *lcfg; char *logname; char *tmp; int rc = 0; @@ -2247,26 +2398,13 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, GOTO(end, rc); } - if (class_match_param(ptr, PARAM_SYS_TIMEOUT, &tmp) == 0) { - /* Change obd timeout */ - int timeout; - timeout = simple_strtoul(tmp, NULL, 0); - - CDEBUG(D_MGS, "obd timeout %d\n", timeout); - lustre_cfg_bufs_reset(&bufs, NULL); - lcfg = lustre_cfg_new(LCFG_SET_TIMEOUT, &bufs); - lcfg->lcfg_num = timeout; - /* modify all servers and clients */ - rc = mgs_write_log_direct_all(obd, fsdb, mti, lcfg, - mti->mti_fsname, - "timeout"); - lustre_cfg_free(lcfg); + if (class_match_param(ptr, PARAM_SYS, &tmp) == 0) { + rc = mgs_write_log_sys(obd, fsdb, mti, ptr, tmp); GOTO(end, rc); } if (class_match_param(ptr, PARAM_OSC""PARAM_ACTIVE, &tmp) == 0) { /* active=0 means off, anything else means on */ - char mdt_index[16]; int flag = (*tmp == '0') ? CM_EXCLUDE : 0; int i; @@ -2286,12 +2424,11 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, if (rc) goto active_err; /* Modify mdtlov */ - /* FIXME add to all MDT logs for CMD */ + /* Add to all MDT logs for CMD */ for (i = 0; i < INDEX_MAP_SIZE * 8; i++) { - if (!test_bit(i, fsdb->fsdb_mdt_index_map)) + if (!cfs_test_bit(i, fsdb->fsdb_mdt_index_map)) continue; - sprintf(mdt_index,"-MDT%04x", i); - name_create(&logname, mti->mti_fsname, mdt_index); + name_create_mdt(&logname, mti->mti_fsname, i); rc = mgs_modify(obd, fsdb, mti, logname, mti->mti_svname, "add osc", flag); name_destroy(&logname); @@ -2321,7 +2458,6 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, /* All lov. in proc */ if (class_match_param(ptr, PARAM_LOV, NULL) == 0) { - char mdt_index[16]; char *mdtlovname; CDEBUG(D_MGS, "lov param %s\n", ptr); @@ -2337,9 +2473,8 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, if (mgs_log_is_empty(obd, mti->mti_svname)) GOTO(end, rc = -ENODEV); - sprintf(mdt_index,"-MDT%04x", mti->mti_stripe_index); - name_create(&logname, mti->mti_fsname, mdt_index); - name_create(&mdtlovname, logname, "-mdtlov"); + name_create_mdt_and_lov(&logname, &mdtlovname, fsdb, + mti->mti_stripe_index); rc = mgs_wlp_lcfg(obd, fsdb, mti, mti->mti_svname, &bufs, mdtlovname, ptr); name_destroy(&logname); @@ -2400,25 +2535,19 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, /* osc params affect the MDT as well */ if (!rc && (mti->mti_flags & LDD_F_SV_TYPE_OST)) { - char mdt_index[16]; int i; for (i = 0; i < INDEX_MAP_SIZE * 8; i++){ - if (!test_bit(i, fsdb->fsdb_mdt_index_map)) + if (!cfs_test_bit(i, fsdb->fsdb_mdt_index_map)) continue; name_destroy(&cname); - sprintf(mdt_index, "-osc-MDT%04x", i); - name_create(&cname, mti->mti_svname, - mdt_index); + name_create_mdt_osc(&cname, mti->mti_svname, + fsdb, i); name_destroy(&logname); - sprintf(mdt_index, "-MDT%04x", i); - name_create(&logname, mti->mti_fsname, - mdt_index); + name_create_mdt(&logname, mti->mti_fsname, i); if (!mgs_log_is_empty(obd, logname)) - rc = mgs_wlp_lcfg(obd, fsdb, - mti, logname, - &bufs, cname, - ptr); + rc = mgs_wlp_lcfg(obd, fsdb,mti,logname, + &bufs, cname, ptr); if (rc) break; } @@ -2430,7 +2559,6 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, /* All mdt. params in proc */ if (class_match_param(ptr, PARAM_MDT, NULL) == 0) { - char mdt_index[16]; int i; __u32 idx; @@ -2447,12 +2575,10 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, goto active_err; if (rc & LDD_F_SV_ALL) { for (i = 0; i < INDEX_MAP_SIZE * 8; i++) { - if (!test_bit(i, - fsdb->fsdb_mdt_index_map)) + if (!cfs_test_bit(i, + fsdb->fsdb_mdt_index_map)) continue; - sprintf(mdt_index,"-MDT%04x", i); - name_create(&logname, mti->mti_fsname, - mdt_index); + name_create_mdt(&logname, mti->mti_fsname, i); rc = mgs_wlp_lcfg(obd, fsdb, mti, logname, &bufs, logname, ptr); @@ -2513,9 +2639,9 @@ int mgs_check_failnid(struct obd_device *obd, struct mgs_target_info *mti) the failover list. Modify mti->params for rewriting back at server_register_target(). */ - down(&fsdb->fsdb_sem); + cfs_down(&fsdb->fsdb_sem); rc = mgs_write_log_add_failnid(obd, fsdb, mti); - up(&fsdb->fsdb_sem); + cfs_up(&fsdb->fsdb_sem); RETURN(rc); #endif @@ -2523,9 +2649,9 @@ int mgs_check_failnid(struct obd_device *obd, struct mgs_target_info *mti) } int mgs_write_log_target(struct obd_device *obd, - struct mgs_target_info *mti) + struct mgs_target_info *mti, + struct fs_db *fsdb) { - struct fs_db *fsdb; int rc = -EINVAL; char *buf, *params; ENTRY; @@ -2570,13 +2696,7 @@ int mgs_write_log_target(struct obd_device *obd, } } - rc = mgs_find_or_make_fsdb(obd, mti->mti_fsname, &fsdb); - if (rc) { - CERROR("Can't get db for %s\n", mti->mti_fsname); - RETURN(rc); - } - - down(&fsdb->fsdb_sem); + cfs_down(&fsdb->fsdb_sem); if (mti->mti_flags & (LDD_F_VIRGIN | LDD_F_UPGRADE14 | LDD_F_WRITECONF)) { @@ -2625,15 +2745,15 @@ int mgs_write_log_target(struct obd_device *obd, OBD_FREE(buf, strlen(mti->mti_params) + 1); out_up: - up(&fsdb->fsdb_sem); + cfs_up(&fsdb->fsdb_sem); RETURN(rc); } /* COMPAT_146 */ /* verify that we can handle the old config logs */ -int mgs_upgrade_sv_14(struct obd_device *obd, struct mgs_target_info *mti) +int mgs_upgrade_sv_14(struct obd_device *obd, struct mgs_target_info *mti, + struct fs_db *fsdb) { - struct fs_db *fsdb; int rc = 0; ENTRY; @@ -2652,10 +2772,6 @@ int mgs_upgrade_sv_14(struct obd_device *obd, struct mgs_target_info *mti) LCONSOLE_INFO("upgrading server %s from pre-1.6\n", mti->mti_svname); server_mti_print("upgrade", mti); - rc = mgs_find_or_make_fsdb(obd, mti->mti_fsname, &fsdb); - if (rc) - RETURN(rc); - if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) { LCONSOLE_ERROR_MSG(0x14a, "The old client log %s-client is " "missing. Was tunefs.lustre successful?\n", @@ -2731,9 +2847,10 @@ int mgs_erase_logs(struct obd_device *obd, char *fsname) { struct mgs_obd *mgs = &obd->u.mgs; static struct fs_db *fsdb; - struct list_head dentry_list; + cfs_list_t dentry_list; struct l_linux_dirent *dirent, *n; int rc, len = strlen(fsname); + char *suffix; ENTRY; /* Find all the logs in the CONFIGS directory */ @@ -2744,23 +2861,28 @@ int mgs_erase_logs(struct obd_device *obd, char *fsname) RETURN(rc); } - down(&mgs->mgs_sem); + cfs_down(&mgs->mgs_sem); /* Delete the fs db */ fsdb = mgs_find_fsdb(obd, fsname); if (fsdb) mgs_free_fsdb(obd, fsdb); - list_for_each_entry_safe(dirent, n, &dentry_list, lld_list) { - list_del(&dirent->lld_list); - if (strncmp(fsname, dirent->lld_name, len) == 0) { - CDEBUG(D_MGS, "Removing log %s\n", dirent->lld_name); - mgs_erase_log(obd, dirent->lld_name); + cfs_list_for_each_entry_safe(dirent, n, &dentry_list, lld_list) { + cfs_list_del(&dirent->lld_list); + suffix = strrchr(dirent->lld_name, '-'); + if (suffix != NULL) { + if ((len == suffix - dirent->lld_name) && + (strncmp(fsname, dirent->lld_name, len) == 0)) { + CDEBUG(D_MGS, "Removing log %s\n", + dirent->lld_name); + mgs_erase_log(obd, dirent->lld_name); + } } OBD_FREE(dirent, sizeof(*dirent)); } - up(&mgs->mgs_sem); + cfs_up(&mgs->mgs_sem); RETURN(rc); } @@ -2789,7 +2911,10 @@ static void print_lustre_cfg(struct lustre_cfg *lcfg) EXIT; } -/* Set a permanent (config log) param for a target or fs */ +/* Set a permanent (config log) param for a target or fs + * \param lcfg buf0 may contain the device (testfs-MDT0000) name + * buf1 contains the single parameter + */ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname) { struct fs_db *fsdb; @@ -2834,7 +2959,7 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname) strncpy(fsname, devname, MTI_NAME_MAXLEN); } fsname[MTI_NAME_MAXLEN - 1] = 0; - CDEBUG(D_MGS, "setparam on fs %s device %s\n", fsname, devname); + CDEBUG(D_MGS, "setparam fs='%s' device='%s'\n", fsname, devname); rc = mgs_find_or_make_fsdb(obd, fsname, &fsdb); if (rc) @@ -2865,12 +2990,17 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname) mti->mti_flags = rc | LDD_F_PARAM; - down(&fsdb->fsdb_sem); - /* this is lctl conf_param's single param path, there is not - need to loop through parameters */ + cfs_down(&fsdb->fsdb_sem); rc = mgs_write_log_param(obd, fsdb, mti, mti->mti_params); - up(&fsdb->fsdb_sem); + cfs_up(&fsdb->fsdb_sem); + /* + * Revoke lock so everyone updates. Should be alright if + * someone was already reading while we were updating the logs, + * so we don't really need to hold the lock while we're + * writing (above). + */ + mgs_revoke_lock(obd, fsdb); out: OBD_FREE_PTR(mti); RETURN(rc); @@ -2900,7 +3030,6 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd, char *fsname, char *poolname, char *ostname) { struct fs_db *fsdb; - char mdt_index[16]; char *lovname; char *logname; char *label = NULL, *canceled_label = NULL; @@ -2973,7 +3102,7 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd, } } - down(&fsdb->fsdb_sem); + cfs_down(&fsdb->fsdb_sem); if (canceled_label != NULL) { OBD_ALLOC_PTR(mti); @@ -2981,12 +3110,10 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd, GOTO(out, rc = -ENOMEM); } - /* loop on all potential MDT */ + /* write pool def to all MDT logs */ for (i = 0; i < INDEX_MAP_SIZE * 8; i++) { - if (test_bit(i, fsdb->fsdb_mdt_index_map)) { - sprintf(mdt_index, "-MDT%04x", i); - name_create(&logname, fsname, mdt_index); - name_create(&lovname, logname, "-mdtlov"); + if (cfs_test_bit(i, fsdb->fsdb_mdt_index_map)) { + name_create_mdt_and_lov(&logname, &lovname, fsdb, i); if (canceled_label != NULL) { strcpy(mti->mti_svname, "lov pool"); @@ -3011,7 +3138,9 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd, cmd, fsname, poolname, ostname, label); name_destroy(&logname); - up(&fsdb->fsdb_sem); + cfs_up(&fsdb->fsdb_sem); + /* request for update */ + mgs_revoke_lock(obd, fsdb); EXIT; out: