diff mbox

[v2] ceph: add a client_options_all in debugfs to show all options

Message ID 1521547051-10195-1-git-send-email-dongsheng.yang@easystack.cn (mailing list archive)
State New, archived
Headers show

Commit Message

Dongsheng Yang March 20, 2018, 11:57 a.m. UTC
As the /sys/kernel/debug/ceph/XXX/client_options only print options
which is different with default values, user are not able to know
the default values of them.

So we need to show the all options for user, but we can't change
the client_options file for backward compatibility, then this patch
add a new file in debugfs client_options_all to show the all options
for user.

Signed-off-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
---
Chnages since v1:
  - update the ceph_print_client_options() in fs/ceph/super.c

 fs/ceph/super.c              |  2 +-
 include/linux/ceph/libceph.h |  3 ++-
 net/ceph/ceph_common.c       | 10 +++++-----
 net/ceph/debugfs.c           | 25 ++++++++++++++++++++++++-
 4 files changed, 32 insertions(+), 8 deletions(-)
diff mbox

Patch

diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index fb2bc9c..d752d58 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -496,7 +496,7 @@  static int ceph_show_options(struct seq_file *m, struct dentry *root)
 	seq_putc(m, ',');
 	pos = m->count;
 
-	ret = ceph_print_client_options(m, fsc->client);
+	ret = ceph_print_client_options(m, fsc->client, false);
 	if (ret)
 		return ret;
 
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h
index c2ec44c..678befa 100644
--- a/include/linux/ceph/libceph.h
+++ b/include/linux/ceph/libceph.h
@@ -133,6 +133,7 @@  struct ceph_client {
 	struct dentry *debugfs_monmap;
 	struct dentry *debugfs_osdmap;
 	struct dentry *debugfs_options;
+	struct dentry *debugfs_options_all;
 #endif
 };
 
@@ -274,7 +275,7 @@  extern struct ceph_options *ceph_parse_options(char *options,
 			      const char *dev_name, const char *dev_name_end,
 			      int (*parse_extra_token)(char *c, void *private),
 			      void *private);
-int ceph_print_client_options(struct seq_file *m, struct ceph_client *client);
+int ceph_print_client_options(struct seq_file *m, struct ceph_client *client, bool skip_default);
 extern void ceph_destroy_options(struct ceph_options *opt);
 extern int ceph_compare_options(struct ceph_options *new_opt,
 				struct ceph_client *client);
diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c
index 4d4c822..7f3f6d4 100644
--- a/net/ceph/ceph_common.c
+++ b/net/ceph/ceph_common.c
@@ -544,7 +544,7 @@  struct ceph_options *
 }
 EXPORT_SYMBOL(ceph_parse_options);
 
-int ceph_print_client_options(struct seq_file *m, struct ceph_client *client)
+int ceph_print_client_options(struct seq_file *m, struct ceph_client *client, bool skip_default)
 {
 	struct ceph_options *opt = client->options;
 	size_t pos = m->count;
@@ -570,16 +570,16 @@  int ceph_print_client_options(struct seq_file *m, struct ceph_client *client)
 	if ((opt->flags & CEPH_OPT_TCP_NODELAY) == 0)
 		seq_puts(m, "notcp_nodelay,");
 
-	if (opt->mount_timeout != CEPH_MOUNT_TIMEOUT_DEFAULT)
+	if (opt->mount_timeout != CEPH_MOUNT_TIMEOUT_DEFAULT || !skip_default)
 		seq_printf(m, "mount_timeout=%d,",
 			   jiffies_to_msecs(opt->mount_timeout) / 1000);
-	if (opt->osd_idle_ttl != CEPH_OSD_IDLE_TTL_DEFAULT)
+	if (opt->osd_idle_ttl != CEPH_OSD_IDLE_TTL_DEFAULT || !skip_default)
 		seq_printf(m, "osd_idle_ttl=%d,",
 			   jiffies_to_msecs(opt->osd_idle_ttl) / 1000);
-	if (opt->osd_keepalive_timeout != CEPH_OSD_KEEPALIVE_DEFAULT)
+	if (opt->osd_keepalive_timeout != CEPH_OSD_KEEPALIVE_DEFAULT || !skip_default)
 		seq_printf(m, "osdkeepalivetimeout=%d,",
 		    jiffies_to_msecs(opt->osd_keepalive_timeout) / 1000);
-	if (opt->osd_request_timeout != CEPH_OSD_REQUEST_TIMEOUT_DEFAULT)
+	if (opt->osd_request_timeout != CEPH_OSD_REQUEST_TIMEOUT_DEFAULT || !skip_default)
 		seq_printf(m, "osd_request_timeout=%d,",
 			   jiffies_to_msecs(opt->osd_request_timeout) / 1000);
 
diff --git a/net/ceph/debugfs.c b/net/ceph/debugfs.c
index 1eef680..09537f9 100644
--- a/net/ceph/debugfs.c
+++ b/net/ceph/debugfs.c
@@ -375,7 +375,20 @@  static int client_options_show(struct seq_file *s, void *p)
 	struct ceph_client *client = s->private;
 	int ret;
 
-	ret = ceph_print_client_options(s, client);
+	ret = ceph_print_client_options(s, client, true);
+	if (ret)
+		return ret;
+
+	seq_putc(s, '\n');
+	return 0;
+}
+
+static int client_options_all_show(struct seq_file *s, void *p)
+{
+	struct ceph_client *client = s->private;
+	int ret;
+
+	ret = ceph_print_client_options(s, client, false);
 	if (ret)
 		return ret;
 
@@ -388,6 +401,7 @@  static int client_options_show(struct seq_file *s, void *p)
 CEPH_DEFINE_SHOW_FUNC(monc_show)
 CEPH_DEFINE_SHOW_FUNC(osdc_show)
 CEPH_DEFINE_SHOW_FUNC(client_options_show)
+CEPH_DEFINE_SHOW_FUNC(client_options_all_show)
 
 int ceph_debugfs_init(void)
 {
@@ -457,6 +471,14 @@  int ceph_debugfs_client_init(struct ceph_client *client)
 	if (!client->debugfs_options)
 		goto out;
 
+	client->debugfs_options_all = debugfs_create_file("client_options_all",
+					0600,
+					client->debugfs_dir,
+					client,
+					&client_options_all_show_fops);
+	if (!client->debugfs_options_all)
+		goto out;
+
 	return 0;
 
 out:
@@ -467,6 +489,7 @@  int ceph_debugfs_client_init(struct ceph_client *client)
 void ceph_debugfs_client_cleanup(struct ceph_client *client)
 {
 	dout("ceph_debugfs_client_cleanup %p\n", client);
+	debugfs_remove(client->debugfs_options_all);
 	debugfs_remove(client->debugfs_options);
 	debugfs_remove(client->debugfs_osdmap);
 	debugfs_remove(client->debugfs_monmap);