Whamcloud - gitweb
LU-7486 obdclass: health_check to report unhealthy upon LBUG
[fs/lustre-release.git] / lustre / obdclass / linux / linux-module.c
index 8b114d2..37cbd24 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2012, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -73,7 +73,6 @@
 #include <lprocfs_status.h>
 #include <lustre_ioctl.h>
 #include <lustre_ver.h>
-#include <lustre/lustre_build_version.h>
 
 int proc_version;
 
@@ -159,7 +158,6 @@ int obd_ioctl_popdata(void __user *arg, void *data, int len)
        err = copy_to_user(arg, data, len) ? -EFAULT : 0;
        RETURN(err);
 }
-EXPORT_SYMBOL(obd_ioctl_popdata);
 
 /*  opening /dev/obd */
 static int obd_class_open(struct inode * inode, struct file * file)
@@ -213,24 +211,24 @@ struct miscdevice obd_psdev = {
 };
 
 
-#ifdef LPROCFS
+#ifdef CONFIG_PROC_FS
 static int obd_proc_version_seq_show(struct seq_file *m, void *v)
 {
-       return seq_printf(m, "lustre: %s\nkernel: %s\nbuild:  %s\n",
-                         LUSTRE_VERSION_STRING, "patchless_client",
-                         BUILD_VERSION);
+       seq_printf(m, "lustre: %s", LUSTRE_VERSION_STRING);
+       return 0;
 }
 LPROC_SEQ_FOPS_RO(obd_proc_version);
 
 static int obd_proc_pinger_seq_show(struct seq_file *m, void *v)
 {
-       return seq_printf(m, "%s\n",
+       seq_printf(m, "%s\n",
 #ifdef ENABLE_PINGER
-                            "on"
+                  "on"
 #else
-                            "off"
+                  "off"
 #endif
-                        );
+                );
+       return 0;
 }
 LPROC_SEQ_FOPS_RO(obd_proc_pinger);
 
@@ -247,8 +245,10 @@ static int obd_proc_health_seq_show(struct seq_file *m, void *data)
        bool healthy = true;
        int i;
 
-       if (libcfs_catastrophe)
+       if (libcfs_catastrophe) {
                seq_printf(m, "LBUG\n");
+               healthy = false;
+       }
 
        read_lock(&obd_dev_lock);
        for (i = 0; i < class_devno_max(); i++) {
@@ -267,7 +267,7 @@ static int obd_proc_health_seq_show(struct seq_file *m, void *data)
 
                if (obd_health_check(NULL, obd)) {
                        seq_printf(m, "device %s reported unhealthy\n",
-                                       obd->obd_name);
+                                  obd->obd_name);
                        healthy = false;
                }
                class_decref(obd, __FUNCTION__, current);
@@ -276,16 +276,18 @@ static int obd_proc_health_seq_show(struct seq_file *m, void *data)
        read_unlock(&obd_dev_lock);
 
        if (healthy)
-               return seq_printf(m, "healthy\n");
-
-       seq_printf(m, "NOT HEALTHY\n");
+               seq_puts(m, "healthy\n");
+       else
+               seq_puts(m, "NOT HEALTHY\n");
        return 0;
 }
 LPROC_SEQ_FOPS_RO(obd_proc_health);
 
 static int obd_proc_jobid_var_seq_show(struct seq_file *m, void *v)
 {
-       return seq_printf(m, "%s\n", obd_jobid_var);
+       if (strlen(obd_jobid_var) != 0)
+               seq_printf(m, "%s\n", obd_jobid_var);
+       return 0;
 }
 
 static ssize_t
@@ -309,11 +311,43 @@ obd_proc_jobid_var_seq_write(struct file *file, const char __user *buffer,
 }
 LPROC_SEQ_FOPS(obd_proc_jobid_var);
 
+static int obd_proc_jobid_name_seq_show(struct seq_file *m, void *v)
+{
+       if (strlen(obd_jobid_node) != 0)
+               seq_printf(m, "%s\n", obd_jobid_node);
+       return 0;
+}
+
+static ssize_t obd_proc_jobid_name_seq_write(struct file *file,
+                                            const char __user *buffer,
+                                            size_t count, loff_t *off)
+{
+       if (count == 0 || count > LUSTRE_JOBID_SIZE)
+               return -EINVAL;
+
+       /* clear previous value */
+       memset(obd_jobid_node, 0, LUSTRE_JOBID_SIZE);
+
+       if (copy_from_user(obd_jobid_node, buffer, count))
+               return -EFAULT;
+
+       /* Trim the trailing '\n' if any */
+       if (obd_jobid_node[count - 1] == '\n') {
+               /* Don't echo just a newline */
+               if (count == 1)
+                       return -EINVAL;
+               obd_jobid_node[count - 1] = 0;
+       }
+
+       return count;
+}
+LPROC_SEQ_FOPS(obd_proc_jobid_name);
+
 /* Root for /proc/fs/lustre */
 struct proc_dir_entry *proc_lustre_root = NULL;
 EXPORT_SYMBOL(proc_lustre_root);
 
-struct lprocfs_seq_vars lprocfs_base[] = {
+static struct lprocfs_vars lprocfs_base[] = {
        { .name =       "version",
          .fops =       &obd_proc_version_fops  },
        { .name =       "pinger",
@@ -322,11 +356,13 @@ struct lprocfs_seq_vars lprocfs_base[] = {
          .fops =       &obd_proc_health_fops   },
        { .name =       "jobid_var",
          .fops =       &obd_proc_jobid_var_fops},
-       { 0 }
+       { .name =       "jobid_name",
+         .fops =       &obd_proc_jobid_name_fops},
+       { NULL }
 };
 #else
 #define lprocfs_base NULL
-#endif /* LPROCFS */
+#endif /* CONFIG_PROC_FS */
 
 static void *obd_device_list_seq_start(struct seq_file *p, loff_t *pos)
 {
@@ -370,13 +406,14 @@ static int obd_device_list_seq_show(struct seq_file *p, void *v)
         else
                 status = "--";
 
-        return seq_printf(p, "%3d %s %s %s %s %d\n",
-                          (int)index, status, obd->obd_type->typ_name,
-                          obd->obd_name, obd->obd_uuid.uuid,
-                         atomic_read(&obd->obd_refcount));
+       seq_printf(p, "%3d %s %s %s %s %d\n",
+                  (int)index, status, obd->obd_type->typ_name,
+                  obd->obd_name, obd->obd_uuid.uuid,
+                  atomic_read(&obd->obd_refcount));
+       return 0;
 }
 
-struct seq_operations obd_device_list_sops = {
+static const struct seq_operations obd_device_list_sops = {
         .start = obd_device_list_seq_start,
         .stop = obd_device_list_seq_stop,
         .next = obd_device_list_seq_next,
@@ -396,7 +433,7 @@ static int obd_device_list_open(struct inode *inode, struct file *file)
        return 0;
 }
 
-struct file_operations obd_device_list_fops = {
+static const struct file_operations obd_device_list_fops = {
         .owner   = THIS_MODULE,
         .open    = obd_device_list_open,
         .read    = seq_read,
@@ -412,7 +449,7 @@ int class_procfs_init(void)
 
        obd_sysctl_init();
 
-       entry = lprocfs_seq_register("fs/lustre", NULL, lprocfs_base, NULL);
+       entry = lprocfs_register("fs/lustre", NULL, lprocfs_base, NULL);
        if (IS_ERR(entry)) {
                rc = PTR_ERR(entry);
                CERROR("cannot create '/proc/fs/lustre': rc = %d\n", rc);