diff options
Diffstat (limited to 'sys-cluster/lustre/files/0010-LU-3319-procfs-update-ldiskfs-proc-handling-to-seq_f.patch')
-rw-r--r-- | sys-cluster/lustre/files/0010-LU-3319-procfs-update-ldiskfs-proc-handling-to-seq_f.patch | 808 |
1 files changed, 808 insertions, 0 deletions
diff --git a/sys-cluster/lustre/files/0010-LU-3319-procfs-update-ldiskfs-proc-handling-to-seq_f.patch b/sys-cluster/lustre/files/0010-LU-3319-procfs-update-ldiskfs-proc-handling-to-seq_f.patch new file mode 100644 index 000000000..acfa04f0f --- /dev/null +++ b/sys-cluster/lustre/files/0010-LU-3319-procfs-update-ldiskfs-proc-handling-to-seq_f.patch @@ -0,0 +1,808 @@ +From 5a0b800373ce5e05f6ac64686e6381f7d2706044 Mon Sep 17 00:00:00 2001 +From: James Simmons <uja.ornl@gmail.com> +Date: Fri, 31 Jan 2014 10:38:14 -0500 +Subject: [PATCH 10/13] LU-3319 procfs: update ldiskfs proc handling to + seq_files + +Migrate all ldiskfs proc handling to using strictly +seq_files. + +Signed-off-by: James Simmons <uja.ornl@gmail.com> +Change-Id: Ia296a4682e2feda02bcfbe0100de8a89404cd731 +--- + lustre/osd-ldiskfs/osd_compat.c | 6 +- + lustre/osd-ldiskfs/osd_handler.c | 16 +- + lustre/osd-ldiskfs/osd_internal.h | 6 +- + lustre/osd-ldiskfs/osd_lproc.c | 338 ++++++++++++++++++++------------------ + lustre/osd-ldiskfs/osd_scrub.c | 73 +++----- + 5 files changed, 222 insertions(+), 217 deletions(-) + +diff --git a/lustre/osd-ldiskfs/osd_compat.c b/lustre/osd-ldiskfs/osd_compat.c +index b4a018c..6ca1304 100644 +--- a/lustre/osd-ldiskfs/osd_compat.c ++++ b/lustre/osd-ldiskfs/osd_compat.c +@@ -1168,7 +1168,7 @@ int osd_obj_spec_update(struct osd_thread_info *info, struct osd_device *osd, + handle_t *th) + { + struct dentry *root; +- char *name; ++ char *name = NULL; + int rc; + ENTRY; + +@@ -1189,7 +1189,7 @@ int osd_obj_spec_insert(struct osd_thread_info *info, struct osd_device *osd, + handle_t *th) + { + struct dentry *root; +- char *name; ++ char *name = NULL; + int rc; + ENTRY; + +@@ -1211,7 +1211,7 @@ int osd_obj_spec_lookup(struct osd_thread_info *info, struct osd_device *osd, + struct dentry *root; + struct dentry *dentry; + struct inode *inode; +- char *name; ++ char *name = NULL; + int rc = -ENOENT; + ENTRY; + +diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c +index 9027533..dfaa542 100644 +--- a/lustre/osd-ldiskfs/osd_handler.c ++++ b/lustre/osd-ldiskfs/osd_handler.c +@@ -5814,6 +5814,7 @@ static struct lu_device *osd_device_free(const struct lu_env *env, + static int osd_process_config(const struct lu_env *env, + struct lu_device *d, struct lustre_cfg *cfg) + { ++ struct obd_device *obd = d->ld_obd; + struct osd_device *o = osd_dev(d); + int rc; + ENTRY; +@@ -5828,12 +5829,12 @@ static int osd_process_config(const struct lu_env *env, + break; + case LCFG_PARAM: + LASSERT(&o->od_dt_dev); +- rc = class_process_proc_param(PARAM_OSD, lprocfs_osd_obd_vars, +- cfg, &o->od_dt_dev); ++ rc = class_process_proc_seq_param(PARAM_OSD, obd->obd_vars, ++ cfg, &o->od_dt_dev); + if (rc > 0 || rc == -ENOSYS) +- rc = class_process_proc_param(PARAM_OST, +- lprocfs_osd_obd_vars, +- cfg, &o->od_dt_dev); ++ rc = class_process_proc_seq_param(PARAM_OST, ++ obd->obd_vars, cfg, ++ &o->od_dt_dev); + break; + default: + rc = -ENOSYS; +@@ -5981,9 +5982,10 @@ static int __init osd_mod_init(void) + if (rc) + return rc; + +- rc = class_register_type(&osd_obd_device_ops, NULL, NULL, +-#ifndef HAVE_ONLY_PROCFS_SEQ ++ rc = class_register_type(&osd_obd_device_ops, NULL, + lprocfs_osd_module_vars, ++#ifndef HAVE_ONLY_PROCFS_SEQ ++ NULL, + #endif + LUSTRE_OSD_LDISKFS_NAME, &osd_device_type); + if (rc) +diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h +index 8436d1f..c90147f 100644 +--- a/lustre/osd-ldiskfs/osd_internal.h ++++ b/lustre/osd-ldiskfs/osd_internal.h +@@ -623,8 +623,8 @@ static inline int __osd_xattr_set(struct osd_thread_info *info, + + #ifdef LPROCFS + /* osd_lproc.c */ +-extern struct lprocfs_vars lprocfs_osd_obd_vars[]; +-extern struct lprocfs_vars lprocfs_osd_module_vars[]; ++extern struct lprocfs_seq_vars lprocfs_osd_obd_vars[]; ++extern struct lprocfs_seq_vars lprocfs_osd_module_vars[]; + int osd_procfs_init(struct osd_device *osd, const char *name); + int osd_procfs_fini(struct osd_device *osd); + void osd_brw_stats_update(struct osd_device *osd, struct osd_iobuf *iobuf); +@@ -679,7 +679,7 @@ int osd_oii_insert(struct osd_device *dev, struct osd_idmap_cache *oic, + int insert); + int osd_oii_lookup(struct osd_device *dev, const struct lu_fid *fid, + struct osd_inode_id *id); +-int osd_scrub_dump(struct osd_device *dev, char *buf, int len); ++int osd_scrub_dump(struct seq_file *m, struct osd_device *dev); + + int osd_fld_lookup(const struct lu_env *env, struct osd_device *osd, + obd_seq seq, struct lu_seq_range *range); +diff --git a/lustre/osd-ldiskfs/osd_lproc.c b/lustre/osd-ldiskfs/osd_lproc.c +index b9b4e3d..67f3423 100644 +--- a/lustre/osd-ldiskfs/osd_lproc.c ++++ b/lustre/osd-ldiskfs/osd_lproc.c +@@ -237,92 +237,46 @@ out: + RETURN(result); + } + +-int osd_procfs_init(struct osd_device *osd, const char *name) +-{ +- struct obd_type *type; +- int rc; +- ENTRY; +- +- /* at the moment there is no linkage between lu_type +- * and obd_type, so we lookup obd_type this way */ +- type = class_search_type(LUSTRE_OSD_LDISKFS_NAME); +- +- LASSERT(name != NULL); +- LASSERT(type != NULL); +- +- /* Find the type procroot and add the proc entry for this device */ +- osd->od_proc_entry = lprocfs_register(name, type->typ_procroot, +- lprocfs_osd_obd_vars, +- &osd->od_dt_dev); +- if (IS_ERR(osd->od_proc_entry)) { +- rc = PTR_ERR(osd->od_proc_entry); +- CERROR("Error %d setting up lprocfs for %s\n", +- rc, name); +- osd->od_proc_entry = NULL; +- GOTO(out, rc); +- } +- +- rc = osd_stats_init(osd); +- +- EXIT; +-out: +- if (rc) +- osd_procfs_fini(osd); +- return rc; +-} +- +-int osd_procfs_fini(struct osd_device *osd) +-{ +- if (osd->od_stats) +- lprocfs_free_stats(&osd->od_stats); +- +- if (osd->od_proc_entry) { +- lprocfs_remove(&osd->od_proc_entry); +- osd->od_proc_entry = NULL; +- } +- RETURN(0); +-} +- +-static int lprocfs_osd_rd_fstype(char *page, char **start, off_t off, int count, +- int *eof, void *data) ++static int ldiskfs_osd_fstype_seq_show(struct seq_file *m, void *data) + { +- struct osd_device *osd = osd_dt_dev(data); ++ struct osd_device *osd = osd_dt_dev((struct dt_device *)m->private); + +- LASSERT(osd != NULL); +- return snprintf(page, count, "ldiskfs\n"); ++ LASSERT(osd != NULL); ++ return seq_printf(m, "ldiskfs\n"); + } ++LPROC_SEQ_FOPS_RO(ldiskfs_osd_fstype); + +-static int lprocfs_osd_rd_mntdev(char *page, char **start, off_t off, int count, +- int *eof, void *data) ++static int ldiskfs_osd_mntdev_seq_show(struct seq_file *m, void *data) + { +- struct osd_device *osd = osd_dt_dev(data); ++ struct osd_device *osd = osd_dt_dev((struct dt_device *)m->private); + +- LASSERT(osd != NULL); ++ LASSERT(osd != NULL); + if (unlikely(osd->od_mnt == NULL)) +- return -EINPROGRESS; +- +- *eof = 1; ++ return -EINPROGRESS; + +- return snprintf(page, count, "%s\n", osd->od_mntdev); ++ return seq_printf(m, "%u\n", osd->od_read_cache); + } ++LPROC_SEQ_FOPS_RO(ldiskfs_osd_mntdev); + +-static int lprocfs_osd_rd_cache(char *page, char **start, off_t off, +- int count, int *eof, void *data) ++static int ldiskfs_osd_cache_seq_show(struct seq_file *m, void *data) + { +- struct osd_device *osd = osd_dt_dev(data); ++ struct osd_device *osd = osd_dt_dev((struct dt_device *)m->private); + + LASSERT(osd != NULL); + if (unlikely(osd->od_mnt == NULL)) + return -EINPROGRESS; + +- return snprintf(page, count, "%u\n", osd->od_read_cache); ++ return seq_printf(m, "%u\n", osd->od_read_cache); + } + +-static int lprocfs_osd_wr_cache(struct file *file, const char *buffer, +- unsigned long count, void *data) ++static ssize_t ++ldiskfs_osd_cache_seq_write(struct file *file, const char *buffer, ++ size_t count, loff_t *off) + { +- struct osd_device *osd = osd_dt_dev(data); +- int val, rc; ++ struct seq_file *m = file->private_data; ++ struct dt_device *dt = m->private; ++ struct osd_device *osd = osd_dt_dev(dt); ++ int val, rc; + + LASSERT(osd != NULL); + if (unlikely(osd->od_mnt == NULL)) +@@ -335,24 +289,26 @@ static int lprocfs_osd_wr_cache(struct file *file, const char *buffer, + osd->od_read_cache = !!val; + return count; + } ++LPROC_SEQ_FOPS(ldiskfs_osd_cache); + +-static int lprocfs_osd_rd_wcache(char *page, char **start, off_t off, +- int count, int *eof, void *data) ++static int ldiskfs_osd_wcache_seq_show(struct seq_file *m, void *data) + { +- struct osd_device *osd = osd_dt_dev(data); ++ struct osd_device *osd = osd_dt_dev((struct dt_device *)m->private); + + LASSERT(osd != NULL); + if (unlikely(osd->od_mnt == NULL)) + return -EINPROGRESS; + +- return snprintf(page, count, "%u\n", osd->od_writethrough_cache); ++ return seq_printf(m, "%u\n", osd->od_writethrough_cache); + } + +-static int lprocfs_osd_wr_wcache(struct file *file, const char *buffer, +- unsigned long count, void *data) ++static ssize_t ++ldiskfs_osd_wcache_seq_write(struct file *file, const char *buffer, ++ size_t count, loff_t *off) + { +- struct osd_device *osd = osd_dt_dev(data); +- int val, rc; ++ struct dt_device *dt = ((struct seq_file *)file->private_data)->private; ++ struct osd_device *osd = osd_dt_dev(dt); ++ int val, rc; + + LASSERT(osd != NULL); + if (unlikely(osd->od_mnt == NULL)) +@@ -365,14 +321,16 @@ static int lprocfs_osd_wr_wcache(struct file *file, const char *buffer, + osd->od_writethrough_cache = !!val; + return count; + } ++LPROC_SEQ_FOPS(ldiskfs_osd_wcache); + +-static int lprocfs_osd_wr_force_sync(struct file *file, const char *buffer, +- unsigned long count, void *data) ++static ssize_t ++lprocfs_osd_force_sync_seq_write(struct file *file, const char *buffer, ++ size_t count, loff_t *off) + { +- struct osd_device *osd = osd_dt_dev(data); +- struct dt_device *dt = data; +- struct lu_env env; +- int rc; ++ struct dt_device *dt = ((struct seq_file *)file->private_data)->private; ++ struct osd_device *osd = osd_dt_dev(dt); ++ struct lu_env env; ++ int rc; + + LASSERT(osd != NULL); + if (unlikely(osd->od_mnt == NULL)) +@@ -386,20 +344,18 @@ static int lprocfs_osd_wr_force_sync(struct file *file, const char *buffer, + + return rc == 0 ? count : rc; + } ++LPROC_SEQ_FOPS_WO_TYPE(ldiskfs, osd_force_sync); + +-static int lprocfs_osd_rd_pdo(char *page, char **start, off_t off, int count, +- int *eof, void *data) ++static int ldiskfs_osd_pdo_seq_show(struct seq_file *m, void *data) + { +- *eof = 1; +- +- return snprintf(page, count, "%s\n", ldiskfs_pdo ? "ON" : "OFF"); ++ return seq_printf(m, "%s\n", ldiskfs_pdo ? "ON" : "OFF"); + } + +-static int lprocfs_osd_wr_pdo(struct file *file, const char *buffer, +- unsigned long count, void *data) ++static ssize_t ++ldiskfs_osd_pdo_seq_write(struct file *file, const char *buffer, ++ size_t count, loff_t *off) + { +- int pdo; +- int rc; ++ int pdo, rc; + + rc = lprocfs_write_helper(buffer, count, &pdo); + if (rc != 0) +@@ -409,24 +365,25 @@ static int lprocfs_osd_wr_pdo(struct file *file, const char *buffer, + + return count; + } ++LPROC_SEQ_FOPS(ldiskfs_osd_pdo); + +-static int lprocfs_osd_rd_auto_scrub(char *page, char **start, off_t off, +- int count, int *eof, void *data) ++static int ldiskfs_osd_auto_scrub_seq_show(struct seq_file *m, void *data) + { +- struct osd_device *dev = osd_dt_dev(data); ++ struct osd_device *dev = osd_dt_dev((struct dt_device *)m->private); + + LASSERT(dev != NULL); + if (unlikely(dev->od_mnt == NULL)) + return -EINPROGRESS; + +- *eof = 1; +- return snprintf(page, count, "%d\n", !dev->od_noscrub); ++ return seq_printf(m, "%d\n", !dev->od_noscrub); + } + +-static int lprocfs_osd_wr_auto_scrub(struct file *file, const char *buffer, +- unsigned long count, void *data) ++static ssize_t ++ldiskfs_osd_auto_scrub_seq_write(struct file *file, const char *buffer, ++ size_t count, loff_t *off) + { +- struct osd_device *dev = osd_dt_dev(data); ++ struct dt_device *dt = ((struct seq_file *)file->private_data)->private; ++ struct osd_device *dev = osd_dt_dev(dt); + int val, rc; + + LASSERT(dev != NULL); +@@ -440,19 +397,18 @@ static int lprocfs_osd_wr_auto_scrub(struct file *file, const char *buffer, + dev->od_noscrub = !val; + return count; + } ++LPROC_SEQ_FOPS(ldiskfs_osd_auto_scrub); + +-static int lprocfs_osd_rd_track_declares_assert(char *page, char **start, +- off_t off, int count, +- int *eof, void *data) ++static int ++ldiskfs_osd_track_declares_assert_seq_show(struct seq_file *m, void *data) + { +- *eof = 1; +- +- return snprintf(page, count, "%d\n", ldiskfs_track_declares_assert); ++ return seq_printf(m, "%d\n", ldiskfs_track_declares_assert); + } + +-static int lprocfs_osd_wr_track_declares_assert(struct file *file, ++static ssize_t ++ldiskfs_osd_track_declares_assert_seq_write(struct file *file, + const char *buffer, +- unsigned long count, void *data) ++ size_t count, loff_t *off) + { + int track_declares_assert; + int rc; +@@ -465,38 +421,39 @@ static int lprocfs_osd_wr_track_declares_assert(struct file *file, + + return count; + } ++LPROC_SEQ_FOPS(ldiskfs_osd_track_declares_assert); ++ ++extern int osd_scrub_dump(struct seq_file *m, struct osd_device *dev); + +-static int lprocfs_osd_rd_oi_scrub(char *page, char **start, off_t off, +- int count, int *eof, void *data) ++static int ldiskfs_osd_oi_scrub_seq_show(struct seq_file *m, void *data) + { +- struct osd_device *dev = osd_dt_dev(data); ++ struct osd_device *dev = osd_dt_dev((struct dt_device *)m->private); + + LASSERT(dev != NULL); + if (unlikely(dev->od_mnt == NULL)) + return -EINPROGRESS; + +- *eof = 1; +- return osd_scrub_dump(dev, page, count); ++ return osd_scrub_dump(m, dev); + } ++LPROC_SEQ_FOPS_RO(ldiskfs_osd_oi_scrub); + +-int lprocfs_osd_rd_readcache(char *page, char **start, off_t off, int count, +- int *eof, void *data) ++int ldiskfs_osd_readcache_seq_show(struct seq_file *m, void *data) + { +- struct osd_device *osd = osd_dt_dev(data); +- int rc; ++ struct osd_device *osd = osd_dt_dev((struct dt_device *)m->private); + + LASSERT(osd != NULL); + if (unlikely(osd->od_mnt == NULL)) + return -EINPROGRESS; + +- rc = snprintf(page, count, LPU64"\n", osd->od_readcache_max_filesize); +- return rc; ++ return seq_printf(m, LPU64"\n", osd->od_readcache_max_filesize); + } + +-int lprocfs_osd_wr_readcache(struct file *file, const char *buffer, +- unsigned long count, void *data) ++ssize_t ++ldiskfs_osd_readcache_seq_write(struct file *file, const char *buffer, ++ size_t count, loff_t *off) + { +- struct osd_device *osd = osd_dt_dev(data); ++ struct dt_device *dt = ((struct seq_file *)file->private_data)->private; ++ struct osd_device *osd = osd_dt_dev(dt); + __u64 val; + int rc; + +@@ -512,24 +469,25 @@ int lprocfs_osd_wr_readcache(struct file *file, const char *buffer, + OSD_MAX_CACHE_SIZE : val; + return count; + } ++LPROC_SEQ_FOPS(ldiskfs_osd_readcache); + +-static int lprocfs_osd_rd_lma_self_repair(char *page, char **start, off_t off, +- int count, int *eof, void *data) ++static int ldiskfs_osd_lma_self_repair_seq_show(struct seq_file *m, void *data) + { +- struct osd_device *dev = osd_dt_dev(data); ++ struct osd_device *dev = osd_dt_dev((struct dt_device *)m->private); + + LASSERT(dev != NULL); + if (unlikely(dev->od_mnt == NULL)) + return -EINPROGRESS; + +- *eof = 1; +- return snprintf(page, count, "%d\n", !!dev->od_lma_self_repair); ++ return seq_printf(m, "%d\n", !!dev->od_lma_self_repair); + } + +-static int lprocfs_osd_wr_lma_self_repair(struct file *file, const char *buffer, +- unsigned long count, void *data) ++static ssize_t ++ldiskfs_osd_lma_self_repair_seq_write(struct file *file, const char *buffer, ++ size_t count, loff_t *off) + { +- struct osd_device *dev = osd_dt_dev(data); ++ struct dt_device *dt = ((struct seq_file *)file->private_data)->private; ++ struct osd_device *dev = osd_dt_dev(dt); + int val; + int rc; + +@@ -544,38 +502,104 @@ static int lprocfs_osd_wr_lma_self_repair(struct file *file, const char *buffer, + dev->od_lma_self_repair = !!val; + return count; + } +- +-struct lprocfs_vars lprocfs_osd_obd_vars[] = { +- { "blocksize", lprocfs_dt_rd_blksize, 0, 0 }, +- { "kbytestotal", lprocfs_dt_rd_kbytestotal, 0, 0 }, +- { "kbytesfree", lprocfs_dt_rd_kbytesfree, 0, 0 }, +- { "kbytesavail", lprocfs_dt_rd_kbytesavail, 0, 0 }, +- { "filestotal", lprocfs_dt_rd_filestotal, 0, 0 }, +- { "filesfree", lprocfs_dt_rd_filesfree, 0, 0 }, +- { "fstype", lprocfs_osd_rd_fstype, 0, 0 }, +- { "mntdev", lprocfs_osd_rd_mntdev, 0, 0 }, +- { "force_sync", 0, lprocfs_osd_wr_force_sync }, +- { "pdo", lprocfs_osd_rd_pdo, lprocfs_osd_wr_pdo, 0 }, +- { "auto_scrub", lprocfs_osd_rd_auto_scrub, +- lprocfs_osd_wr_auto_scrub, 0 }, +- { "oi_scrub", lprocfs_osd_rd_oi_scrub, 0, 0 }, +- { "force_sync", 0, lprocfs_osd_wr_force_sync }, +- { "read_cache_enable", lprocfs_osd_rd_cache, lprocfs_osd_wr_cache, 0 }, +- { "writethrough_cache_enable", lprocfs_osd_rd_wcache, +- lprocfs_osd_wr_wcache, 0 }, +- { "readcache_max_filesize", lprocfs_osd_rd_readcache, +- lprocfs_osd_wr_readcache, 0 }, +- { "lma_self_repair", lprocfs_osd_rd_lma_self_repair, +- lprocfs_osd_wr_lma_self_repair, 0, 0 }, ++LPROC_SEQ_FOPS(ldiskfs_osd_lma_self_repair); ++ ++LPROC_SEQ_FOPS_RO_TYPE(ldiskfs, dt_blksize); ++LPROC_SEQ_FOPS_RO_TYPE(ldiskfs, dt_kbytestotal); ++LPROC_SEQ_FOPS_RO_TYPE(ldiskfs, dt_kbytesfree); ++LPROC_SEQ_FOPS_RO_TYPE(ldiskfs, dt_kbytesavail); ++LPROC_SEQ_FOPS_RO_TYPE(ldiskfs, dt_filestotal); ++LPROC_SEQ_FOPS_RO_TYPE(ldiskfs, dt_filesfree); ++ ++struct lprocfs_seq_vars lprocfs_osd_obd_vars[] = { ++ { .name = "blocksize", ++ .fops = &ldiskfs_dt_blksize_fops }, ++ { .name = "kbytestotal", ++ .fops = &ldiskfs_dt_kbytestotal_fops }, ++ { .name = "kbytesfree", ++ .fops = &ldiskfs_dt_kbytesfree_fops }, ++ { .name = "kbytesavail", ++ .fops = &ldiskfs_dt_kbytesavail_fops }, ++ { .name = "filestotal", ++ .fops = &ldiskfs_dt_filestotal_fops }, ++ { .name = "filesfree", ++ .fops = &ldiskfs_dt_filesfree_fops }, ++ { .name = "fstype", ++ .fops = &ldiskfs_osd_fstype_fops }, ++ { .name = "mntdev", ++ .fops = &ldiskfs_osd_mntdev_fops }, ++ { .name = "force_sync", ++ .fops = &ldiskfs_osd_force_sync_fops }, ++ { .name = "pdo", ++ .fops = &ldiskfs_osd_pdo_fops }, ++ { .name = "auto_scrub", ++ .fops = &ldiskfs_osd_auto_scrub_fops }, ++ { .name = "oi_scrub", ++ .fops = &ldiskfs_osd_oi_scrub_fops }, ++ { .name = "read_cache_enable", ++ .fops = &ldiskfs_osd_cache_fops }, ++ { .name = "writethrough_cache_enable", ++ .fops = &ldiskfs_osd_wcache_fops }, ++ { .name = "readcache_max_filesize", ++ .fops = &ldiskfs_osd_readcache_fops }, ++ { .name = "lma_self_repair", ++ .fops = &ldiskfs_osd_lma_self_repair_fops }, + { 0 } + }; + +-struct lprocfs_vars lprocfs_osd_module_vars[] = { +- { "num_refs", lprocfs_rd_numrefs, 0, 0 }, +- { "track_declares_assert", lprocfs_osd_rd_track_declares_assert, +- lprocfs_osd_wr_track_declares_assert, +- 0 }, +- { 0 } ++struct lprocfs_seq_vars lprocfs_osd_module_vars[] = { ++ { .name = "track_declares_assert", ++ .fops = &ldiskfs_osd_track_declares_assert_fops }, ++ { 0 } + }; + ++ ++int osd_procfs_init(struct osd_device *osd, const char *name) ++{ ++ struct obd_type *type; ++ int rc; ++ ENTRY; ++ ++ if (osd->od_proc_entry) ++ RETURN(0); ++ ++ /* at the moment there is no linkage between lu_type ++ * and obd_type, so we lookup obd_type this way */ ++ type = class_search_type(LUSTRE_OSD_LDISKFS_NAME); ++ ++ LASSERT(name != NULL); ++ LASSERT(type != NULL); ++ ++ /* Find the type procroot and add the proc entry for this device */ ++ osd->od_proc_entry = lprocfs_seq_register(name, type->typ_procroot, ++ lprocfs_osd_obd_vars, ++ &osd->od_dt_dev); ++ if (IS_ERR(osd->od_proc_entry)) { ++ rc = PTR_ERR(osd->od_proc_entry); ++ CERROR("Error %d setting up lprocfs for %s\n", ++ rc, name); ++ osd->od_proc_entry = NULL; ++ GOTO(out, rc); ++ } ++ ++ rc = osd_stats_init(osd); ++ ++ EXIT; ++out: ++ if (rc) ++ osd_procfs_fini(osd); ++ return rc; ++} ++ ++int osd_procfs_fini(struct osd_device *osd) ++{ ++ if (osd->od_stats) ++ lprocfs_free_stats(&osd->od_stats); ++ ++ if (osd->od_proc_entry) { ++ lprocfs_remove(&osd->od_proc_entry); ++ osd->od_proc_entry = NULL; ++ } ++ RETURN(0); ++} + #endif +diff --git a/lustre/osd-ldiskfs/osd_scrub.c b/lustre/osd-ldiskfs/osd_scrub.c +index cce33af..1002913 100644 +--- a/lustre/osd-ldiskfs/osd_scrub.c ++++ b/lustre/osd-ldiskfs/osd_scrub.c +@@ -2578,80 +2578,69 @@ static const char *scrub_param_names[] = { + NULL + }; + +-static int scrub_bits_dump(char **buf, int *len, int bits, const char *names[], ++static int scrub_bits_dump(struct seq_file *m, int bits, const char *names[], + const char *prefix) + { +- int save = *len; + int flag; + int rc; + int i; + +- rc = snprintf(*buf, *len, "%s:%c", prefix, bits != 0 ? ' ' : '\n'); ++ rc = seq_printf(m, "%s:%c", prefix, bits != 0 ? ' ' : '\n'); + if (rc <= 0) + return -ENOSPC; + +- *buf += rc; +- *len -= rc; + for (i = 0, flag = 1; bits != 0; i++, flag = 1 << i) { + if (flag & bits) { + bits &= ~flag; +- rc = snprintf(*buf, *len, "%s%c", names[i], +- bits != 0 ? ',' : '\n'); ++ rc = seq_printf(m, "%s%c", names[i], ++ bits != 0 ? ',' : '\n'); + if (rc <= 0) + return -ENOSPC; +- +- *buf += rc; +- *len -= rc; + } + } +- return save - *len; ++ return 0; + } + +-static int scrub_time_dump(char **buf, int *len, __u64 time, const char *prefix) ++static int scrub_time_dump(struct seq_file *m, __u64 time, const char *prefix) + { + int rc; + + if (time != 0) +- rc = snprintf(*buf, *len, "%s: "LPU64" seconds\n", prefix, ++ rc = seq_printf(m, "%s: "LPU64" seconds\n", prefix, + cfs_time_current_sec() - time); + else +- rc = snprintf(*buf, *len, "%s: N/A\n", prefix); ++ rc = seq_printf(m, "%s: N/A\n", prefix); + if (rc <= 0) + return -ENOSPC; + +- *buf += rc; +- *len -= rc; +- return rc; ++ return 0; + } + +-static int scrub_pos_dump(char **buf, int *len, __u64 pos, const char *prefix) ++static int scrub_pos_dump(struct seq_file *m, __u64 pos, const char *prefix) + { + int rc; + + if (pos != 0) +- rc = snprintf(*buf, *len, "%s: "LPU64"\n", prefix, pos); ++ rc = seq_printf(m, "%s: "LPU64"\n", prefix, pos); + else +- rc = snprintf(*buf, *len, "%s: N/A\n", prefix); ++ rc = seq_printf(m, "%s: N/A\n", prefix); + if (rc <= 0) + return -ENOSPC; + +- *buf += rc; +- *len -= rc; + return rc; + } + +-int osd_scrub_dump(struct osd_device *dev, char *buf, int len) ++int osd_scrub_dump(struct seq_file *m,struct osd_device *dev) + { + struct osd_scrub *scrub = &dev->od_scrub; + struct scrub_file *sf = &scrub->os_file; + __u64 checked; + __u64 speed; +- int save = len; + int ret = -ENOSPC; + int rc; + + down_read(&scrub->os_rwsem); +- rc = snprintf(buf, len, ++ rc = seq_printf(m, + "name: OI_scrub\n" + "magic: 0x%x\n" + "oi_files: %d\n" +@@ -2661,51 +2650,48 @@ int osd_scrub_dump(struct osd_device *dev, char *buf, int len) + if (rc <= 0) + goto out; + +- buf += rc; +- len -= rc; +- rc = scrub_bits_dump(&buf, &len, sf->sf_flags, scrub_flags_names, ++ rc = scrub_bits_dump(m, sf->sf_flags, scrub_flags_names, + "flags"); + if (rc < 0) + goto out; + +- rc = scrub_bits_dump(&buf, &len, sf->sf_param, scrub_param_names, ++ rc = scrub_bits_dump(m, sf->sf_param, scrub_param_names, + "param"); + if (rc < 0) + goto out; + +- rc = scrub_time_dump(&buf, &len, sf->sf_time_last_complete, ++ rc = scrub_time_dump(m, sf->sf_time_last_complete, + "time_since_last_completed"); + if (rc < 0) + goto out; + +- rc = scrub_time_dump(&buf, &len, sf->sf_time_latest_start, ++ rc = scrub_time_dump(m, sf->sf_time_latest_start, + "time_since_latest_start"); + if (rc < 0) + goto out; + +- rc = scrub_time_dump(&buf, &len, sf->sf_time_last_checkpoint, ++ rc = scrub_time_dump(m, sf->sf_time_last_checkpoint, + "time_since_last_checkpoint"); + if (rc < 0) + goto out; + +- rc = scrub_pos_dump(&buf, &len, sf->sf_pos_latest_start, ++ rc = scrub_pos_dump(m, sf->sf_pos_latest_start, + "latest_start_position"); + if (rc < 0) + goto out; + +- rc = scrub_pos_dump(&buf, &len, sf->sf_pos_last_checkpoint, ++ rc = scrub_pos_dump(m, sf->sf_pos_last_checkpoint, + "last_checkpoint_position"); + if (rc < 0) + goto out; + +- rc = scrub_pos_dump(&buf, &len, sf->sf_pos_first_inconsistent, ++ rc = scrub_pos_dump(m, sf->sf_pos_first_inconsistent, + "first_failure_position"); + if (rc < 0) + goto out; + + checked = sf->sf_items_checked + scrub->os_new_checked; +- rc = snprintf(buf, len, +- "checked: "LPU64"\n" ++ rc = seq_printf(m, "checked: "LPU64"\n" + "updated: "LPU64"\n" + "failed: "LPU64"\n" + "prior_updated: "LPU64"\n" +@@ -2718,8 +2704,6 @@ int osd_scrub_dump(struct osd_device *dev, char *buf, int len) + if (rc <= 0) + goto out; + +- buf += rc; +- len -= rc; + speed = checked; + if (thread_is_running(&scrub->os_thread)) { + cfs_duration_t duration = cfs_time_current() - +@@ -2732,8 +2716,7 @@ int osd_scrub_dump(struct osd_device *dev, char *buf, int len) + do_div(new_checked, duration); + if (rtime != 0) + do_div(speed, rtime); +- rc = snprintf(buf, len, +- "run_time: %u seconds\n" ++ rc = seq_printf(m, "run_time: %u seconds\n" + "average_speed: "LPU64" objects/sec\n" + "real-time_speed: "LPU64" objects/sec\n" + "current_position: %u\n" +@@ -2746,8 +2729,7 @@ int osd_scrub_dump(struct osd_device *dev, char *buf, int len) + } else { + if (sf->sf_run_time != 0) + do_div(speed, sf->sf_run_time); +- rc = snprintf(buf, len, +- "run_time: %u seconds\n" ++ rc = seq_printf(m, "run_time: %u seconds\n" + "average_speed: "LPU64" objects/sec\n" + "real-time_speed: N/A\n" + "current_position: N/A\n" +@@ -2759,10 +2741,7 @@ int osd_scrub_dump(struct osd_device *dev, char *buf, int len) + } + if (rc <= 0) + goto out; +- +- buf += rc; +- len -= rc; +- ret = save - len; ++ ret = 0; + + out: + up_read(&scrub->os_rwsem); +-- +1.8.5.3 + |