In lprocfs_exp_setup(), we need release old stats in all cases.
Bugzilla: 23499
Change-Id: Ida40ffe82a12e213779e344da92f5e3e437f8c8b
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Reviewed-on: http://review.whamcloud.com/350
Tested-by: Hudson
Reviewed-by: Oleg Drokin <green@whamcloud.com>
extern int lprocfs_add_clear_entry(struct obd_device * obd,
cfs_proc_dir_entry_t *entry);
extern int lprocfs_exp_setup(struct obd_export *exp,
- lnet_nid_t *peer_nid, int reconnect, int *newnid);
+ lnet_nid_t *peer_nid, int *newnid);
extern int lprocfs_exp_cleanup(struct obd_export *exp);
extern cfs_proc_dir_entry_t *lprocfs_add_simple(struct proc_dir_entry *root,
char *name,
static inline int lprocfs_add_clear_entry(struct obd_export *exp)
{ return 0; }
static inline int lprocfs_exp_setup(struct obd_export *exp,lnet_nid_t *peer_nid,
- int reconnect, int *newnid)
+ int *newnid)
{ return 0; }
static inline int lprocfs_exp_cleanup(struct obd_export *exp)
{ return 0; }
int mdt_export_stats_init(struct obd_device *obd,
struct obd_export *exp,
- int reconnect,
void *localdata)
{
lnet_nid_t *client_nid = localdata;
int rc, newnid;
ENTRY;
- rc = lprocfs_exp_setup(exp, client_nid, reconnect, &newnid);
+ rc = lprocfs_exp_setup(exp, client_nid, &newnid);
if (rc) {
/* Mask error for already created
* /proc entries */
memcpy(lcd->lcd_uuid, cluuid, sizeof lcd->lcd_uuid);
rc = mdt_client_new(env, mdt);
if (rc == 0)
- mdt_export_stats_init(obd, lexp, 0, localdata);
+ mdt_export_stats_init(obd, lexp, localdata);
}
out:
rc = mdt_connect_internal(exp, mdt_dev(obd->obd_lu_dev), data);
if (rc == 0)
- mdt_export_stats_init(obd, exp, 1, localdata);
+ mdt_export_stats_init(obd, exp, localdata);
RETURN(rc);
}
if (cfs_test_bit(MDT_FL_CFGLOG, &m->mdt_state) &&
cfs_test_bit(MDT_FL_SYNCED, &m->mdt_state)) {
struct obd_device *obd = m->mdt_md_dev.md_lu_dev.ld_obd;
-
+
/* Open for clients */
if (obd->obd_no_conn) {
cfs_spin_lock(&obd->obd_dev_lock);
int mdt_export_stats_init(struct obd_device *obd,
struct obd_export *exp,
- int reconnect,
void *client_nid);
int mdt_pin(struct mdt_thread_info* info);
#include "mgs_internal.h"
int mgs_export_stats_init(struct obd_device *obd, struct obd_export *exp,
- int reconnect, void *localdata)
+ void *localdata)
{
lnet_nid_t *client_nid = localdata;
int rc, newnid;
ENTRY;
- rc = lprocfs_exp_setup(exp, client_nid, reconnect, &newnid);
+ rc = lprocfs_exp_setup(exp, client_nid, &newnid);
if (rc) {
/* Mask error for already created
* /proc entries */
data->ocd_version = LUSTRE_VERSION_CODE;
}
- rc = mgs_export_stats_init(obd, lexp, 0, localdata);
+ rc = mgs_export_stats_init(obd, lexp, localdata);
if (rc) {
class_disconnect(lexp);
data->ocd_version = LUSTRE_VERSION_CODE;
}
- RETURN(mgs_export_stats_init(obd, exp, 1, localdata));
+ RETURN(mgs_export_stats_init(obd, exp, localdata));
}
static int mgs_disconnect(struct obd_export *exp)
/* mgs_fs.c */
int mgs_export_stats_init(struct obd_device *obd, struct obd_export *exp,
- int reconnect, void *localdata);
+ void *localdata);
int mgs_client_free(struct obd_export *exp);
int mgs_fs_setup(struct obd_device *obd, struct vfsmount *mnt);
int mgs_fs_cleanup(struct obd_device *obddev);
client_stat->nid_brw_stats);
LASSERTF(cfs_atomic_read(&client_stat->nid_exp_ref_count) == 0,
- "count %d\n",
- cfs_atomic_read(&client_stat->nid_exp_ref_count));
+ "nid %s:count %d\n", libcfs_nid2str(client_stat->nid),
+ atomic_read(&client_stat->nid_exp_ref_count));
cfs_hlist_del_init(&client_stat->nid_hash);
}
EXPORT_SYMBOL(lprocfs_nid_stats_clear_write);
-int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int reconnect,
- int *newnid)
+int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid)
{
struct nid_stat *new_stat, *old_stat;
struct obd_device *obd = NULL;
old_stat, libcfs_nid2str(*nid),
cfs_atomic_read(&new_stat->nid_exp_ref_count));
+ /* We need to release old stats because lprocfs_exp_cleanup() hasn't
+ * been and will never be called. */
+ if (exp->exp_nid_stats) {
+ nidstat_putref(exp->exp_nid_stats);
+ exp->exp_nid_stats = NULL;
+ }
+
/* Return -EALREADY here so that we know that the /proc
* entry already has been created */
if (old_stat != new_stat) {
- /* if this connects to the existing export of same nid,
- * we need to release old stats for obd_disconnect won't
- * balance the reference gotten in "cfs_hash_findadd_uinque" */
- if (reconnect && exp->exp_nid_stats)
- nidstat_putref(old_stat);
-
exp->exp_nid_stats = old_stat;
GOTO(destroy_new, rc = -EALREADY);
}
plus the procfs overhead :( */
static int filter_export_stats_init(struct obd_device *obd,
struct obd_export *exp,
- int reconnect,
void *client_nid)
{
int rc, newnid = 0;
/* Self-export gets no proc entry */
RETURN(0);
- rc = lprocfs_exp_setup(exp, client_nid, reconnect, &newnid);
+ rc = lprocfs_exp_setup(exp, client_nid, &newnid);
if (rc) {
/* Mask error for already created
* /proc entries */
fed = &exp->exp_filter_data;
*fed->fed_ted.ted_lcd = *lcd;
fed->fed_group = 0; /* will be assigned at connect */
- filter_export_stats_init(obd, exp, 0, NULL);
+ filter_export_stats_init(obd, exp, NULL);
rc = filter_client_add(obd, exp, cl_idx);
/* can't fail for existing client */
LASSERTF(rc == 0, "rc = %d\n", rc);
rc = filter_connect_internal(exp, data, 1);
if (rc == 0)
- filter_export_stats_init(obd, exp, 1, localdata);
+ filter_export_stats_init(obd, exp, localdata);
RETURN(rc);
}
if (rc)
GOTO(cleanup, rc);
- filter_export_stats_init(obd, lexp, 0, localdata);
+ filter_export_stats_init(obd, lexp, localdata);
if (obd->obd_replayable) {
struct lsd_client_data *lcd = lexp->exp_target_data.ted_lcd;
LASSERT(lcd);