X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmgs%2Fmgs_fs.c;h=b4c745d4f65d5c427766648fc28e48a10ed434b5;hb=e760042016bb5b12f9b21568304c02711930720f;hp=231b6af9675a1589888be1bbeb6eaec52745c354;hpb=08aa217ce49aba1ded52e0f7adb8a607035123fd;p=fs%2Flustre-release.git diff --git a/lustre/mgs/mgs_fs.c b/lustre/mgs/mgs_fs.c index 231b6af..b4c745d 100644 --- a/lustre/mgs/mgs_fs.c +++ b/lustre/mgs/mgs_fs.c @@ -15,11 +15,7 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -27,7 +23,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2012, Intel Corporation. + * Copyright (c) 2011, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -46,46 +42,54 @@ #include #include "mgs_internal.h" +/** + * Initialize MGS per-export statistics. + * + * This function sets up procfs entries for various MGS export counters. These + * counters are for per-client statistics tracked on the server. + * + * \param[in] obd OBD device + * \param[in] exp OBD export + * \param[in] localdata NID of client + * + * \retval 0 if successful + * \retval negative value on error + */ int mgs_export_stats_init(struct obd_device *obd, struct obd_export *exp, - void *localdata) - + void *localdata) { - lnet_nid_t *client_nid = localdata; - int rc, newnid; - ENTRY; - - rc = lprocfs_exp_setup(exp, client_nid, &newnid); - if (rc) { - /* Mask error for already created - * /proc entries */ - if (rc == -EALREADY) - rc = 0; - RETURN(rc); - } - if (newnid) { - struct nid_stat *tmp = exp->exp_nid_stats; - int num_stats = 0; - - num_stats = (sizeof(*obd->obd_type->typ_dt_ops) / sizeof(void *)) + - LPROC_MGS_LAST - 1; - tmp->nid_stats = lprocfs_alloc_stats(num_stats, - LPROCFS_STATS_FLAG_NOPERCPU); - if (tmp->nid_stats == NULL) - return -ENOMEM; - lprocfs_init_ops_stats(LPROC_MGS_LAST, tmp->nid_stats); - mgs_stats_counter_init(tmp->nid_stats); - rc = lprocfs_register_stats(tmp->nid_proc, "stats", - tmp->nid_stats); - if (rc) - GOTO(clean, rc); - - rc = lprocfs_nid_ldlm_stats_init(tmp); - if (rc) - GOTO(clean, rc); - } - RETURN(0); -clean: - return rc; + lnet_nid_t *client_nid = localdata; + struct nid_stat *stats; + int rc; + ENTRY; + + rc = lprocfs_exp_setup(exp, client_nid); + if (rc != 0) + /* Mask error for already created /proc entries */ + RETURN(rc == -EALREADY ? 0 : rc); + + stats = exp->exp_nid_stats; + stats->nid_stats = lprocfs_alloc_stats(NUM_OBD_STATS + LPROC_MGS_LAST, + LPROCFS_STATS_FLAG_NOPERCPU); + if (stats->nid_stats == NULL) + RETURN(-ENOMEM); + + lprocfs_init_ops_stats(LPROC_MGS_LAST, stats->nid_stats); + + mgs_stats_counter_init(stats->nid_stats); + + rc = lprocfs_register_stats(stats->nid_proc, "stats", stats->nid_stats); + if (rc != 0) { + lprocfs_free_stats(&stats->nid_stats); + GOTO(out, rc); + } + + rc = lprocfs_nid_ldlm_stats_init(stats); + if (rc != 0) + GOTO(out, rc); + +out: + RETURN(rc); } /** @@ -94,7 +98,7 @@ clean: * crash all connections are treated as new connections. */ int mgs_client_add(struct obd_device *obd, struct obd_export *exp, - void *localdata) + void *localdata) { return 0; } @@ -111,15 +115,12 @@ int mgs_fs_setup(const struct lu_env *env, struct mgs_device *mgs) struct dt_object *o; struct lu_fid rfid; struct dt_object *root; + struct dt_object *nm_config_file_obj; + struct nm_config_file *nm_config_file; int rc; ENTRY; - /* FIXME what's this? Do I need it? */ - rc = cfs_cleanup_group_info(); - if (rc) - RETURN(rc); - OBD_SET_CTXT_MAGIC(&mgs->mgs_obd->obd_lvfs_ctxt); mgs->mgs_obd->obd_lvfs_ctxt.dt = mgs->mgs_bottom; @@ -141,9 +142,9 @@ int mgs_fs_setup(const struct lu_env *env, struct mgs_device *mgs) GOTO(out_los, rc); root = dt_locate_at(env, mgs->mgs_bottom, &rfid, - &mgs->mgs_dt_dev.dd_lu_dev); + &mgs->mgs_dt_dev.dd_lu_dev, NULL); if (unlikely(IS_ERR(root))) - GOTO(out_los, PTR_ERR(root)); + GOTO(out_los, rc = PTR_ERR(root)); o = local_file_find_or_create(env, mgs->mgs_los, root, MOUNT_CONFIGS_DIR, @@ -151,19 +152,61 @@ int mgs_fs_setup(const struct lu_env *env, struct mgs_device *mgs) if (IS_ERR(o)) GOTO(out_root, rc = PTR_ERR(o)); + if (!dt_try_as_dir(env, o)) { + lu_object_put(env, &o->do_lu); + GOTO(out_root, rc = -ENOTDIR); + } + mgs->mgs_configs_dir = o; + /* colocated MDT will cache config in target root dir */ + nm_config_file_obj = local_index_find_or_create(env, mgs->mgs_los, + mgs->mgs_configs_dir, + LUSTRE_NODEMAP_NAME, + S_IFREG | S_IRUGO | + S_IWUSR, + &dt_nodemap_features); + if (IS_ERR(nm_config_file_obj)) + GOTO(out_configs, rc = PTR_ERR(nm_config_file_obj)); + + if (nm_config_file_obj->do_index_ops == NULL) { + rc = nm_config_file_obj->do_ops->do_index_try(env, + nm_config_file_obj, + &dt_nodemap_features); + if (rc < 0) { + lu_object_put(env, &nm_config_file_obj->do_lu); + GOTO(out_configs, rc); + } + } + nm_config_file = nm_config_file_register_mgs(env, nm_config_file_obj, + mgs->mgs_los); + lu_object_put(env, &nm_config_file_obj->do_lu); + if (IS_ERR(nm_config_file)) { + CERROR("%s: error loading nodemap config file, file must be " + "removed via ldiskfs: rc = %ld\n", + mgs->mgs_obd->obd_name, PTR_ERR(nm_config_file)); + GOTO(out_configs, rc = PTR_ERR(nm_config_file)); + } + mgs->mgs_obd->u.obt.obt_nodemap_config_file = nm_config_file; + /* create directory to store nid table versions */ o = local_file_find_or_create(env, mgs->mgs_los, root, MGS_NIDTBL_DIR, S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO); - if (IS_ERR(o)) { - lu_object_put(env, &mgs->mgs_configs_dir->do_lu); - mgs->mgs_configs_dir = NULL; - GOTO(out_root, rc = PTR_ERR(o)); - } + if (IS_ERR(o)) + GOTO(out_nm, rc = PTR_ERR(o)); mgs->mgs_nidtbl_dir = o; +out_nm: + if (rc < 0) { + nm_config_file_deregister_mgs(env, nm_config_file); + mgs->mgs_obd->u.obt.obt_nodemap_config_file = NULL; + } +out_configs: + if (rc < 0) { + lu_object_put(env, &mgs->mgs_configs_dir->do_lu); + mgs->mgs_configs_dir = NULL; + } out_root: lu_object_put(env, &root->do_lu); out_los: @@ -179,8 +222,6 @@ out: int mgs_fs_cleanup(const struct lu_env *env, struct mgs_device *mgs) { - class_disconnect_exports(mgs->mgs_obd); /* cleans up client info too */ - if (mgs->mgs_configs_dir) { lu_object_put(env, &mgs->mgs_configs_dir->do_lu); mgs->mgs_configs_dir = NULL; @@ -189,6 +230,13 @@ int mgs_fs_cleanup(const struct lu_env *env, struct mgs_device *mgs) lu_object_put(env, &mgs->mgs_nidtbl_dir->do_lu); mgs->mgs_nidtbl_dir = NULL; } + if (mgs->mgs_obd->u.obt.obt_nodemap_config_file != NULL) { + struct nm_config_file *ncf = mgs->mgs_obd->u.obt.obt_nodemap_config_file; + + nm_config_file_deregister_mgs(env, ncf); + mgs->mgs_obd->u.obt.obt_nodemap_config_file = NULL; + } + if (mgs->mgs_los) { local_oid_storage_fini(env, mgs->mgs_los); mgs->mgs_los = NULL;