X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmgs%2Fmgs_llog.c;h=f41532ae94ce1edcc44da17a2adca5fa1993b290;hp=a8bb398ca19efe805e12af7138f986869fd2e33b;hb=f52ece3201af131a7bb8a7b2766d3f0a98c00fca;hpb=1e6d526be18fa9bf7235431e18cd2a41e453c7da diff --git a/lustre/mgs/mgs_llog.c b/lustre/mgs/mgs_llog.c index a8bb398..f41532a 100644 --- a/lustre/mgs/mgs_llog.c +++ b/lustre/mgs/mgs_llog.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -28,6 +26,8 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,9 +40,6 @@ * Author: Nathan Rutman */ -#ifndef EXPORT_SYMTAB -#define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_MGS #define D_MGS D_CONFIG @@ -63,6 +60,7 @@ #include #include #include +#include #include "mgs_internal.h" /********************** Class functions ********************/ @@ -139,10 +137,10 @@ struct mgs_fsdb_handler_data */ /* 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) +static int mgs_fsdb_handler(const struct lu_env *env, struct llog_handle *llh, + struct llog_rec_hdr *rec, void *data) { - struct mgs_fsdb_handler_data *d = (struct mgs_fsdb_handler_data *) data; + struct mgs_fsdb_handler_data *d = data; struct fs_db *fsdb = d->fsdb; int cfg_len = rec->lrh_len; char *cfg_buf = (char*) (rec + 1); @@ -262,7 +260,7 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, RETURN(rc); } -/* fsdb->fsdb_sem is already held in mgs_find_or_make_fsdb*/ +/* fsdb->fsdb_mutex is already held in mgs_find_or_make_fsdb*/ static int mgs_get_fsdb_from_llog(struct obd_device *obd, struct fs_db *fsdb) { char *logname; @@ -276,28 +274,29 @@ static int mgs_get_fsdb_from_llog(struct obd_device *obd, struct fs_db *fsdb) ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); LASSERT(ctxt != NULL); name_create(&logname, fsdb->fsdb_name, "-client"); - cfs_down(&fsdb->fsdb_sem); + cfs_mutex_lock(&fsdb->fsdb_mutex); push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - rc = llog_create(ctxt, &loghandle, NULL, logname); - if (rc) - GOTO(out_pop, rc); + rc = llog_create(NULL, ctxt, &loghandle, NULL, logname); + if (rc) + GOTO(out_pop, rc); - rc = llog_init_handle(loghandle, LLOG_F_IS_PLAIN, NULL); + rc = llog_init_handle(NULL, loghandle, LLOG_F_IS_PLAIN, NULL); if (rc) GOTO(out_close, rc); if (llog_get_size(loghandle) <= 1) cfs_set_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags); - rc = llog_process(loghandle, mgs_fsdb_handler, (void *) &d, NULL); - CDEBUG(D_INFO, "get_db = %d\n", rc); + rc = llog_process(NULL, loghandle, mgs_fsdb_handler, (void *) &d, + NULL); + CDEBUG(D_INFO, "get_db = %d\n", rc); out_close: - rc2 = llog_close(loghandle); + rc2 = llog_close(NULL, loghandle); if (!rc) rc = rc2; out_pop: pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - cfs_up(&fsdb->fsdb_sem); + cfs_mutex_unlock(&fsdb->fsdb_mutex); name_destroy(&logname); llog_ctxt_put(ctxt); @@ -324,7 +323,7 @@ static void mgs_free_fsdb_srpc(struct fs_db *fsdb) sptlrpc_rule_set_free(&fsdb->fsdb_srpc_gen); } -static struct fs_db *mgs_find_fsdb(struct obd_device *obd, char *fsname) +struct fs_db *mgs_find_fsdb(struct obd_device *obd, char *fsname) { struct mgs_obd *mgs = &obd->u.mgs; struct fs_db *fsdb; @@ -356,7 +355,7 @@ static struct fs_db *mgs_new_fsdb(struct obd_device *obd, char *fsname) RETURN(NULL); strcpy(fsdb->fsdb_name, fsname); - cfs_sema_init(&fsdb->fsdb_sem, 1); + cfs_mutex_init(&fsdb->fsdb_mutex); cfs_set_bit(FSDB_UDESC, &fsdb->fsdb_flags); if (strcmp(fsname, MGSSELF_NAME) == 0) { @@ -382,6 +381,9 @@ static struct fs_db *mgs_new_fsdb(struct obd_device *obd, char *fsname) if (rc) GOTO(err, rc); + /* initialise data for NID table */ + mgs_ir_init_fs(obd, fsdb); + lproc_mgs_add_live(obd, fsdb); } @@ -404,9 +406,13 @@ err: static void mgs_free_fsdb(struct obd_device *obd, struct fs_db *fsdb) { /* wait for anyone with the sem */ - cfs_down(&fsdb->fsdb_sem); + cfs_mutex_lock(&fsdb->fsdb_mutex); lproc_mgs_del_live(obd, fsdb); cfs_list_del(&fsdb->fsdb_list); + + /* deinitialize fsr */ + mgs_ir_fini_fs(obd, fsdb); + if (fsdb->fsdb_ost_index_map) OBD_FREE(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE); if (fsdb->fsdb_mdt_index_map) @@ -417,6 +423,7 @@ static void mgs_free_fsdb(struct obd_device *obd, struct fs_db *fsdb) name_destroy(&fsdb->fsdb_mdtlmv); name_destroy(&fsdb->fsdb_mdc); mgs_free_fsdb_srpc(fsdb); + cfs_mutex_unlock(&fsdb->fsdb_mutex); OBD_FREE_PTR(fsdb); } @@ -432,12 +439,12 @@ int mgs_cleanup_fsdb_list(struct obd_device *obd) struct mgs_obd *mgs = &obd->u.mgs; struct fs_db *fsdb; cfs_list_t *tmp, *tmp2; - cfs_down(&mgs->mgs_sem); + cfs_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); mgs_free_fsdb(obd, fsdb); } - cfs_up(&mgs->mgs_sem); + cfs_mutex_unlock(&mgs->mgs_mutex); return 0; } @@ -448,17 +455,17 @@ int mgs_find_or_make_fsdb(struct obd_device *obd, char *name, struct fs_db *fsdb; int rc = 0; - cfs_down(&mgs->mgs_sem); + cfs_mutex_lock(&mgs->mgs_mutex); fsdb = mgs_find_fsdb(obd, name); if (fsdb) { - cfs_up(&mgs->mgs_sem); + cfs_mutex_unlock(&mgs->mgs_mutex); *dbh = fsdb; return 0; } CDEBUG(D_MGS, "Creating new db\n"); fsdb = mgs_new_fsdb(obd, name); - cfs_up(&mgs->mgs_sem); + cfs_mutex_unlock(&mgs->mgs_mutex); if (!fsdb) return -ENOMEM; @@ -594,8 +601,8 @@ static int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) cfs_set_bit(mti->mti_stripe_index, imap); cfs_clear_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags); - server_make_name(mti->mti_flags, mti->mti_stripe_index, - mti->mti_fsname, mti->mti_svname); + server_make_name(mti->mti_flags & ~(LDD_F_VIRGIN | LDD_F_WRITECONF), + mti->mti_stripe_index, mti->mti_fsname, mti->mti_svname); CDEBUG(D_MGS, "Set index for %s to %d\n", mti->mti_svname, mti->mti_stripe_index); @@ -608,10 +615,11 @@ struct mgs_modify_lookup { int mml_modified; }; -static int mgs_modify_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, - void *data) +static int mgs_modify_handler(const struct lu_env *env, + struct llog_handle *llh, + struct llog_rec_hdr *rec, void *data) { - struct mgs_modify_lookup *mml = (struct mgs_modify_lookup *)data; + struct mgs_modify_lookup *mml = data; struct cfg_marker *marker; struct lustre_cfg *lcfg = (struct lustre_cfg *)(rec + 1); int cfg_len = rec->lrh_len - sizeof(struct llog_rec_hdr) - @@ -650,8 +658,8 @@ static int mgs_modify_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, /* Header and tail are added back to lrh_len in llog_lvfs_write_rec */ rec->lrh_len = cfg_len; - rc = llog_write_rec(llh, rec, NULL, 0, (void *)lcfg, - rec->lrh_index); + rc = llog_write_rec(NULL, llh, rec, NULL, 0, (void *)lcfg, + rec->lrh_index); if (!rc) mml->mml_modified++; } @@ -678,11 +686,11 @@ static int mgs_modify(struct obd_device *obd, struct fs_db *fsdb, ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); LASSERT(ctxt != NULL); - rc = llog_create(ctxt, &loghandle, NULL, logname); + rc = llog_create(NULL, ctxt, &loghandle, NULL, logname); if (rc) GOTO(out_pop, rc); - rc = llog_init_handle(loghandle, LLOG_F_IS_PLAIN, NULL); + rc = llog_init_handle(NULL, loghandle, LLOG_F_IS_PLAIN, NULL); if (rc) GOTO(out_close, rc); @@ -698,13 +706,14 @@ static int mgs_modify(struct obd_device *obd, struct fs_db *fsdb, mml->mml_marker.cm_flags = flags; mml->mml_marker.cm_canceltime = flags ? cfs_time_current_sec() : 0; mml->mml_modified = 0; - rc = llog_process(loghandle, mgs_modify_handler, (void *)mml, NULL); + rc = llog_process(NULL, loghandle, mgs_modify_handler, (void *)mml, + NULL); if (!rc && !mml->mml_modified) rc = -ENODEV; OBD_FREE_PTR(mml); out_close: - rc2 = llog_close(loghandle); + rc2 = llog_close(NULL, loghandle); if (!rc) rc = rc2; out_pop: @@ -737,7 +746,7 @@ static int record_lcfg(struct obd_device *obd, struct llog_handle *llh, push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); /* idx = -1 means append */ - rc = llog_write_rec(llh, &rec, NULL, 0, (void *)lcfg, -1); + rc = llog_write_rec(NULL, llh, &rec, NULL, 0, (void *)lcfg, -1); pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); if (rc) CERROR("failed %d\n", rc); @@ -919,11 +928,11 @@ static int record_start_log(struct obd_device *obd, GOTO(out, rc = -ENODEV); push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - rc = llog_create(ctxt, llh, NULL, name); - if (rc == 0) - llog_init_handle(*llh, LLOG_F_IS_PLAIN, &cfg_uuid); - else - *llh = NULL; + rc = llog_create(NULL, ctxt, llh, NULL, name); + if (rc == 0) + llog_init_handle(NULL, *llh, LLOG_F_IS_PLAIN, &cfg_uuid); + else + *llh = NULL; pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); llog_ctxt_put(ctxt); @@ -942,7 +951,7 @@ static int record_end_log(struct obd_device *obd, struct llog_handle **llh) push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - rc = llog_close(*llh); + rc = llog_close(NULL, *llh); *llh = NULL; pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); @@ -959,11 +968,11 @@ static int mgs_log_is_empty(struct obd_device *obd, char *name) ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); LASSERT(ctxt != NULL); push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - rc = llog_create(ctxt, &llh, NULL, name); + rc = llog_create(NULL, ctxt, &llh, NULL, name); if (rc == 0) { - llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL); - rc = llog_get_size(llh); - llog_close(llh); + llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL); + rc = llog_get_size(llh); + llog_close(NULL, llh); } pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); llog_ctxt_put(ctxt); @@ -1002,9 +1011,10 @@ static int mgs_write_log_direct(struct obd_device *obd, struct fs_db *fsdb, /* write the lcfg in all logs for the given fs */ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb, - struct mgs_target_info *mti, - struct lustre_cfg *lcfg, - char *devname, char *comment) + struct mgs_target_info *mti, + struct lustre_cfg *lcfg, + char *devname, char *comment, + int server_only) { struct mgs_obd *mgs = &obd->u.mgs; cfs_list_t dentry_list; @@ -1040,8 +1050,14 @@ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb, 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) { + if (strstr(dirent->lld_name, "-sptlrpc") != NULL) + goto next; + + /* caller wants write server logs only */ + if (server_only && strstr(dirent->lld_name, "-client") != NULL) + goto next; + + if (strncmp(fsname, dirent->lld_name, len) == 0) { CDEBUG(D_MGS, "Changing log %s\n", dirent->lld_name); /* Erase any old settings of this same parameter */ mgs_modify(obd, fsdb, mti, dirent->lld_name, devname, @@ -1057,6 +1073,7 @@ int mgs_write_log_direct_all(struct obd_device *obd, struct fs_db *fsdb, dirent->lld_name); } } +next: OBD_FREE(dirent, sizeof(*dirent)); } @@ -1080,9 +1097,9 @@ static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb, static void name_create_mdt_and_lov(char **logname, char **lovname, struct fs_db *fsdb, int i); -static int mgs_steal_llog_handler(struct llog_handle *llh, - struct llog_rec_hdr *rec, - void *data) +static int mgs_steal_llog_handler(const struct lu_env *env, + struct llog_handle *llh, + struct llog_rec_hdr *rec, void *data) { struct obd_device * obd; struct mgs_target_info *mti, *tmti; @@ -1125,6 +1142,8 @@ static int mgs_steal_llog_handler(struct llog_handle *llh, if (!strncmp(marker->cm_comment,"add osc",7) && (marker->cm_flags & CM_START)){ got_an_osc_or_mdc = 1; + strncpy(tmti->mti_svname, marker->cm_tgtname, + sizeof(tmti->mti_svname)); rc = record_start_log(obd, &mdt_llh, mti->mti_svname); rc = record_marker(obd, mdt_llh, fsdb, CM_START, mti->mti_svname,"add osc(copied)"); @@ -1202,12 +1221,21 @@ static int mgs_steal_llog_handler(struct llog_handle *llh, } if (lcfg->lcfg_command == LCFG_LOV_ADD_OBD) { + int index; char mdt_index[9]; char *logname, *lovname; - name_create_mdt_and_lov(&logname, &lovname, fsdb, mti->mti_stripe_index); + name_create_mdt_and_lov(&logname, &lovname, fsdb, + mti->mti_stripe_index); sprintf(mdt_index, "-MDT%04x", mti->mti_stripe_index); + if (sscanf(lustre_cfg_buf(lcfg, 2), "%d", &index) != 1) { + name_destroy(&logname); + name_destroy(&lovname); + RETURN(-EINVAL); + } + + tmti->mti_stripe_index = index; mgs_write_log_osc_to_lov(obd, fsdb, tmti, logname, mdt_index, lovname, LUSTRE_SP_MDT, 0); @@ -1218,7 +1246,7 @@ static int mgs_steal_llog_handler(struct llog_handle *llh, RETURN(rc); } -/* fsdb->fsdb_sem is already held in mgs_write_log_target*/ +/* fsdb->fsdb_mutex is already held in mgs_write_log_target*/ /* stealed from mgs_get_fsdb_from_llog*/ static int mgs_steal_llog_for_mdt_from_client(struct obd_device *obd, char *client_name, @@ -1243,18 +1271,19 @@ static int mgs_steal_llog_for_mdt_from_client(struct obd_device *obd, push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - rc = llog_create(ctxt, &loghandle, NULL, client_name); + rc = llog_create(NULL, ctxt, &loghandle, NULL, client_name); if (rc) GOTO(out_pop, rc); - rc = llog_init_handle(loghandle, LLOG_F_IS_PLAIN, NULL); + rc = llog_init_handle(NULL, loghandle, LLOG_F_IS_PLAIN, NULL); if (rc) GOTO(out_close, rc); - rc = llog_process(loghandle, mgs_steal_llog_handler, (void *)comp, NULL); + rc = llog_process(NULL, loghandle, mgs_steal_llog_handler, + (void *)comp, NULL); CDEBUG(D_MGS, "steal llog re = %d\n", rc); out_close: - rc2 = llog_close(loghandle); + rc2 = llog_close(NULL, loghandle); if (!rc) rc = rc2; out_pop: @@ -1985,51 +2014,119 @@ static int mgs_wlp_lcfg(struct obd_device *obd, struct fs_db *fsdb, /* 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; + struct mgs_target_info *mti, char *sys, char *ptr) +{ + struct lustre_cfg_bufs bufs; + struct lustre_cfg *lcfg; + char *tmp, sep; + int rc, cmd, convert = 1; + + 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 if (class_match_param(ptr, PARAM_JOBID_VAR, &tmp) == 0) { + convert = 0; /* Don't convert string value to integer */ + cmd = LCFG_PARAM; + } else { + return -EINVAL; + } + + if (mgs_param_empty(ptr)) + CDEBUG(D_MGS, "global '%s' removed\n", sys); + else + CDEBUG(D_MGS, "global '%s' val=%s\n", sys, tmp); + + lustre_cfg_bufs_reset(&bufs, NULL); + lustre_cfg_bufs_set_string(&bufs, 1, sys); + if (!convert && *tmp != '\0') + lustre_cfg_bufs_set_string(&bufs, 2, tmp); + lcfg = lustre_cfg_new(cmd, &bufs); + lcfg->lcfg_num = convert ? simple_strtoul(tmp, NULL, 0) : 0; + /* 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, 0); + if (rc == 0 && *tmp != '\0') { + switch (cmd) { + case LCFG_SET_TIMEOUT: + if (!obd_timeout_set || lcfg->lcfg_num > obd_timeout) + class_process_config(lcfg); + break; + case LCFG_SET_LDLM_TIMEOUT: + if (!ldlm_timeout_set || lcfg->lcfg_num > ldlm_timeout) + class_process_config(lcfg); + break; + default: + break; + } + } + *ptr = sep; + lustre_cfg_free(lcfg); + return rc; +} + +/* write quota settings into log */ +static int mgs_write_log_quota(struct obd_device *obd, struct fs_db *fsdb, + struct mgs_target_info *mti, char *quota, + char *ptr) +{ + struct lustre_cfg_bufs bufs; + struct lustre_cfg *lcfg; + char *tmp; + char sep; + int cmd = LCFG_PARAM; + int rc; + + /* support only 'meta' and 'data' pools so far */ + if (class_match_param(ptr, QUOTA_METAPOOL_NAME, &tmp) != 0 && + class_match_param(ptr, QUOTA_DATAPOOL_NAME, &tmp) != 0) { + CERROR("parameter quota.%s isn't supported (only quota.mdt " + "& quota.ost are)\n", ptr); + return -EINVAL; + } + + if (*tmp == '\0') { + CDEBUG(D_MGS, "global '%s' removed\n", quota); + } else { + CDEBUG(D_MGS, "global '%s'\n", quota); + + if (strchr(tmp, 'u') == NULL && strchr(tmp, 'g') == NULL && + strcmp(tmp, "none") != 0) { + CERROR("enable option(%s) isn't supported\n", tmp); + return -EINVAL; + } + } + + lustre_cfg_bufs_reset(&bufs, NULL); + lustre_cfg_bufs_set_string(&bufs, 1, quota); + lcfg = lustre_cfg_new(cmd, &bufs); + /* truncate the comment to the parameter name */ + ptr = tmp - 1; + sep = *ptr; + *ptr = '\0'; + + /* XXX we duplicated quota enable information in all server + * config logs, it should be moved to a separate config + * log once we cleanup the config log for global param. */ + /* modify all servers */ + rc = mgs_write_log_direct_all(obd, fsdb, mti, + *tmp == '\0' ? NULL : lcfg, + mti->mti_fsname, quota, 1); + *ptr = sep; + lustre_cfg_free(lcfg); + return rc; } static int mgs_srpc_set_param_disk(struct obd_device *obd, @@ -2260,11 +2357,11 @@ struct mgs_srpc_read_data { int msrd_skip; }; -static int mgs_srpc_read_handler(struct llog_handle *llh, - struct llog_rec_hdr *rec, - void *data) +static int mgs_srpc_read_handler(const struct lu_env *env, + struct llog_handle *llh, + struct llog_rec_hdr *rec, void *data) { - struct mgs_srpc_read_data *msrd = (struct mgs_srpc_read_data *) data; + struct mgs_srpc_read_data *msrd = data; struct cfg_marker *marker; struct lustre_cfg *lcfg = (struct lustre_cfg *)(rec + 1); char *svname, *param; @@ -2348,11 +2445,11 @@ int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd, push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - rc = llog_create(ctxt, &llh, NULL, logname); + rc = llog_create(NULL, ctxt, &llh, NULL, logname); if (rc) GOTO(out_pop, rc); - rc = llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL); + rc = llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL); if (rc) GOTO(out_close, rc); @@ -2362,10 +2459,11 @@ int mgs_get_fsdb_srpc_from_llog(struct obd_device *obd, msrd.msrd_fsdb = fsdb; msrd.msrd_skip = 0; - rc = llog_process(llh, mgs_srpc_read_handler, (void *) &msrd, NULL); + rc = llog_process(NULL, llh, mgs_srpc_read_handler, (void *) &msrd, + NULL); out_close: - llog_close(llh); + llog_close(NULL, llh); out_pop: pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); out: @@ -2439,6 +2537,11 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, GOTO(end, rc); } + if (class_match_param(ptr, PARAM_QUOTA, &tmp) == 0) { + rc = mgs_write_log_quota(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 */ int flag = (*tmp == '0') ? CM_EXCLUDE : 0; @@ -2676,9 +2779,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(). */ - cfs_down(&fsdb->fsdb_sem); + cfs_mutex_lock(&fsdb->fsdb_mutex); rc = mgs_write_log_add_failnid(obd, fsdb, mti); - cfs_up(&fsdb->fsdb_sem); + cfs_mutex_unlock(&fsdb->fsdb_mutex); RETURN(rc); #endif @@ -2733,7 +2836,7 @@ int mgs_write_log_target(struct obd_device *obd, } } - cfs_down(&fsdb->fsdb_sem); + cfs_mutex_lock(&fsdb->fsdb_mutex); if (mti->mti_flags & (LDD_F_VIRGIN | LDD_F_UPGRADE14 | LDD_F_WRITECONF)) { @@ -2782,7 +2885,7 @@ int mgs_write_log_target(struct obd_device *obd, OBD_FREE(buf, strlen(mti->mti_params) + 1); out_up: - cfs_up(&fsdb->fsdb_sem); + cfs_mutex_unlock(&fsdb->fsdb_mutex); RETURN(rc); } @@ -2864,10 +2967,10 @@ int mgs_erase_log(struct obd_device *obd, char *name) LASSERT(ctxt != NULL); push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - rc = llog_create(ctxt, &llh, NULL, name); - if (rc == 0) { - llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL); - rc = llog_destroy(llh); + rc = llog_create(NULL, ctxt, &llh, NULL, name); + if (rc == 0) { + llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL); + rc = llog_destroy(NULL, llh); llog_free_handle(llh); } pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); @@ -2883,7 +2986,7 @@ int mgs_erase_log(struct obd_device *obd, char *name) int mgs_erase_logs(struct obd_device *obd, char *fsname) { struct mgs_obd *mgs = &obd->u.mgs; - static struct fs_db *fsdb; + struct fs_db *fsdb; cfs_list_t dentry_list; struct l_linux_dirent *dirent, *n; int rc, len = strlen(fsname); @@ -2898,7 +3001,7 @@ int mgs_erase_logs(struct obd_device *obd, char *fsname) RETURN(rc); } - cfs_down(&mgs->mgs_sem); + cfs_mutex_lock(&mgs->mgs_mutex); /* Delete the fs db */ fsdb = mgs_find_fsdb(obd, fsname); @@ -2919,7 +3022,7 @@ int mgs_erase_logs(struct obd_device *obd, char *fsname) OBD_FREE(dirent, sizeof(*dirent)); } - cfs_up(&mgs->mgs_sem); + cfs_mutex_unlock(&mgs->mgs_mutex); RETURN(rc); } @@ -3028,9 +3131,9 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname) mti->mti_flags = rc | LDD_F_PARAM; - cfs_down(&fsdb->fsdb_sem); + cfs_mutex_lock(&fsdb->fsdb_mutex); rc = mgs_write_log_param(obd, fsdb, mti, mti->mti_params); - cfs_up(&fsdb->fsdb_sem); + cfs_mutex_unlock(&fsdb->fsdb_mutex); /* * Revoke lock so everyone updates. Should be alright if @@ -3038,7 +3141,7 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname) * so we don't really need to hold the lock while we're * writing (above). */ - mgs_revoke_lock(obd, fsdb); + mgs_revoke_lock(obd, fsdb, CONFIG_T_CONFIG); out: OBD_FREE_PTR(mti); RETURN(rc); @@ -3140,7 +3243,7 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd, } } - cfs_down(&fsdb->fsdb_sem); + cfs_mutex_lock(&fsdb->fsdb_mutex); if (canceled_label != NULL) { OBD_ALLOC_PTR(mti); @@ -3176,9 +3279,9 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd, cmd, fsname, poolname, ostname, label); name_destroy(&logname); - cfs_up(&fsdb->fsdb_sem); + cfs_mutex_unlock(&fsdb->fsdb_mutex); /* request for update */ - mgs_revoke_lock(obd, fsdb); + mgs_revoke_lock(obd, fsdb, CONFIG_T_CONFIG); EXIT; out: