X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Flprocfs_status_server.c;h=8584b1baefac7d5b28c75816750a9664b6b388ee;hb=6fd75f264c5f5c186bbfe559e1a98fb3769d8128;hp=27f950eaf2f5c9fd6c933c3f640b62d308e66d27;hpb=98161628da9ba5268f8adb15d239fad18aeb8647;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/lprocfs_status_server.c b/lustre/obdclass/lprocfs_status_server.c index 27f950e..8584b1b 100644 --- a/lustre/obdclass/lprocfs_status_server.c +++ b/lustre/obdclass/lprocfs_status_server.c @@ -27,7 +27,6 @@ */ /* * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. * * lustre/obdclass/lprocfs_status_server.c */ @@ -124,7 +123,8 @@ lprocfs_evict_client_seq_write(struct file *file, const char __user *buffer, count = -EFAULT; goto out; } - tmpbuf = cfs_firststr(kbuf, min_t(unsigned long, BUFLEN - 1, count)); + tmpbuf = skip_spaces(kbuf); + tmpbuf = strsep(&tmpbuf, " \t\n\f\v\r"); class_incref(obd, __func__, current); if (strncmp(tmpbuf, "nid:", 4) == 0) @@ -168,11 +168,9 @@ static int obd_export_flags2str(struct obd_export *exp, struct seq_file *m) } static int -lprocfs_exp_print_export_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, - struct hlist_node *hnode, void *cb_data) +lprocfs_exp_print_export_seq(struct obd_export *exp, void *cb_data) { struct seq_file *m = cb_data; - struct obd_export *exp = cfs_hash_object(hs, hnode); struct obd_device *obd; struct obd_connect_data *ocd; @@ -197,6 +195,19 @@ lprocfs_exp_print_export_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, obd_export_flags2str(exp, m); seq_printf(m, " ]\n"); + if (obd->obd_type && + strcmp(obd->obd_type->typ_name, "obdfilter") == 0) { + struct filter_export_data *fed = &exp->exp_filter_data; + + seq_printf(m, " grant:\n"); + seq_printf(m, " granted: %ld\n", + fed->fed_ted.ted_grant); + seq_printf(m, " dirty: %ld\n", + fed->fed_ted.ted_dirty); + seq_printf(m, " pending: %ld\n", + fed->fed_ted.ted_pending); + } + out: return 0; } @@ -227,11 +238,9 @@ out: static int lprocfs_exp_export_seq_show(struct seq_file *m, void *data) { struct nid_stat *stats = m->private; - struct obd_device *obd = stats->nid_obd; - cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid, - lprocfs_exp_print_export_seq, m); - return 0; + return obd_nid_export_for_each(stats->nid_obd, stats->nid, + lprocfs_exp_print_export_seq, m); } LPROC_SEQ_FOPS_RO(lprocfs_exp_export); @@ -276,50 +285,42 @@ void lprocfs_free_per_client_stats(struct obd_device *obd) EXPORT_SYMBOL(lprocfs_free_per_client_stats); static int -lprocfs_exp_print_uuid_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, - struct hlist_node *hnode, void *cb_data) +lprocfs_exp_print_nodemap_seq(struct obd_export *exp, void *cb_data) { + struct lu_nodemap *nodemap = exp->exp_target_data.ted_nodemap; struct seq_file *m = cb_data; - struct obd_export *exp = cfs_hash_object(hs, hnode); - if (exp->exp_nid_stats != NULL) - seq_printf(m, "%s\n", obd_uuid2str(&exp->exp_client_uuid)); + if (nodemap) + seq_printf(m, "%s\n", nodemap->nm_name); return 0; } static int -lprocfs_exp_print_nodemap_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, - struct hlist_node *hnode, void *cb_data) +lprocfs_exp_nodemap_seq_show(struct seq_file *m, void *data) { - struct seq_file *m = cb_data; - struct obd_export *exp = cfs_hash_object(hs, hnode); - struct lu_nodemap *nodemap = exp->exp_target_data.ted_nodemap; + struct nid_stat *stats = m->private; - if (nodemap != NULL) - seq_printf(m, "%s\n", nodemap->nm_name); - return 0; + return obd_nid_export_for_each(stats->nid_obd, stats->nid, + lprocfs_exp_print_nodemap_seq, m); } +LPROC_SEQ_FOPS_RO(lprocfs_exp_nodemap); static int -lprocfs_exp_nodemap_seq_show(struct seq_file *m, void *data) +lprocfs_exp_print_uuid_seq(struct obd_export *exp, void *cb_data) { - struct nid_stat *stats = m->private; - struct obd_device *obd = stats->nid_obd; + struct seq_file *m = cb_data; - cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid, - lprocfs_exp_print_nodemap_seq, m); + if (exp->exp_nid_stats) + seq_printf(m, "%s\n", obd_uuid2str(&exp->exp_client_uuid)); return 0; } -LPROC_SEQ_FOPS_RO(lprocfs_exp_nodemap); static int lprocfs_exp_uuid_seq_show(struct seq_file *m, void *data) { struct nid_stat *stats = m->private; - struct obd_device *obd = stats->nid_obd; - cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid, - lprocfs_exp_print_uuid_seq, m); - return 0; + return obd_nid_export_for_each(stats->nid_obd, stats->nid, + lprocfs_exp_print_uuid_seq, m); } LPROC_SEQ_FOPS_RO(lprocfs_exp_uuid); @@ -362,16 +363,16 @@ static void ldebugfs_rhash_seq_show(const char *name, struct rhashtable *ht, } static int -lprocfs_exp_print_hash_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, - struct hlist_node *hnode, void *cb_data) +lprocfs_exp_print_hash_seq(struct obd_export *exp, void *cb_data) { + struct obd_device *obd = exp->exp_obd; struct seq_file *m = cb_data; - struct obd_export *exp = cfs_hash_object(hs, hnode); if (exp->exp_lock_hash != NULL) { - cfs_hash_debug_header(m); - cfs_hash_debug_str(hs, m); + seq_printf(m, "%-*s cur min max theta t-min t-max flags rehash count distribution\n", + HASH_NAME_LEN, "name"); + ldebugfs_rhash_seq_show("NID_HASH", &obd->obd_nid_hash.ht, m); } return 0; } @@ -379,19 +380,15 @@ lprocfs_exp_print_hash_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, static int lprocfs_exp_hash_seq_show(struct seq_file *m, void *data) { struct nid_stat *stats = m->private; - struct obd_device *obd = stats->nid_obd; - cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid, - lprocfs_exp_print_hash_seq, m); - return 0; + return obd_nid_export_for_each(stats->nid_obd, stats->nid, + lprocfs_exp_print_hash_seq, m); } LPROC_SEQ_FOPS_RO(lprocfs_exp_hash); -int lprocfs_exp_print_replydata_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, - struct hlist_node *hnode, void *cb_data) +int lprocfs_exp_print_replydata_seq(struct obd_export *exp, void *cb_data) { - struct obd_export *exp = cfs_hash_object(hs, hnode); struct seq_file *m = cb_data; struct tg_export_data *ted = &exp->exp_target_data; @@ -409,19 +406,14 @@ int lprocfs_exp_print_replydata_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, int lprocfs_exp_replydata_seq_show(struct seq_file *m, void *data) { struct nid_stat *stats = m->private; - struct obd_device *obd = stats->nid_obd; - cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid, - lprocfs_exp_print_replydata_seq, m); - return 0; + return obd_nid_export_for_each(stats->nid_obd, stats->nid, + lprocfs_exp_print_replydata_seq, m); } LPROC_SEQ_FOPS_RO(lprocfs_exp_replydata); -int lprocfs_exp_print_fmd_count_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, - struct hlist_node *hnode, void *cb_data) - +int lprocfs_exp_print_fmd_count_seq(struct obd_export *exp, void *cb_data) { - struct obd_export *exp = cfs_hash_object(hs, hnode); struct seq_file *m = cb_data; struct tg_export_data *ted = &exp->exp_target_data; @@ -433,11 +425,9 @@ int lprocfs_exp_print_fmd_count_seq(struct cfs_hash *hs, struct cfs_hash_bd *bd, int lprocfs_exp_fmd_count_seq_show(struct seq_file *m, void *data) { struct nid_stat *stats = m->private; - struct obd_device *obd = stats->nid_obd; - cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid, - lprocfs_exp_print_fmd_count_seq, m); - return 0; + return obd_nid_export_for_each(stats->nid_obd, stats->nid, + lprocfs_exp_print_fmd_count_seq, m); } LPROC_SEQ_FOPS_RO(lprocfs_exp_fmd_count); @@ -691,9 +681,9 @@ int lprocfs_hash_seq_show(struct seq_file *m, void *data) seq_printf(m, "%-*s cur min max theta t-min t-max flags rehash count maxdep distribution\n", HASH_NAME_LEN, "name"); ldebugfs_rhash_seq_show("UUID_HASH", &obd->obd_uuid_hash, m); + ldebugfs_rhash_seq_show("NID_HASH", &obd->obd_nid_hash.ht, m); cfs_hash_debug_header(m); - cfs_hash_debug_str(obd->obd_nid_hash, m); cfs_hash_debug_str(obd->obd_nid_stats_hash, m); return 0; } @@ -712,15 +702,19 @@ int lprocfs_recovery_status_seq_show(struct seq_file *m, void *data) goto out; } - /* sampled unlocked, but really... */ - if (obd->obd_recovering == 0) { + /* There is gap between client data read from storage and setting + * obd_recovering so check obd_recovery_end as well to make sure + * recovery is really finished + */ + if (obd->obd_recovery_end > 0 && !obd->obd_recovering) { seq_printf(m, "COMPLETE\n"); seq_printf(m, "recovery_start: %lld\n", - (s64)obd->obd_recovery_start); + (s64)ktime_get_real_seconds() - + (ktime_get_seconds() - obd->obd_recovery_start)); seq_printf(m, "recovery_duration: %lld\n", obd->obd_recovery_end ? obd->obd_recovery_end - obd->obd_recovery_start : - ktime_get_real_seconds() - obd->obd_recovery_start); + ktime_get_seconds() - obd->obd_recovery_start); /* Number of clients that have completed recovery */ seq_printf(m, "completed_clients: %d/%d\n", atomic_read(&obd->obd_max_recoverable_clients) - @@ -751,9 +745,11 @@ int lprocfs_recovery_status_seq_show(struct seq_file *m, void *data) seq_printf(m, "non-ready MDTs: %s\n", buf ? buf : "unknown (not enough RAM)"); seq_printf(m, "recovery_start: %lld\n", - (s64)obd->obd_recovery_start); + (s64)ktime_get_real_seconds() - + (ktime_get_seconds() - + obd->obd_recovery_start)); seq_printf(m, "time_waited: %lld\n", - (s64)(ktime_get_real_seconds() - + (s64)(ktime_get_seconds() - obd->obd_recovery_start)); } @@ -771,14 +767,15 @@ int lprocfs_recovery_status_seq_show(struct seq_file *m, void *data) } seq_printf(m, "RECOVERING\n"); - seq_printf(m, "recovery_start: %lld\n", (s64)obd->obd_recovery_start); + seq_printf(m, "recovery_start: %lld\n", (s64)ktime_get_real_seconds() - + (ktime_get_seconds() - obd->obd_recovery_start)); seq_printf(m, "time_remaining: %lld\n", - ktime_get_real_seconds() >= + ktime_get_seconds() >= obd->obd_recovery_start + obd->obd_recovery_timeout ? 0 : (s64)(obd->obd_recovery_start + obd->obd_recovery_timeout - - ktime_get_real_seconds())); + ktime_get_seconds())); seq_printf(m, "connected_clients: %d/%d\n", atomic_read(&obd->obd_connected_clients), atomic_read(&obd->obd_max_recoverable_clients)); @@ -866,7 +863,7 @@ ssize_t recovery_time_soft_show(struct kobject *kobj, struct attribute *attr, struct obd_device *obd = container_of(kobj, struct obd_device, obd_kset.kobj); - return scnprintf(buf, PAGE_SIZE, "%ld\n", obd->obd_recovery_timeout); + return scnprintf(buf, PAGE_SIZE, "%d\n", obd->obd_recovery_timeout); } EXPORT_SYMBOL(recovery_time_soft_show); @@ -894,7 +891,7 @@ ssize_t recovery_time_hard_show(struct kobject *kobj, struct attribute *attr, struct obd_device *obd = container_of(kobj, struct obd_device, obd_kset.kobj); - return scnprintf(buf, PAGE_SIZE, "%ld\n", obd->obd_recovery_time_hard); + return scnprintf(buf, PAGE_SIZE, "%d\n", obd->obd_recovery_time_hard); } EXPORT_SYMBOL(recovery_time_hard_show);