*
* 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
*/
* 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, 2017, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <lustre_fid.h>
#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)
{
lnet_nid_t *client_nid = localdata;
- struct nid_stat *tmp;
- int rc, is_new_nid;
+ struct nid_stat *stats;
+ int rc;
+
ENTRY;
- rc = lprocfs_exp_setup(exp, client_nid, &is_new_nid);
- if (rc != 0) {
- /* Mask error for already created /proc entries */
- if (rc == -EALREADY)
- rc = 0;
- GOTO(out, rc = 0);
- }
-
- if (!is_new_nid)
- GOTO(out, rc = 0);
-
- tmp = exp->exp_nid_stats;
- tmp->nid_stats = lprocfs_alloc_stats(NUM_OBD_STATS + LPROC_MGS_LAST,
- LPROCFS_STATS_FLAG_NOPERCPU);
- if (tmp->nid_stats == NULL)
- GOTO(out, rc = -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);
+ 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(LPROC_MGS_LAST,
+ LPROCFS_STATS_FLAG_NOPERCPU);
+ if (stats->nid_stats == NULL)
+ RETURN(-ENOMEM);
+
+ 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(tmp);
+ rc = lprocfs_nid_ldlm_stats_init(stats);
if (rc != 0)
GOTO(out, rc);
- RETURN(0);
out:
- return rc;
+ RETURN(rc);
}
/**
* 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;
+ return 0;
}
/* Remove client export data from the MGS */
int mgs_client_free(struct obd_export *exp)
{
- return 0;
+ return 0;
}
int mgs_fs_setup(const struct lu_env *env, struct mgs_device *mgs)
{
- struct lu_fid fid;
- struct dt_object *o;
- struct lu_fid rfid;
- struct dt_object *root;
- int rc;
+ struct lu_fid fid;
+ 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;
o = local_file_find_or_create(env, mgs->mgs_los, root,
MOUNT_CONFIGS_DIR,
- S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO);
+ S_IFDIR | 0755);
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);
+ dt_object_put(env, o);
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 | 0644,
+ &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) {
+ dt_object_put(env, nm_config_file_obj);
+ GOTO(out_configs, rc);
+ }
+ }
+ nm_config_file = nm_config_file_register_mgs(env, nm_config_file_obj,
+ mgs->mgs_los);
+ dt_object_put(env, nm_config_file_obj);
+ 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));
- }
+ S_IFDIR | 0755);
+ 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) {
+ dt_object_put(env, mgs->mgs_configs_dir);
+ mgs->mgs_configs_dir = NULL;
+ }
out_root:
- lu_object_put(env, &root->do_lu);
+ dt_object_put(env, root);
out_los:
if (rc) {
local_oid_storage_fini(env, mgs->mgs_los);
int mgs_fs_cleanup(const struct lu_env *env, struct mgs_device *mgs)
{
- class_disconnect_exports(mgs->mgs_obd); /* cleans up client info too */
+ struct lustre_cfg_bufs bufs;
+ struct lustre_cfg *lcfg;
+
+ /*
+ * For the MGS on independent device from MDT, it notifies the lower
+ * layer OSD to backup index before the umount via LCFG_PRE_CLEANUP.
+ */
+ lustre_cfg_bufs_reset(&bufs, mgs->mgs_obd->obd_name);
+ lustre_cfg_bufs_set_string(&bufs, 1, NULL);
+ OBD_ALLOC(lcfg, lustre_cfg_len(bufs.lcfg_bufcount, bufs.lcfg_buflen));
+ if (!lcfg) {
+ CERROR("%s: failed to trigger LCFG_PRE_CLEANUP\n",
+ mgs->mgs_obd->obd_name);
+ } else {
+ struct lu_device *l = &mgs->mgs_bottom->dd_lu_dev;
+
+ lustre_cfg_init(lcfg, LCFG_PRE_CLEANUP, &bufs);
+ l->ld_ops->ldo_process_config(env, l, lcfg);
+ OBD_FREE(lcfg, lustre_cfg_len(lcfg->lcfg_bufcount,
+ lcfg->lcfg_buflens));
+ }
if (mgs->mgs_configs_dir) {
- lu_object_put(env, &mgs->mgs_configs_dir->do_lu);
+ dt_object_put(env, mgs->mgs_configs_dir);
mgs->mgs_configs_dir = NULL;
}
if (mgs->mgs_nidtbl_dir) {
- lu_object_put(env, &mgs->mgs_nidtbl_dir->do_lu);
+ dt_object_put(env, mgs->mgs_nidtbl_dir);
mgs->mgs_nidtbl_dir = NULL;
}
+ if (mgs->mgs_obd->u.obt.obt_nodemap_config_file != NULL) {
+ struct nm_config_file *ncf;
+
+ 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;