Whamcloud - gitweb
LU-3319 procfs: move lov proc handling over to seq_file 92/7292/7
authorJames Simmons <uja.ornl@gmail.com>
Thu, 14 Nov 2013 14:36:41 +0000 (09:36 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 11 Dec 2013 13:58:18 +0000 (13:58 +0000)
In order to support 3.10+ kernels for clients we adapt
the lov proc handling to using seq_files.

Signed-off-by: James Simmons <uja.ornl@gmail.com>
Change-Id: Icd19a7c75301e1351d1d116afbc1aa4f7168c2eb
Reviewed-on: http://review.whamcloud.com/7292
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Bob Glossman <bob.glossman@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/lov/lov_internal.h
lustre/lov/lov_obd.c
lustre/lov/lov_pool.c
lustre/lov/lproc_lov.c

index d0424b7..161b029 100644 (file)
@@ -283,12 +283,7 @@ int lovea_destroy_object(struct lov_obd *lov, struct lov_stripe_md *lsm,
 /* lproc_lov.c */
 extern struct file_operations lov_proc_target_fops;
 #ifdef LPROCFS
 /* lproc_lov.c */
 extern struct file_operations lov_proc_target_fops;
 #ifdef LPROCFS
-void lprocfs_lov_init_vars(struct lprocfs_static_vars *lvars);
-#else
-static inline void lprocfs_lov_init_vars(struct lprocfs_static_vars *lvars)
-{
-        memset(lvars, 0, sizeof(*lvars));
-}
+extern struct lprocfs_seq_vars lprocfs_lov_obd_vars[];
 #endif
 
 /* lov_cl.c */
 #endif
 
 /* lov_cl.c */
index 5f25c6f..32e7094 100644 (file)
@@ -136,7 +136,7 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate,
         static struct obd_uuid lov_osc_uuid = { "LOV_OSC_UUID" };
         struct obd_import *imp;
 #ifdef __KERNEL__
         static struct obd_uuid lov_osc_uuid = { "LOV_OSC_UUID" };
         struct obd_import *imp;
 #ifdef __KERNEL__
-        cfs_proc_dir_entry_t *lov_proc_dir;
+       struct proc_dir_entry *lov_proc_dir;
 #endif
         int rc;
         ENTRY;
 #endif
         int rc;
         ENTRY;
@@ -198,10 +198,10 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate,
                obd_uuid2str(tgt_uuid), tgt_obd->obd_name, activate ? "":"in");
 
 #ifdef __KERNEL__
                obd_uuid2str(tgt_uuid), tgt_obd->obd_name, activate ? "":"in");
 
 #ifdef __KERNEL__
-        lov_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds");
+       lov_proc_dir = obd->obd_proc_private;
         if (lov_proc_dir) {
                 struct obd_device *osc_obd = lov->lov_tgts[index]->ltd_exp->exp_obd;
         if (lov_proc_dir) {
                 struct obd_device *osc_obd = lov->lov_tgts[index]->ltd_exp->exp_obd;
-                cfs_proc_dir_entry_t *osc_symlink;
+               struct proc_dir_entry *osc_symlink;
 
                 LASSERT(osc_obd != NULL);
                 LASSERT(osc_obd->obd_magic == OBD_DEVICE_MAGIC);
 
                 LASSERT(osc_obd != NULL);
                 LASSERT(osc_obd->obd_magic == OBD_DEVICE_MAGIC);
@@ -218,6 +218,7 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate,
                                 obd->obd_type->typ_name, obd->obd_name,
                                 osc_obd->obd_name);
                         lprocfs_remove(&lov_proc_dir);
                                 obd->obd_type->typ_name, obd->obd_name,
                                 osc_obd->obd_name);
                         lprocfs_remove(&lov_proc_dir);
+                       obd->obd_proc_private = NULL;
                 }
         }
 #endif
                 }
         }
 #endif
