Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
LU-8066 sysfs: make ping sysfs file read and writable
[fs/lustre-release.git]
/
lustre
/
ptlrpc
/
lproc_ptlrpc.c
diff --git
a/lustre/ptlrpc/lproc_ptlrpc.c
b/lustre/ptlrpc/lproc_ptlrpc.c
index
1c3aab7
..
4e009e0
100644
(file)
--- a/
lustre/ptlrpc/lproc_ptlrpc.c
+++ b/
lustre/ptlrpc/lproc_ptlrpc.c
@@
-109,17
+109,17
@@
static struct ll_rpc_opcode {
{ MGS_TARGET_DEL, "mgs_target_del" },
{ MGS_SET_INFO, "mgs_set_info" },
{ MGS_CONFIG_READ, "mgs_config_read" },
-
{ OBD_PING,
"obd_ping" },
- {
OBD_LOG_CANCEL,
"llog_cancel" },
-
{ OBD_QC_CALLBACK,
"obd_quota_callback" },
- { OBD_IDX_READ, "dt_index_read" },
+
{ OBD_PING,
"obd_ping" },
+ {
401, /* was OBD_LOG_CANCEL */
"llog_cancel" },
+
{ 402, /* was OBD_QC_CALLBACK */
"obd_quota_callback" },
+ { OBD_IDX_READ,
"dt_index_read" },
{ LLOG_ORIGIN_HANDLE_CREATE, "llog_origin_handle_open" },
{ LLOG_ORIGIN_HANDLE_NEXT_BLOCK, "llog_origin_handle_next_block" },
{ LLOG_ORIGIN_HANDLE_READ_HEADER,"llog_origin_handle_read_header" },
- {
LLOG_ORIGIN_HANDLE_WRITE_REC,
"llog_origin_handle_write_rec" },
- {
LLOG_ORIGIN_HANDLE_CLOSE,
"llog_origin_handle_close" },
- {
LLOG_ORIGIN_CONNECT,
"llog_origin_connect" },
- {
LLOG_CATINFO,
"llog_catinfo" },
+ {
504, /*LLOG_ORIGIN_HANDLE_WRITE_REC*/
"llog_origin_handle_write_rec" },
+ {
505, /* was LLOG_ORIGIN_HANDLE_CLOSE */
"llog_origin_handle_close" },
+ {
506, /* was LLOG_ORIGIN_CONNECT */
"llog_origin_connect" },
+ {
507, /* was LLOG_CATINFO */
"llog_catinfo" },
{ LLOG_ORIGIN_HANDLE_PREV_BLOCK, "llog_origin_handle_prev_block" },
{ LLOG_ORIGIN_HANDLE_DESTROY, "llog_origin_handle_destroy" },
{ QUOTA_DQACQ, "quota_acquire" },
@@
-194,32
+194,33
@@
static const char *ll_eopcode2str(__u32 opcode)
return ll_eopcode_table[opcode].opname;
}
-#ifdef CONFIG_PROC_FS
-
static void ptlrpc_lprocfs_register(struct proc_dir_entry *root, char *dir
,
-
char *name, struct proc_dir_entry **proc
root_ret,
-
struct lprocfs_stats **stats_ret)
+static void
+
ptlrpc_ldebugfs_register(struct dentry *root, char *dir, char *name
,
+
struct dentry **debugfs_
root_ret,
+ struct lprocfs_stats **stats_ret)
{
-
struct proc_dir_entry *svc_procroot
;
+
struct dentry *svc_debugfs_entry
;
struct lprocfs_stats *svc_stats;
int i, rc;
unsigned int svc_counter_config = LPROCFS_CNTR_AVGMINMAX |
LPROCFS_CNTR_STDDEV;
-
LASSERT(*procroot_ret == NULL
);
-
LASSERT(*stats_ret == NULL
);
+
LASSERT(!*debugfs_root_ret
);
+
LASSERT(!*stats_ret
);
- svc_stats = lprocfs_alloc_stats(EXTRA_MAX_OPCODES+LUSTRE_MAX_OPCODES,0);
- if (svc_stats == NULL)
+ svc_stats = lprocfs_alloc_stats(EXTRA_MAX_OPCODES + LUSTRE_MAX_OPCODES,
+ 0);
+ if (!svc_stats)
return;
if (dir) {
- svc_
procroot = lproc
fs_register(dir, root, NULL, NULL);
-
if (IS_ERR(svc_procroot
)) {
+ svc_
debugfs_entry = ldebug
fs_register(dir, root, NULL, NULL);
+
if (IS_ERR(svc_debugfs_entry
)) {
lprocfs_free_stats(&svc_stats);
return;
}
} else {
-
svc_procroot
= root;
+
svc_debugfs_entry
= root;
}
lprocfs_counter_init(svc_stats, PTLRPC_REQWAIT_CNTR,
@@
-235,7
+236,7
@@
static void ptlrpc_lprocfs_register(struct proc_dir_entry *root, char *dir,
for (i = 0; i < EXTRA_LAST_OPC; i++) {
char *units;
-
switch
(i) {
+
switch
(i) {
case BRW_WRITE_BYTES:
case BRW_READ_BYTES:
units = "bytes";
@@
-255,14
+256,14
@@
static void ptlrpc_lprocfs_register(struct proc_dir_entry *root, char *dir,
ll_opcode2str(opcode), "usec");
}
-
rc = lprocfs_register_stats(svc_procroot
, name, svc_stats);
+
rc = ldebugfs_register_stats(svc_debugfs_entry
, name, svc_stats);
if (rc < 0) {
if (dir)
-
lprocfs_remove(&svc_procroot
);
+
ldebugfs_remove(&svc_debugfs_entry
);
lprocfs_free_stats(&svc_stats);
} else {
if (dir)
-
*procroot_ret = svc_procroot
;
+
*debugfs_root_ret = svc_debugfs_entry
;
*stats_ret = svc_stats;
}
}
@@
-281,7
+282,9
@@
ptlrpc_lprocfs_req_history_len_seq_show(struct seq_file *m, void *v)
seq_printf(m, "%d\n", total);
return 0;
}
-LPROC_SEQ_FOPS_RO(ptlrpc_lprocfs_req_history_len);
+
+
+LDEBUGFS_SEQ_FOPS_RO(ptlrpc_lprocfs_req_history_len);
static int
ptlrpc_lprocfs_req_history_max_seq_show(struct seq_file *m, void *n)
@@
-305,11
+308,11
@@
ptlrpc_lprocfs_req_history_max_seq_write(struct file *file,
{
struct seq_file *m = file->private_data;
struct ptlrpc_service *svc = m->private;
+ unsigned long long val;
int bufpages;
- __s64 val;
int rc;
- rc =
lprocfs_str_to_s64(buffer, count
, &val);
+ rc =
kstrtoull_from_user(buffer, count, 0
, &val);
if (rc < 0)
return rc;
@@
-324,8
+327,8
@@
ptlrpc_lprocfs_req_history_max_seq_write(struct file *file,
bufpages = (roundup_pow_of_two(svc->srv_buf_size) + PAGE_SIZE - 1) >>
PAGE_SHIFT;
/* do not allow history to consume more than half max number of rqbds */
- if ((svc->srv_nrqbds_max == 0 && val > totalram_pages
/
(2 * bufpages)) ||
-
val > svc->srv_nrqbds_max/2
)
+ if ((svc->srv_nrqbds_max == 0 && val > totalram_pages
/
(2 * bufpages)) ||
+
(svc->srv_nrqbds_max != 0 && val > svc->srv_nrqbds_max / 2)
)
return -ERANGE;
spin_lock(&svc->srv_lock);
@@
-340,7
+343,8
@@
ptlrpc_lprocfs_req_history_max_seq_write(struct file *file,
return count;
}
-LPROC_SEQ_FOPS(ptlrpc_lprocfs_req_history_max);
+
+LDEBUGFS_SEQ_FOPS(ptlrpc_lprocfs_req_history_max);
static int
ptlrpc_lprocfs_req_buffers_max_seq_show(struct seq_file *m, void *n)
@@
-358,17
+362,14
@@
ptlrpc_lprocfs_req_buffers_max_seq_write(struct file *file,
{
struct seq_file *m = file->private_data;
struct ptlrpc_service *svc = m->private;
-
__s64
val;
+
int
val;
int rc;
- rc =
lprocfs_str_to_s64(buffer, count
, &val);
+ rc =
kstrtoint_from_user(buffer, count, 0
, &val);
if (rc < 0)
return rc;
- if (val < 0 || val > INT_MAX)
- return -ERANGE;
-
- if (val < svc->srv_nbuf_per_group)
+ if (val < svc->srv_nbuf_per_group && val != 0)
return -ERANGE;
spin_lock(&svc->srv_lock);
@@
-379,7
+380,8
@@
ptlrpc_lprocfs_req_buffers_max_seq_write(struct file *file,
return count;
}
-LPROC_SEQ_FOPS(ptlrpc_lprocfs_req_buffers_max);
+
+LDEBUGFS_SEQ_FOPS(ptlrpc_lprocfs_req_buffers_max);
static ssize_t threads_min_show(struct kobject *kobj, struct attribute *attr,
char *buf)
@@
-787,7
+789,8
@@
out:
RETURN(rc < 0 ? rc : count);
}
-LPROC_SEQ_FOPS(ptlrpc_lprocfs_nrs);
+
+LDEBUGFS_SEQ_FOPS(ptlrpc_lprocfs_nrs);
/** @} nrs */
@@
-907,10
+910,12
@@
ptlrpc_lprocfs_svc_req_history_start(struct seq_file *s, loff_t *pos)
if (i > cpt) /* make up the lowest position for this CPT */
*pos = PTLRPC_REQ_CPT2POS(svc, i);
+ mutex_lock(&svcpt->scp_mutex);
spin_lock(&svcpt->scp_lock);
rc = ptlrpc_lprocfs_svc_req_history_seek(svcpt, srhi,
PTLRPC_REQ_POS2SEQ(svc, *pos));
spin_unlock(&svcpt->scp_lock);
+ mutex_unlock(&svcpt->scp_mutex);
if (rc == 0) {
*pos = PTLRPC_REQ_SEQ2POS(svc, srhi->srhi_seq);
srhi->srhi_idx = i;
@@
-952,9
+957,11
@@
ptlrpc_lprocfs_svc_req_history_next(struct seq_file *s,
seq = srhi->srhi_seq + (1 << svc->srv_cpt_bits);
}
+ mutex_lock(&svcpt->scp_mutex);
spin_lock(&svcpt->scp_lock);
rc = ptlrpc_lprocfs_svc_req_history_seek(svcpt, srhi, seq);
spin_unlock(&svcpt->scp_lock);
+ mutex_unlock(&svcpt->scp_mutex);
if (rc == 0) {
*pos = PTLRPC_REQ_SEQ2POS(svc, srhi->srhi_seq);
srhi->srhi_idx = i;
@@
-1008,6
+1015,7
@@
static int ptlrpc_lprocfs_svc_req_history_show(struct seq_file *s, void *iter)
svcpt = svc->srv_parts[srhi->srhi_idx];
+ mutex_lock(&svcpt->scp_mutex);
spin_lock(&svcpt->scp_lock);
rc = ptlrpc_lprocfs_svc_req_history_seek(svcpt, srhi, srhi->srhi_seq);
@@
-1048,6
+1056,8
@@
static int ptlrpc_lprocfs_svc_req_history_show(struct seq_file *s, void *iter)
}
spin_unlock(&svcpt->scp_lock);
+ mutex_unlock(&svcpt->scp_mutex);
+
return rc;
}
@@
-1072,7
+1082,7
@@
ptlrpc_lprocfs_svc_req_history_open(struct inode *inode, struct file *file)
return rc;
seqf = file->private_data;
- seqf->private =
PDE_DATA(inode)
;
+ seqf->private =
inode->i_private
;
return 0;
}
@@
-1106,7
+1116,8
@@
static int ptlrpc_lprocfs_timeouts_seq_show(struct seq_file *m, void *n)
return 0;
}
-LPROC_SEQ_FOPS_RO(ptlrpc_lprocfs_timeouts);
+
+LDEBUGFS_SEQ_FOPS_RO(ptlrpc_lprocfs_timeouts);
static ssize_t high_priority_ratio_show(struct kobject *kobj,
struct attribute *attr,
@@
-1180,8
+1191,8
@@
int ptlrpc_sysfs_register_service(struct kset *parent,
&parent->kobj, "%s", svc->srv_name);
}
-void ptlrpc_l
procfs_register_service(struct proc_dir_
entry *entry,
- struct ptlrpc_service *svc)
+void ptlrpc_l
debugfs_register_service(struct d
entry *entry,
+ struct ptlrpc_service *svc)
{
struct lprocfs_vars lproc_vars[] = {
{ .name = "req_buffer_history_len",
@@
-1211,25
+1222,24
@@
void ptlrpc_lprocfs_register_service(struct proc_dir_entry *entry,
int rc;
- ptlrpc_lprocfs_register(entry, svc->srv_name,
- "stats", &svc->srv_procroot,
- &svc->srv_stats);
- if (svc->srv_procroot == NULL)
+ ptlrpc_ldebugfs_register(entry, svc->srv_name, "stats",
+ &svc->srv_debugfs_entry, &svc->srv_stats);
+ if (IS_ERR_OR_NULL(svc->srv_debugfs_entry))
return;
- l
procfs_add_vars(svc->srv_procroot
, lproc_vars, NULL);
+ l
debugfs_add_vars(svc->srv_debugfs_entry
, lproc_vars, NULL);
- rc = l
procfs_seq_create(svc->srv_procroot
, "req_history",
- 0400, &req_history_fops, svc);
+ rc = l
debugfs_seq_create(svc->srv_debugfs_entry
, "req_history",
+
0400, &req_history_fops, svc);
if (rc)
CWARN("Error adding the req_history file\n");
}
void ptlrpc_lprocfs_register_obd(struct obd_device *obddev)
{
-
ptlrpc_lprocfs_register(obddev->obd_proc
_entry, NULL, "stats",
- &obddev->obd_svc_
procroot
,
- &obddev->obd_svc_stats);
+
ptlrpc_ldebugfs_register(obddev->obd_debugfs
_entry, NULL, "stats",
+ &obddev->obd_svc_
debugfs_entry
,
+ &obddev->obd_svc_stats);
}
EXPORT_SYMBOL(ptlrpc_lprocfs_register_obd);
@@
-1277,8
+1287,8
@@
EXPORT_SYMBOL(ptlrpc_lprocfs_brw);
void ptlrpc_lprocfs_unregister_service(struct ptlrpc_service *svc)
{
-
if (svc->srv_procroot != NULL
)
-
lprocfs_remove(&svc->srv_procroot
);
+
if (!IS_ERR_OR_NULL(svc->srv_debugfs_entry)
)
+
ldebugfs_remove(&svc->srv_debugfs_entry
);
if (svc->srv_stats)
lprocfs_free_stats(&svc->srv_stats);
@@
-1291,40
+1301,45
@@
void ptlrpc_lprocfs_unregister_obd(struct obd_device *obd)
*/
lprocfs_obd_cleanup(obd);
-
if (obd->obd_svc_procroot
)
-
lprocfs_remove(&obd->obd_svc_procroot
);
+
if (!IS_ERR_OR_NULL(obd->obd_svc_debugfs_entry)
)
+
ldebugfs_remove(&obd->obd_svc_debugfs_entry
);
if (obd->obd_svc_stats)
lprocfs_free_stats(&obd->obd_svc_stats);
}
EXPORT_SYMBOL(ptlrpc_lprocfs_unregister_obd);
-ssize_t
-lprocfs_ping_seq_write(struct file *file, const char __user *buffer,
- size_t count, loff_t *off)
+ssize_t ping_show(struct kobject *kobj, struct attribute *attr,
+ char *buffer)
{
- struct seq_file *m = file->private_data;
- struct obd_device *obd = m->private;
- struct ptlrpc_request *req;
- int rc;
- ENTRY;
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct ptlrpc_request *req;
+ int rc;
+ ENTRY;
LPROCFS_CLIMP_CHECK(obd);
req = ptlrpc_prep_ping(obd->u.cli.cl_import);
LPROCFS_CLIMP_EXIT(obd);
- if (
req == NULL
)
+ if (
!req
)
RETURN(-ENOMEM);
req->rq_send_state = LUSTRE_IMP_FULL;
rc = ptlrpc_queue_wait(req);
-
ptlrpc_req_finished(req);
- if (rc >= 0)
- RETURN(count);
+
RETURN(rc);
}
-EXPORT_SYMBOL(lprocfs_ping_seq_write);
+EXPORT_SYMBOL(ping_show);
+
+/* kept for older verison of tools. */
+ssize_t ping_store(struct kobject *kobj, struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ return ping_show(kobj, attr, (char *)buffer);
+}
+EXPORT_SYMBOL(ping_store);
/* Write the connection UUID to this file to attempt to connect to that node.
* The connection UUID is a node's primary NID. For example,
@@
-1363,14
+1378,14
@@
lprocfs_import_seq_write(struct file *file, const char __user *buffer,
uuid = kbuf + prefix_len;
ptr = strstr(uuid, "::");
if (ptr) {
-
__
u32 inst;
-
char *endptr
;
+ u32 inst;
+
int rc
;
*ptr = 0;
do_reconn = 0;
ptr += 2; /* Skip :: */
-
inst = simple_strtol(ptr, &endptr, 10
);
- if (
*endptr
) {
+
rc = kstrtouint(ptr, 10, &inst
);
+ if (
rc
) {
CERROR("config: wrong instance # %s\n", ptr);
} else if (inst != imp->imp_connect_data.ocd_instance) {
CDEBUG(D_INFO, "IR: %s is connecting to an obsoleted "
@@
-1414,16
+1429,13
@@
lprocfs_pinger_recov_seq_write(struct file *file, const char __user *buffer,
struct obd_device *obd = m->private;
struct client_obd *cli = &obd->u.cli;
struct obd_import *imp = cli->cl_import;
+ bool val;
int rc;
- __s64 val;
- rc =
lprocfs_str_to_s64
(buffer, count, &val);
+ rc =
kstrtobool_from_user
(buffer, count, &val);
if (rc < 0)
return rc;
- if (val != 0 && val != 1)
- return -ERANGE;
-
LPROCFS_CLIMP_CHECK(obd);
spin_lock(&imp->imp_lock);
imp->imp_no_pinger_recover = !val;
@@
-1432,5
+1444,3
@@
lprocfs_pinger_recov_seq_write(struct file *file, const char __user *buffer,
return count;
}
EXPORT_SYMBOL(lprocfs_pinger_recov_seq_write);
-
-#endif /* CONFIG_PROC_FS */