X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmgs%2Fmgs_llog.c;h=98a11081bdfb1bf01402516598fc4b276074076f;hb=2d617260aaa5f778ab8dcb006e2a827f4b8f8567;hp=5cb82647afdd748dc0915c81b49c39471c24fcab;hpb=708bc9a21e4437a163e60492a0813a9bdf85dd29;p=fs%2Flustre-release.git diff --git a/lustre/mgs/mgs_llog.c b/lustre/mgs/mgs_llog.c index 5cb8264..98a1108 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. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * 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 @@ -89,7 +86,7 @@ int class_dentry_readdir(struct obd_device *obd, struct dentry *dir, GOTO(out_pop, rc = PTR_ERR(mnt)); } - file = dentry_open(dentry, mnt, O_RDONLY); + file = ll_dentry_open(dentry, mnt, O_RDONLY, current_cred()); if (IS_ERR(file)) /* dentry_open_it() drops the dentry, mnt refs */ GOTO(out_pop, rc = PTR_ERR(file)); @@ -139,10 +136,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); @@ -193,6 +190,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); cfs_set_bit(index, fsdb->fsdb_mdt_index_map); + fsdb->fsdb_mdt_count ++; } /* COMPAT_146 */ @@ -200,7 +198,7 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, /* #01 L attach 0:lov_mdsA 1:lov 2:cdbe9_lov_mdsA_dc8cf7f3bb */ if ((fsdb->fsdb_gen == 0) && (lcfg->lcfg_command == LCFG_ATTACH) && (strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_LOV_NAME) == 0)) { - fsdb->fsdb_flags |= FSDB_OLDLOG14; + cfs_set_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags); name_destroy(&fsdb->fsdb_clilov); rc = name_create(&fsdb->fsdb_clilov, lustre_cfg_string(lcfg, 0), ""); @@ -213,7 +211,7 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, if ((fsdb->fsdb_gen == 0) && (lcfg->lcfg_command == LCFG_SETUP) && (strncmp(lustre_cfg_string(lcfg, 0), "MDC_", 4) == 0)) { char *ptr; - fsdb->fsdb_flags |= FSDB_OLDLOG14; + cfs_set_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags); ptr = strstr(lustre_cfg_string(lcfg, 1), "_UUID"); if (!ptr) { CERROR("Can't parse MDT uuid %s\n", @@ -238,13 +236,13 @@ static int mgs_fsdb_handler(struct llog_handle *llh, struct llog_rec_hdr *rec, /* * compat to 1.8, check osc name used by MDT0 to OSTs, bz18548. */ - if (fsdb->fsdb_fl_oscname_18 == 0 && + if (!cfs_test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags) && 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; + cfs_set_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags); } } @@ -261,7 +259,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; @@ -275,28 +273,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) - fsdb->fsdb_flags |= FSDB_LOG_EMPTY; + 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); @@ -323,7 +322,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; @@ -355,11 +354,11 @@ 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); - fsdb->fsdb_fl_udesc = 1; + cfs_mutex_init(&fsdb->fsdb_mutex); + cfs_set_bit(FSDB_UDESC, &fsdb->fsdb_flags); if (strcmp(fsname, MGSSELF_NAME) == 0) { - fsdb->fsdb_fl_mgsself = 1; + cfs_set_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags); } else { OBD_ALLOC(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE); OBD_ALLOC(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE); @@ -381,6 +380,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); } @@ -403,9 +405,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) @@ -416,6 +422,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); } @@ -431,12 +438,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; } @@ -447,21 +454,21 @@ 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; - if (!fsdb->fsdb_fl_mgsself) { + if (!cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) { /* populate the db from the client llog */ rc = mgs_get_fsdb_from_llog(obd, fsdb); if (rc) { @@ -502,7 +509,7 @@ int mgs_check_index(struct obd_device *obd, struct mgs_target_info *mti) RETURN(rc); } - if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) + if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) RETURN(-1); if (mti->mti_flags & LDD_F_SV_TYPE_OST) @@ -532,7 +539,7 @@ static __inline__ int next_index(void *index_map, int map_len) 0 newly marked as in use <0 err +EALREADY for update of an old index */ -int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) +static int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) { struct fs_db *fsdb; void *imap; @@ -545,18 +552,26 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) RETURN(rc); } - if (mti->mti_flags & LDD_F_SV_TYPE_OST) + if (mti->mti_flags & LDD_F_SV_TYPE_OST) { imap = fsdb->fsdb_ost_index_map; - else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) + } else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) { imap = fsdb->fsdb_mdt_index_map; - else + if (fsdb->fsdb_mdt_count >= MAX_MDT_COUNT) { + LCONSOLE_ERROR_MSG(0x13f, "The max mdt count" + "is %d\n", (int)MAX_MDT_COUNT); + RETURN(-ERANGE); + } + } else { RETURN(-EINVAL); + } if (mti->mti_flags & LDD_F_NEED_INDEX) { rc = next_index(imap, INDEX_MAP_SIZE); if (rc == -1) RETURN(-ERANGE); mti->mti_stripe_index = rc; + if (mti->mti_flags & LDD_F_SV_TYPE_MDT) + fsdb->fsdb_mdt_count ++; } if (mti->mti_stripe_index >= INDEX_MAP_SIZE * 8) { @@ -584,8 +599,8 @@ int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti) } cfs_set_bit(mti->mti_stripe_index, imap); - fsdb->fsdb_flags &= ~FSDB_LOG_EMPTY; - server_make_name(mti->mti_flags, mti->mti_stripe_index, + cfs_clear_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags); + server_make_name(mti->mti_flags & ~LDD_F_VIRGIN, mti->mti_stripe_index, mti->mti_fsname, mti->mti_svname); CDEBUG(D_MGS, "Set index for %s to %d\n", mti->mti_svname, @@ -599,10 +614,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) - @@ -641,8 +657,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++; } @@ -669,11 +685,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); @@ -689,13 +705,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: @@ -728,7 +745,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); @@ -910,11 +927,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); @@ -933,7 +950,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); @@ -950,11 +967,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); @@ -1064,10 +1081,16 @@ struct temp_comp static int mgs_write_log_mdc_to_mdt(struct obd_device *, struct fs_db *, struct mgs_target_info *, char *); +static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb, + struct mgs_target_info *mti, + char *logname, char *suffix, char *lovname, + enum lustre_sec_part sec_part, int flags); +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; @@ -1110,6 +1133,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)"); @@ -1185,10 +1210,34 @@ static int mgs_steal_llog_handler(struct llog_handle *llh, memset(tmti, 0, sizeof(*tmti)); RETURN(rc); } + + 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); + 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); + name_destroy(&logname); + name_destroy(&lovname); + RETURN(rc); + } 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, @@ -1213,18 +1262,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: @@ -1296,7 +1346,7 @@ static int mgs_write_log_lov(struct obd_device *obd, struct fs_db *fsdb, lovdesc->ld_default_stripe_count = 1; lovdesc->ld_pattern = LOV_PATTERN_RAID0; lovdesc->ld_default_stripe_size = 1024 * 1024; - lovdesc->ld_default_stripe_offset = 0; + lovdesc->ld_default_stripe_offset = -1; lovdesc->ld_qos_maxage = QOS_DEFAULT_MAXAGE; sprintf((char*)lovdesc->ld_uuid.uuid, "%s_UUID", lovname); /* can these be the same? */ @@ -1372,7 +1422,7 @@ static int mgs_write_log_mdc_to_lmv(struct obd_device *obd, struct fs_db *fsdb, { struct llog_handle *llh = NULL; char *mdcname, *nodeuuid, *mdcuuid, *lmvuuid; - char index[5]; + char index[6]; int i, rc; ENTRY; @@ -1428,7 +1478,7 @@ static int mgs_write_log_mdc_to_mdt(struct obd_device *obd, struct fs_db *fsdb, int i, rc; ENTRY; - if (mgs_log_is_empty(obd, mti->mti_svname)) { + if (mgs_log_is_empty(obd, logname)) { CERROR("log is empty! Logical error\n"); RETURN (-EINVAL); } @@ -1522,7 +1572,7 @@ static void name_create_mdt_and_lov(char **logname, char **lovname, { name_create_mdt(logname, fsdb->fsdb_name, i); /* COMPAT_180 */ - if (i == 0 && fsdb->fsdb_fl_oscname_18) + if (i == 0 && cfs_test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags)) name_create(lovname, fsdb->fsdb_name, "-mdtlov"); else name_create(lovname, *logname, "-mdtlov"); @@ -1533,7 +1583,7 @@ static inline void name_create_mdt_osc(char **oscname, char *ostname, { char suffix[16]; - if (i == 0 && fsdb->fsdb_fl_oscname_18) + if (i == 0 && cfs_test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags)) sprintf(suffix, "-osc"); else sprintf(suffix, "-osc-MDT%04x", i); @@ -1669,7 +1719,7 @@ static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb, { struct llog_handle *llh = NULL; char *nodeuuid, *oscname, *oscuuid, *lovuuid, *svname; - char index[5]; + char index[6]; int i, rc; ENTRY; @@ -1677,9 +1727,8 @@ static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb, mti->mti_svname, logname); if (mgs_log_is_empty(obd, logname)) { - /* The first item in the log must be the lov, so we have - somewhere to add our osc. */ - rc = mgs_write_log_lov(obd, fsdb, mti, logname, lovname); + CERROR("log is empty! Logical error\n"); + RETURN (-EINVAL); } name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), ""); @@ -1776,7 +1825,7 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb, /* We also have to update the other logs where this osc is part of the lov */ - if (fsdb->fsdb_flags & FSDB_OLDLOG14) { + if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) { /* If we're upgrading, the old mdt log already has our entry. Let's do a fake one for fun. */ /* Note that we can't add any new failnids, since we don't @@ -1809,8 +1858,15 @@ static int mgs_write_log_ost(struct obd_device *obd, struct fs_db *fsdb, /* Append ost info to the client log */ name_create(&logname, mti->mti_fsname, "-client"); + if (mgs_log_is_empty(obd, logname)) { + /* Start client log */ + rc = mgs_write_log_lov(obd, fsdb, mti, logname, + fsdb->fsdb_clilov); + rc = mgs_write_log_lmv(obd, fsdb, mti, logname, + fsdb->fsdb_clilmv); + } mgs_write_log_osc_to_lov(obd, fsdb, mti, logname, "", - fsdb->fsdb_clilov, LUSTRE_SP_CLI, 0); + fsdb->fsdb_clilov, LUSTRE_SP_CLI, flags); name_destroy(&logname); RETURN(rc); } @@ -1949,51 +2005,67 @@ 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); + 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; } static int mgs_srpc_set_param_disk(struct obd_device *obd, @@ -2042,13 +2114,12 @@ 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); - 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); - } + /* 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: @@ -2077,10 +2148,10 @@ static int mgs_srpc_set_param_udesc_mem(struct fs_db *fsdb, goto error_out; if (strcmp(ptr, "yes") == 0) { - fsdb->fsdb_fl_udesc = 1; + cfs_set_bit(FSDB_UDESC, &fsdb->fsdb_flags); CWARN("Enable user descriptor shipping from client to MDT\n"); } else if (strcmp(ptr, "no") == 0) { - fsdb->fsdb_fl_udesc = 0; + cfs_clear_bit(FSDB_UDESC, &fsdb->fsdb_flags); CWARN("Disable user descriptor shipping from client to MDT\n"); } else { *(ptr - 1) = '='; @@ -2124,7 +2195,7 @@ static int mgs_srpc_set_param_mem(struct fs_db *fsdb, RETURN(rc); /* mgs rules implies must be mgc->mgs */ - if (fsdb->fsdb_fl_mgsself) { + if (cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) { if ((rule.sr_from != LUSTRE_SP_MGC && rule.sr_from != LUSTRE_SP_ANY) || (rule.sr_to != LUSTRE_SP_MGS && @@ -2184,7 +2255,7 @@ static int mgs_srpc_set_param(struct obd_device *obd, char *param) { char *copy; - int rc, copy_size, del; + int rc, copy_size; ENTRY; #ifndef HAVE_GSS @@ -2198,19 +2269,16 @@ static int mgs_srpc_set_param(struct obd_device *obd, return -ENOMEM; memcpy(copy, param, copy_size); - del = mgs_param_empty(param); - if (!del) { - rc = mgs_srpc_set_param_mem(fsdb, mti->mti_svname, param); - if (rc) - goto out_free; - } + 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); if (rc) goto out_free; - if (fsdb->fsdb_fl_mgsself) { + if (cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) { /* * for mgs rules, make them effective immediately. */ @@ -2228,11 +2296,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; @@ -2316,11 +2384,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); @@ -2330,10 +2398,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: @@ -2356,7 +2425,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, struct lustre_cfg_bufs bufs; char *logname; char *tmp; - int rc = 0; + int rc = 0, rc2 = 0; ENTRY; /* For various parameter settings, we have to figure out which logs @@ -2370,6 +2439,10 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, if (class_match_param(ptr, PARAM_MGSNODE, NULL) == 0) GOTO(end, rc); + /* Processed in ost/mdt */ + if (class_match_param(ptr, PARAM_NETWORK, NULL) == 0) + GOTO(end, rc); + /* Processed in mgs_write_log_ost */ if (class_match_param(ptr, PARAM_FAILMODE, NULL) == 0) { if (mti->mti_flags & LDD_F_PARAM) { @@ -2442,7 +2515,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, "changes were made to the " "config log.\n", mti->mti_svname, rc); - if (fsdb->fsdb_flags & FSDB_OLDLOG14) + if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) LCONSOLE_ERROR_MSG(0x146, "This may be" " because the log" "is in the old 1.4" @@ -2508,7 +2581,7 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, "-mdc"); } else if (mti->mti_flags & LDD_F_SV_TYPE_OST) { /* COMPAT_146 */ - if (fsdb->fsdb_flags & FSDB_OLDLOG14) { + if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) { LCONSOLE_ERROR_MSG(0x148, "Upgraded " "client logs for %s" " cannot be " @@ -2609,12 +2682,13 @@ static int mgs_write_log_param(struct obd_device *obd, struct fs_db *fsdb, } LCONSOLE_WARN("Ignoring unrecognized param '%s'\n", ptr); + rc2 = -ENOSYS; end: if (rc) CERROR("err %d on param '%s'\n", rc, ptr); - RETURN(rc); + RETURN(rc ?: rc2); } /* Not implementing automatic failover nid addition at this time. */ @@ -2639,9 +2713,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 @@ -2696,7 +2770,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)) { @@ -2745,7 +2819,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); } @@ -2772,7 +2846,7 @@ 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); - if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) { + if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) { LCONSOLE_ERROR_MSG(0x14a, "The old client log %s-client is " "missing. Was tunefs.lustre successful?\n", mti->mti_fsname); @@ -2805,7 +2879,7 @@ int mgs_upgrade_sv_14(struct obd_device *obd, struct mgs_target_info *mti, } } - if (!(fsdb->fsdb_flags & FSDB_OLDLOG14)) { + if (!cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) { LCONSOLE_ERROR_MSG(0x14c, "%s-client is supposedly an old " "log, but no old LOV or MDT was found. " "Consider updating the configuration with" @@ -2827,10 +2901,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); @@ -2846,7 +2920,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); @@ -2861,7 +2935,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); @@ -2882,7 +2956,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); } @@ -2964,7 +3038,8 @@ int mgs_setparam(struct obd_device *obd, struct lustre_cfg *lcfg, char *fsname) rc = mgs_find_or_make_fsdb(obd, fsname, &fsdb); if (rc) RETURN(rc); - if (!fsdb->fsdb_fl_mgsself && fsdb->fsdb_flags & FSDB_LOG_EMPTY) { + if (!cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags) && + cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) { CERROR("No filesystem targets for %s. cfg_device from lctl " "is '%s'\n", fsname, devname); mgs_free_fsdb(obd, fsdb); @@ -2990,9 +3065,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 @@ -3000,7 +3075,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); @@ -3043,7 +3118,7 @@ int mgs_pool_cmd(struct obd_device *obd, enum lcfg_command_type cmd, CERROR("Can't get db for %s\n", fsname); RETURN(rc); } - if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) { + if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) { CERROR("%s is not defined\n", fsname); mgs_free_fsdb(obd, fsdb); RETURN(-EINVAL); @@ -3102,7 +3177,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); @@ -3138,9 +3213,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: