Whamcloud - gitweb
branch: HEAD
authorericm <ericm>
Tue, 9 Dec 2008 05:31:15 +0000 (05:31 +0000)
committerericm <ericm>
Tue, 9 Dec 2008 05:31:15 +0000 (05:31 +0000)
add debugging level for user space lgss_keyring.

lustre/ptlrpc/gss/gss_cli_upcall.c
lustre/ptlrpc/gss/lproc_gss.c
lustre/utils/gss/lgss_keyring.c
lustre/utils/gss/lgss_utils.h

index f3df6d2..bec0316 100644 (file)
@@ -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);
index 6398661..489c870 100644 (file)
@@ -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;
 }
index c77fea1..c90c220 100644 (file)
@@ -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:
index bd2fa93..54d163f 100644 (file)
@@ -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, ...);