@@ -282,7 +283,7 @@ static int lov_connect(const struct lu_env *env,
 
 static int lov_disconnect_obd(struct obd_device *obd, struct lov_tgt_desc *tgt)
 {
 
 static int lov_disconnect_obd(struct obd_device *obd, struct lov_tgt_desc *tgt)
 {
-        cfs_proc_dir_entry_t *lov_proc_dir;
+       struct proc_dir_entry *lov_proc_dir;
         struct lov_obd *lov = &obd->u.lov;
         struct obd_device *osc_obd;
         int rc;
         struct lov_obd *lov = &obd->u.lov;
         struct obd_device *osc_obd;
         int rc;
@@ -298,19 +299,9 @@ static int lov_disconnect_obd(struct obd_device *obd, struct lov_tgt_desc *tgt)
                 tgt->ltd_exp->exp_obd->obd_inactive = 1;
         }
 
                 tgt->ltd_exp->exp_obd->obd_inactive = 1;
         }
 
-        lov_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds");
-        if (lov_proc_dir) {
-                cfs_proc_dir_entry_t *osc_symlink;
-
-                osc_symlink = lprocfs_srch(lov_proc_dir, osc_obd->obd_name);
-                if (osc_symlink) {
-                        lprocfs_remove(&osc_symlink);
-                } else {
-                        CERROR("/proc/fs/lustre/%s/%s/target_obds/%s missing.",
-                               obd->obd_type->typ_name, obd->obd_name,
-                               osc_obd->obd_name);
-                }
-        }
+       lov_proc_dir = obd->obd_proc_private;
+       if (lov_proc_dir)
+               lprocfs_remove_proc_entry(osc_obd->obd_name, lov_proc_dir);
 
         if (osc_obd) {
                 /* Pass it on to our clients.
 
         if (osc_obd) {
                 /* Pass it on to our clients.
@@ -793,11 +784,10 @@ void lov_fix_desc(struct lov_desc *desc)
 
 int lov_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
 {
 
 int lov_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
 {
-        struct lprocfs_static_vars lvars = { 0 };
-        struct lov_desc *desc;
-        struct lov_obd *lov = &obd->u.lov;
-        int rc;
-        ENTRY;
+       struct lov_desc *desc;
+       struct lov_obd *lov = &obd->u.lov;
+       int rc;
+       ENTRY;
 
         if (LUSTRE_CFG_BUFLEN(lcfg, 1) < 1) {
                 CERROR("LOV setup requires a descriptor\n");
 
         if (LUSTRE_CFG_BUFLEN(lcfg, 1) < 1) {
                 CERROR("LOV setup requires a descriptor\n");
@@ -849,26 +839,22 @@ int lov_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
         if (rc)
                GOTO(out, rc);
 
         if (rc)
                GOTO(out, rc);
 
-        lprocfs_lov_init_vars(&lvars);
-        lprocfs_obd_setup(obd, lvars.obd_vars);
 #ifdef LPROCFS
 #ifdef LPROCFS
-        {
-                int rc;
-
-                rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd",
-                                        0444, &lov_proc_target_fops, obd);
-                if (rc)
-                        CWARN("Error adding the target_obd file\n");
-        }
+       obd->obd_vars = lprocfs_lov_obd_vars;
+       lprocfs_seq_obd_setup(obd);
+       rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd", 0444,
+                               &lov_proc_target_fops, obd);
+       if (rc)
+               CWARN("Error adding the target_obd file\n");
+
+       lov->lov_pool_proc_entry = lprocfs_seq_register("pools",
+                                                       obd->obd_proc_entry,
+                                                       NULL, NULL);
 #endif
 #endif
-        lov->lov_pool_proc_entry = lprocfs_register("pools",
-                                                    obd->obd_proc_entry,
-                                                    NULL, NULL);
-
-        RETURN(0);
+       RETURN(0);
 
 out:
 
 out:
-        return rc;
+       return rc;
 }
 
 static int lov_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage)
 }
 
 static int lov_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage)
@@ -980,18 +966,15 @@ int lov_process_config_base(struct obd_device *obd, struct lustre_cfg *lcfg,
                 GOTO(out, rc);
         }
         case LCFG_PARAM: {
                 GOTO(out, rc);
         }
         case LCFG_PARAM: {
-                struct lprocfs_static_vars lvars = { 0 };
-                struct lov_desc *desc = &(obd->u.lov.desc);
-
-                if (!desc)
-                        GOTO(out, rc = -EINVAL);
+               struct lov_desc *desc = &(obd->u.lov.desc);
 
 
-                lprocfs_lov_init_vars(&lvars);
+               if (!desc)
+                       GOTO(out, rc = -EINVAL);
 
 
-                rc = class_process_proc_param(PARAM_LOV, lvars.obd_vars,
-                                              lcfg, obd);
-                if (rc > 0)
-                        rc = 0;
+               rc = class_process_proc_seq_param(PARAM_LOV, obd->obd_vars,
+                                                 lcfg, obd);
+               if (rc > 0)
+                       rc = 0;
                 GOTO(out, rc);
         }
         case LCFG_POOL_NEW:
                 GOTO(out, rc);
         }
         case LCFG_POOL_NEW:
@@ -2907,7 +2890,6 @@ extern struct lu_kmem_descr lov_caches[];
 
 int __init lov_init(void)
 {
 
 int __init lov_init(void)
 {
-        struct lprocfs_static_vars lvars = { 0 };
        int rc;
         ENTRY;
 
        int rc;
         ENTRY;
 
@@ -2927,11 +2909,10 @@ int __init lov_init(void)
                 lu_kmem_fini(lov_caches);
                 return -ENOMEM;
         }
                 lu_kmem_fini(lov_caches);
                 return -ENOMEM;
         }
-        lprocfs_lov_init_vars(&lvars);
 
        rc = class_register_type(&lov_obd_ops, NULL, NULL,
 #ifndef HAVE_ONLY_PROCFS_SEQ
 
        rc = class_register_type(&lov_obd_ops, NULL, NULL,
 #ifndef HAVE_ONLY_PROCFS_SEQ
-                               lvars.module_vars,
+                               NULL,
 #endif
                                LUSTRE_LOV_NAME, &lov_device_type);
 
 #endif
                                LUSTRE_LOV_NAME, &lov_device_type);
 
index 2c6f1e8..32639f0 100644 (file)
@@ -288,7 +288,7 @@ static int pool_proc_open(struct inode *inode, struct file *file)
         rc = seq_open(file, &pool_proc_ops);
         if (!rc) {
                 struct seq_file *s = file->private_data;
         rc = seq_open(file, &pool_proc_ops);
         if (!rc) {
                 struct seq_file *s = file->private_data;
-                s->private = PROC_I(inode)->pde->data;
+               s->private = PDE_DATA(inode);
         }
         return rc;
 }
         }
         return rc;
 }
@@ -472,9 +472,12 @@ int lov_pool_new(struct obd_device *obd, char *poolname)
         /* get ref for /proc file */
         lov_pool_getref(new_pool);
         new_pool->pool_proc_entry = lprocfs_add_simple(lov->lov_pool_proc_entry,
         /* get ref for /proc file */
         lov_pool_getref(new_pool);
         new_pool->pool_proc_entry = lprocfs_add_simple(lov->lov_pool_proc_entry,
-                                                       poolname, NULL, NULL,
-                                                       new_pool,
-                                                       &pool_proc_operations);
+                                                       poolname,
+#ifndef HAVE_ONLY_PROCFS_SEQ
+                                                       NULL, NULL,
+#endif
+                                                       new_pool,
+                                                       &pool_proc_operations);
         if (IS_ERR(new_pool->pool_proc_entry)) {
                 CWARN("Cannot add proc pool entry "LOV_POOLNAMEF"\n", poolname);
                 new_pool->pool_proc_entry = NULL;
         if (IS_ERR(new_pool->pool_proc_entry)) {
                 CWARN("Cannot add proc pool entry "LOV_POOLNAMEF"\n", poolname);
                 new_pool->pool_proc_entry = NULL;
index 850bb39..e400faf 100644 (file)
 #include <asm/statfs.h>
 #include <lprocfs_status.h>
 #include <obd_class.h>
 #include <asm/statfs.h>
 #include <lprocfs_status.h>
 #include <obd_class.h>
-#include <linux/seq_file.h>
+#include <lustre_param.h>
 #include "lov_internal.h"
 
 #ifdef LPROCFS
 #include "lov_internal.h"
 
 #ifdef LPROCFS
-static int lov_rd_stripesize(char *page, char **start, off_t off, int count,
-                             int *eof, void *data)
+static int lov_stripesize_seq_show(struct seq_file *m, void *v)
 {
 {
-        struct obd_device *dev = (struct obd_device *)data;
-        struct lov_desc *desc;
+       struct obd_device *dev = (struct obd_device *)m->private;
+       struct lov_desc *desc;
 
 
-        LASSERT(dev != NULL);
-        desc = &dev->u.lov.desc;
-        *eof = 1;
-        return snprintf(page, count, LPU64"\n", desc->ld_default_stripe_size);
+       LASSERT(dev != NULL);
+       desc = &dev->u.lov.desc;
+
+       return seq_printf(m, LPU64"\n", desc->ld_default_stripe_size);
 }
 
 }
 
-static int lov_wr_stripesize(struct file *file, const char *buffer,
-                               unsigned long count, void *data)
+static ssize_t lov_stripesize_seq_write(struct file *file, const char *buffer,
+                                       size_t count, loff_t *off)
 {
 {
-        struct obd_device *dev = (struct obd_device *)data;
+       struct obd_device *dev = ((struct seq_file *)file->private_data)->private;
         struct lov_desc *desc;
         __u64 val;
         int rc;
         struct lov_desc *desc;
         __u64 val;
         int rc;
-        
+
         LASSERT(dev != NULL);
         desc = &dev->u.lov.desc;
         rc = lprocfs_write_u64_helper(buffer, count, &val);
         LASSERT(dev != NULL);
         desc = &dev->u.lov.desc;
         rc = lprocfs_write_u64_helper(buffer, count, &val);
@@ -73,27 +72,26 @@ static int lov_wr_stripesize(struct file *file, const char *buffer,
         desc->ld_default_stripe_size = val;
         return count;
 }
         desc->ld_default_stripe_size = val;
         return count;
 }
+LPROC_SEQ_FOPS(lov_stripesize);
 
 
-static int lov_rd_stripeoffset(char *page, char **start, off_t off, int count,
-                               int *eof, void *data)
+static int lov_stripeoffset_seq_show(struct seq_file *m, void *v)
 {
 {
-        struct obd_device *dev = (struct obd_device *)data;
-        struct lov_desc *desc;
+       struct obd_device *dev = (struct obd_device *)m->private;
+       struct lov_desc *desc;
 
 
-        LASSERT(dev != NULL);
-        desc = &dev->u.lov.desc;
-        *eof = 1;
-        return snprintf(page, count, LPU64"\n", desc->ld_default_stripe_offset);
+       LASSERT(dev != NULL);
+       desc = &dev->u.lov.desc;
+       return seq_printf(m, LPU64"\n", desc->ld_default_stripe_offset);
 }
 
 }
 
-static int lov_wr_stripeoffset(struct file *file, const char *buffer,
-                               unsigned long count, void *data)
+static ssize_t lov_stripeoffset_seq_write(struct file *file, const char *buffer,
+                                         size_t count, loff_t *off)
 {
 {
-        struct obd_device *dev = (struct obd_device *)data;
+       struct obd_device *dev = ((struct seq_file *)file->private_data)->private;
         struct lov_desc *desc;
         __u64 val;
         int rc;
         struct lov_desc *desc;
         __u64 val;
         int rc;
-        
+
         LASSERT(dev != NULL);
         desc = &dev->u.lov.desc;
         rc = lprocfs_write_u64_helper(buffer, count, &val);
         LASSERT(dev != NULL);
         desc = &dev->u.lov.desc;
         rc = lprocfs_write_u64_helper(buffer, count, &val);
@@ -103,26 +101,25 @@ static int lov_wr_stripeoffset(struct file *file, const char *buffer,
         desc->ld_default_stripe_offset = val;
         return count;
 }
         desc->ld_default_stripe_offset = val;
         return count;
 }
+LPROC_SEQ_FOPS(lov_stripeoffset);
 
 
-static int lov_rd_stripetype(char *page, char **start, off_t off, int count,
-                             int *eof, void *data)
+static int lov_stripetype_seq_show(struct seq_file *m, void *v)
 {
 {
-        struct obd_device* dev = (struct obd_device*)data;
-        struct lov_desc *desc;
+       struct obd_device* dev = (struct obd_device*)m->private;
+       struct lov_desc *desc;
 
 
-        LASSERT(dev != NULL);
-        desc = &dev->u.lov.desc;
-        *eof = 1;
-        return snprintf(page, count, "%u\n", desc->ld_pattern);
+       LASSERT(dev != NULL);
+       desc = &dev->u.lov.desc;
+       return seq_printf(m, "%u\n", desc->ld_pattern);
 }
 
 }
 
-static int lov_wr_stripetype(struct file *file, const char *buffer,
-                             unsigned long count, void *data)
+static ssize_t lov_stripetype_seq_write(struct file *file, const char *buffer,
+                                       size_t count, loff_t *off)
 {
 {
-        struct obd_device *dev = (struct obd_device *)data;
+       struct obd_device *dev = ((struct seq_file *)file->private_data)->private;
         struct lov_desc *desc;
         int val, rc;
         struct lov_desc *desc;
         int val, rc;
-        
+
         LASSERT(dev != NULL);
         desc = &dev->u.lov.desc;
         rc = lprocfs_write_helper(buffer, count, &val);
         LASSERT(dev != NULL);
         desc = &dev->u.lov.desc;
         rc = lprocfs_write_helper(buffer, count, &val);
@@ -133,27 +130,26 @@ static int lov_wr_stripetype(struct file *file, const char *buffer,
         desc->ld_pattern = val;
         return count;
 }
         desc->ld_pattern = val;
         return count;
 }
+LPROC_SEQ_FOPS(lov_stripetype);
 
 
-static int lov_rd_stripecount(char *page, char **start, off_t off, int count,
-                              int *eof, void *data)
+static int lov_stripecount_seq_show(struct seq_file *m, void *v)
 {
 {
-        struct obd_device *dev = (struct obd_device *)data;
-        struct lov_desc *desc;
+       struct obd_device *dev = (struct obd_device *)m->private;
+       struct lov_desc *desc;
 
 
-        LASSERT(dev != NULL);
-        desc = &dev->u.lov.desc;
-        *eof = 1;
-        return snprintf(page, count, "%d\n",
-                        (__s16)(desc->ld_default_stripe_count + 1) - 1);
+       LASSERT(dev != NULL);
+       desc = &dev->u.lov.desc;
+       return seq_printf(m, "%d\n",
+                         (__s16)(desc->ld_default_stripe_count + 1) - 1);
 }
 
 }
 
-static int lov_wr_stripecount(struct file *file, const char *buffer,
-                              unsigned long count, void *data)
+static ssize_t lov_stripecount_seq_write(struct file *file, const char *buffer,
+                                        size_t count, loff_t *off)
 {
 {
-        struct obd_device *dev = (struct obd_device *)data;
+       struct obd_device *dev = ((struct seq_file *)file->private_data)->private;
         struct lov_desc *desc;
         int val, rc;
         struct lov_desc *desc;
         int val, rc;
-        
+
         LASSERT(dev != NULL);
         desc = &dev->u.lov.desc;
         rc = lprocfs_write_helper(buffer, count, &val);
         LASSERT(dev != NULL);
         desc = &dev->u.lov.desc;
         rc = lprocfs_write_helper(buffer, count, &val);
@@ -164,43 +160,40 @@ static int lov_wr_stripecount(struct file *file, const char *buffer,
         desc->ld_default_stripe_count = val;
         return count;
 }
         desc->ld_default_stripe_count = val;
         return count;
 }
+LPROC_SEQ_FOPS(lov_stripecount);
 
 
-static int lov_rd_numobd(char *page, char **start, off_t off, int count,
-                         int *eof, void *data)
+static int lov_numobd_seq_show(struct seq_file *m, void *v)
 {
 {
-        struct obd_device *dev = (struct obd_device*)data;
-        struct lov_desc *desc;
-
-        LASSERT(dev != NULL);
-        desc = &dev->u.lov.desc;
-        *eof = 1;
-        return snprintf(page, count, "%u\n", desc->ld_tgt_count);
+       struct obd_device *dev = (struct obd_device*)m->private;
+       struct lov_desc *desc;
 
 
+       LASSERT(dev != NULL);
+       desc = &dev->u.lov.desc;
+       return seq_printf(m, "%u\n", desc->ld_tgt_count);
 }
 }
+LPROC_SEQ_FOPS_RO(lov_numobd);
 
 
-static int lov_rd_activeobd(char *page, char **start, off_t off, int count,
-                            int *eof, void *data)
+static int lov_activeobd_seq_show(struct seq_file *m, void *v)
 {
 {
-        struct obd_device* dev = (struct obd_device*)data;
-        struct lov_desc *desc;
+       struct obd_device* dev = (struct obd_device*)m->private;
+       struct lov_desc *desc;
 
 
-        LASSERT(dev != NULL);
-        desc = &dev->u.lov.desc;
-        *eof = 1;
-        return snprintf(page, count, "%u\n", desc->ld_active_tgt_count);
+       LASSERT(dev != NULL);
+       desc = &dev->u.lov.desc;
+       return seq_printf(m, "%u\n", desc->ld_active_tgt_count);
 }
 }
+LPROC_SEQ_FOPS_RO(lov_activeobd);
 
 
-static int lov_rd_desc_uuid(char *page, char **start, off_t off, int count,
-                            int *eof, void *data)
+static int lov_desc_uuid_seq_show(struct seq_file *m, void *v)
 {
 {
-        struct obd_device *dev = (struct obd_device*) data;
-        struct lov_obd *lov;
+       struct obd_device *dev = m->private;
+       struct lov_obd *lov;
 
 
-        LASSERT(dev != NULL);
-        lov = &dev->u.lov;
-        *eof = 1;
-        return snprintf(page, count, "%s\n", lov->desc.ld_uuid.uuid);
+       LASSERT(dev != NULL);
+       lov = &dev->u.lov;
+       return seq_printf(m, "%s\n", lov->desc.ld_uuid.uuid);
 }
 }
+LPROC_SEQ_FOPS_RO(lov_desc_uuid);
 
 static void *lov_tgt_seq_start(struct seq_file *p, loff_t *pos)
 {
 
 static void *lov_tgt_seq_start(struct seq_file *p, loff_t *pos)
 {
@@ -248,50 +241,45 @@ struct seq_operations lov_tgt_sops = {
 
 static int lov_target_seq_open(struct inode *inode, struct file *file)
 {
 
 static int lov_target_seq_open(struct inode *inode, struct file *file)
 {
-        struct proc_dir_entry *dp = PDE(inode);
-        struct seq_file *seq;
-        int rc;
+       struct seq_file *seq;
+       int rc;
 
 
-       LPROCFS_ENTRY_CHECK(dp);
-        rc = seq_open(file, &lov_tgt_sops);
+       LPROCFS_ENTRY_CHECK(PDE(inode));
+       rc = seq_open(file, &lov_tgt_sops);
        if (rc)
        if (rc)
-                return rc;
+               return rc;
 
 
-        seq = file->private_data;
-        seq->private = dp->data;
-        return 0;
+       seq = file->private_data;
+       seq->private = PDE_DATA(inode);
+       return 0;
 }
 
 }
 
-struct lprocfs_vars lprocfs_lov_obd_vars[] = {
-        { "uuid",         lprocfs_rd_uuid,        0, 0 },
-        { "stripesize",   lov_rd_stripesize,      lov_wr_stripesize, 0 },
-        { "stripeoffset", lov_rd_stripeoffset,    lov_wr_stripeoffset, 0 },
-        { "stripecount",  lov_rd_stripecount,     lov_wr_stripecount, 0 },
-        { "stripetype",   lov_rd_stripetype,      lov_wr_stripetype, 0 },
-        { "numobd",       lov_rd_numobd,          0, 0 },
-        { "activeobd",    lov_rd_activeobd,       0, 0 },
-        { "filestotal",   lprocfs_rd_filestotal,  0, 0 },
-        { "filesfree",    lprocfs_rd_filesfree,   0, 0 },
-        /*{ "filegroups", lprocfs_rd_filegroups,  0, 0 },*/
-        { "blocksize",    lprocfs_rd_blksize,     0, 0 },
-        { "kbytestotal",  lprocfs_rd_kbytestotal, 0, 0 },
-        { "kbytesfree",   lprocfs_rd_kbytesfree,  0, 0 },
-        { "kbytesavail",  lprocfs_rd_kbytesavail, 0, 0 },
-        { "desc_uuid",    lov_rd_desc_uuid,       0, 0 },
-        { 0 }
-};
-
-static struct lprocfs_vars lprocfs_lov_module_vars[] = {
-        { "num_refs",     lprocfs_rd_numrefs,     0, 0 },
-        { 0 }
+LPROC_SEQ_FOPS_RO_TYPE(lov, uuid);
+LPROC_SEQ_FOPS_RO_TYPE(lov, filestotal);
+LPROC_SEQ_FOPS_RO_TYPE(lov, filesfree);
+LPROC_SEQ_FOPS_RO_TYPE(lov, blksize);
+LPROC_SEQ_FOPS_RO_TYPE(lov, kbytestotal);
+LPROC_SEQ_FOPS_RO_TYPE(lov, kbytesfree);
+LPROC_SEQ_FOPS_RO_TYPE(lov, kbytesavail);
+
+struct lprocfs_seq_vars lprocfs_lov_obd_vars[] = {
+       { "uuid",               &lov_uuid_fops          },
+       { "stripesize",         &lov_stripesize_fops    },
+       { "stripeoffset",       &lov_stripeoffset_fops  },
+       { "stripecount",        &lov_stripecount_fops   },
+       { "stripetype",         &lov_stripetype_fops    },
+       { "numobd",             &lov_numobd_fops        },
+       { "activeobd",          &lov_activeobd_fops     },
+       { "filestotal",         &lov_filestotal_fops    },
+       { "filesfree",          &lov_filesfree_fops     },
+       { "blocksize",          &lov_blksize_fops       },
+       { "kbytestotal",        &lov_kbytestotal_fops   },
+       { "kbytesfree",         &lov_kbytesfree_fops    },
+       { "kbytesavail",        &lov_kbytesavail_fops   },
+       { "desc_uuid",          &lov_desc_uuid_fops     },
+       { 0 }
 };
 
 };
 
-void lprocfs_lov_init_vars(struct lprocfs_static_vars *lvars)
-{
-    lvars->module_vars  = lprocfs_lov_module_vars;
-    lvars->obd_vars     = lprocfs_lov_obd_vars;
-}
-
 struct file_operations lov_proc_target_fops = {
         .owner   = THIS_MODULE,
         .open    = lov_target_seq_open,
 struct file_operations lov_proc_target_fops = {
         .owner   = THIS_MODULE,
         .open    = lov_target_seq_open,