From 0e064a3d30547041eb67a4a936d35525e9b3bc33 Mon Sep 17 00:00:00 2001
From: ericm <ericm>
Date: Tue, 9 Dec 2008 05:31:15 +0000
Subject: [PATCH] branch: HEAD add debugging level for user space lgss_keyring.

---
 lustre/ptlrpc/gss/gss_cli_upcall.c |  2 +-
 lustre/ptlrpc/gss/lproc_gss.c      | 85 +++++++++++++++++++++---------
 lustre/utils/gss/lgss_keyring.c    | 25 +++++++++
 lustre/utils/gss/lgss_utils.h      |  2 +
 4 files changed, 89 insertions(+), 25 deletions(-)

diff --git a/lustre/ptlrpc/gss/gss_cli_upcall.c b/lustre/ptlrpc/gss/gss_cli_upcall.c
index f3df6d2bc0..bec0316f9c 100644
--- a/lustre/ptlrpc/gss/gss_cli_upcall.c
+++ b/lustre/ptlrpc/gss/gss_cli_upcall.c
@@ -298,7 +298,7 @@ int gss_do_ctx_init_rpc(__user char *buffer, unsigned long count)
 
         down_read(&obd->u.cli.cl_sem);
         if (obd->u.cli.cl_import == NULL) {
-                CERROR("import has gone\n");
+                CERROR("obd %s: import has gone\n", obd->obd_name);
                 RETURN(-EINVAL);
         }
         imp = class_import_get(obd->u.cli.cl_import);
diff --git a/lustre/ptlrpc/gss/lproc_gss.c b/lustre/ptlrpc/gss/lproc_gss.c
index 6398661ee9..489c870364 100644
--- a/lustre/ptlrpc/gss/lproc_gss.c
+++ b/lustre/ptlrpc/gss/lproc_gss.c
@@ -64,6 +64,7 @@
 #include "gss_api.h"
 
 static struct proc_dir_entry *gss_proc_root = NULL;
+static struct proc_dir_entry *gss_proc_lk = NULL;
 
 /*
  * statistic of "out-of-sequence-window"
@@ -146,45 +147,81 @@ static int gss_proc_write_secinit(struct file *file, const char *buffer,
 
 static struct lprocfs_vars gss_lprocfs_vars[] = {
         { "replays", gss_proc_read_oos, NULL },
-        { "init_channel", NULL, gss_proc_write_secinit, NULL },
+        { "init_channel", NULL, gss_proc_write_secinit, NULL, NULL, 0222 },
         { NULL }
 };
 
+/*
+ * for userspace helper lgss_keyring.
+ *
+ * debug_level: [0, 4], defined in utils/gss/lgss_utils.h
+ */
+static int gss_lk_debug_level = 1;
+
+static int gss_lk_proc_read_dl(char *page, char **start, off_t off,
+                               int count, int *eof, void *data)
+{
+        return snprintf(page, count, "%u\n", gss_lk_debug_level);
+}
+
+static int gss_lk_proc_write_dl(struct file *file, const char *buffer,
+                                unsigned long count, void *data)
+{
+        int     val, rc;
+
+        rc = lprocfs_write_helper(buffer, count, &val);
+        if (rc < 0)
+                return rc;
+
+        if (val < 0 || val > 4)
+                return -ERANGE;
+
+        gss_lk_debug_level = val;
+        return count;
+}
+
+static struct lprocfs_vars gss_lk_lprocfs_vars[] = {
+        { "debug_level", gss_lk_proc_read_dl, gss_lk_proc_write_dl, NULL },
+        { NULL }
+};
+
+void gss_exit_lproc(void)
+{
+        if (gss_proc_lk) {
+                lprocfs_remove(&gss_proc_lk);
+                gss_proc_lk = NULL;
+        }
+
+        if (gss_proc_root) {
+                lprocfs_remove(&gss_proc_root);
+                gss_proc_root = NULL;
+        }
+}
+
 int gss_init_lproc(void)
 {
-        struct proc_dir_entry  *ent;
-        int                     rc;
+        int     rc;
 
         spin_lock_init(&gss_stat_oos.oos_lock);
 
         gss_proc_root = lprocfs_register("gss", sptlrpc_proc_root,
                                          gss_lprocfs_vars, NULL);
-
         if (IS_ERR(gss_proc_root)) {
-                rc = PTR_ERR(gss_proc_root);
                 gss_proc_root = NULL;
-                CERROR("failed to initialize lproc entries: %d\n", rc);
-                return rc;
+                GOTO(err_out, rc = PTR_ERR(gss_proc_root));
         }
 
-        /* FIXME
-         * here we should hold proc_subdir_lock which is not exported
-         */
-        ent = gss_proc_root->subdir;
-        while (ent != NULL) {
-                if (strcmp(ent->name, "init_channel") == 0) {
-                        ent->mode |= 0222;
-                        break;
-                }
+        gss_proc_lk = lprocfs_register("lgss_keyring", gss_proc_root,
+                                       gss_lk_lprocfs_vars, NULL);
+        if (IS_ERR(gss_proc_lk)) {
+                gss_proc_lk = NULL;
+                GOTO(err_out, rc = PTR_ERR(gss_proc_root));
         }
-        
+
         return 0;
-}
 
-void gss_exit_lproc(void)
-{
-        if (gss_proc_root) {
-                lprocfs_remove(&gss_proc_root);
-                gss_proc_root = NULL;
-        }
+err_out:
+        CERROR("failed to initialize gss lproc entries: %d\n", rc);
+        gss_exit_lproc();
+        return rc;
 }
diff --git a/lustre/utils/gss/lgss_keyring.c b/lustre/utils/gss/lgss_keyring.c
index c77fea1049..c90c220426 100644
--- a/lustre/utils/gss/lgss_keyring.c
+++ b/lustre/utils/gss/lgss_keyring.c
@@ -595,6 +595,28 @@ static int parse_callout_info(const char *coinfo,
         return 0;
 }
 
+#define LOG_LEVEL_PATH  "/proc/fs/lustre/sptlrpc/gss/lgss_keyring/debug_level"
+
+static void set_log_level()
+{
+        FILE         *file;
+        unsigned int  level;
+
+        file = fopen(LOG_LEVEL_PATH, "r");
+        if (file == NULL)
+                return;
+
+        if (fscanf(file, "%u", &level) != 1)
+                goto out;
+
+        if (level >= LL_MAX)
+                goto out;
+
+        lgss_set_loglevel(level);
+out:
+        fclose(file);
+}
+
 /****************************************
  * main process                         *
  ****************************************/
@@ -609,6 +631,9 @@ int main(int argc, char *argv[])
         struct lgss_mech_type          *mech;
         struct lgss_cred               *cred;
 
+        set_log_level();
+
+        logmsg(LL_TRACE, "start parsing parameters\n");
         /*
          * parse & sanity check upcall parameters
          * expected to be called with:
diff --git a/lustre/utils/gss/lgss_utils.h b/lustre/utils/gss/lgss_utils.h
index bd2fa93c02..54d163f28d 100644
--- a/lustre/utils/gss/lgss_utils.h
+++ b/lustre/utils/gss/lgss_utils.h
@@ -96,6 +96,8 @@ typedef enum {
 
 extern loglevel_t g_log_level;
 
+void lgss_set_loglevel(loglevel_t level);
+
 void __logmsg(loglevel_t level, const char *func, const char *format, ...);
 void __logmsg_gss(loglevel_t level, const char *func, const gss_OID mech,
                   uint32_t major, uint32_t minor, const char *format, ...);
-- 
GitLab