From 5e9577a6a9a20d857404ffbff8e1bb539c1e2b8b Mon Sep 17 00:00:00 2001 From: James Simmons Date: Tue, 25 Mar 2014 12:37:41 -0400 Subject: [PATCH] LU-3319 procfs: update ldiskfs proc handling to seq_files Migrate all ldiskfs proc handling to using strictly seq_files. Also include a fix with newer gcc complaining certain variables are uninitialized. Signed-off-by: James Simmons Change-Id: Ia296a4682e2feda02bcfbe0100de8a89404cd731 Reviewed-on: http://review.whamcloud.com/8232 Tested-by: Jenkins Reviewed-by: Nathaniel Clark Tested-by: Maloo Reviewed-by: Yang Sheng Reviewed-by: Oleg Drokin --- 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 | 343 ++++++++++++++++++++------------------ lustre/osd-ldiskfs/osd_scrub.c | 104 ++++-------- 5 files changed, 235 insertions(+), 240 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_compat.c b/lustre/osd-ldiskfs/osd_compat.c index 8b91b64..6330066 100644 --- a/lustre/osd-ldiskfs/osd_compat.c +++ b/lustre/osd-ldiskfs/osd_compat.c @@ -1164,7 +1164,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; @@ -1185,7 +1185,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; @@ -1207,7 +1207,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 6d9e488..4b5370a 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -5876,12 +5876,13 @@ 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, + lprocfs_osd_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, + lprocfs_osd_obd_vars, + cfg, &o->od_dt_dev); break; default: rc = -ENOSYS; @@ -6028,9 +6029,10 @@ static int __init osd_mod_init(void) if (rc) return rc; - rc = class_register_type(&osd_obd_device_ops, NULL, true, NULL, -#ifndef HAVE_ONLY_PROCFS_SEQ + rc = class_register_type(&osd_obd_device_ops, NULL, true, 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 185d63d..e1bde19 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -617,8 +617,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); @@ -673,7 +673,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..ddaa169 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) +static int ldiskfs_osd_fstype_seq_show(struct seq_file *m, void *data) { - 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); - } + struct osd_device *osd = osd_dt_dev((struct dt_device *)m->private); - 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) -{ - struct osd_device *osd = osd_dt_dev(data); - - 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, "%s\n", osd->od_mntdev); } +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,27 @@ 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 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)) @@ -365,14 +322,17 @@ 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 seq_file *m = file->private_data; + struct dt_device *dt = m->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 +346,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 +367,26 @@ 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 seq_file *m = file->private_data; + struct dt_device *dt = m->private; + struct osd_device *dev = osd_dt_dev(dt); int val, rc; LASSERT(dev != NULL); @@ -440,19 +400,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,40 +424,40 @@ static int lprocfs_osd_wr_track_declares_assert(struct file *file, return count; } +LPROC_SEQ_FOPS(ldiskfs_osd_track_declares_assert); -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); - __u64 val; - int rc; + struct seq_file *m = file->private_data; + struct dt_device *dt = m->private; + struct osd_device *osd = osd_dt_dev(dt); + __u64 val; + int rc; LASSERT(osd != NULL); if (unlikely(osd->od_mnt == NULL)) @@ -512,24 +471,26 @@ 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 seq_file *m = file->private_data; + struct dt_device *dt = m->private; + struct osd_device *dev = osd_dt_dev(dt); int val; int rc; @@ -544,38 +505,102 @@ 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); + RETURN(0); +} #endif diff --git a/lustre/osd-ldiskfs/osd_scrub.c b/lustre/osd-ldiskfs/osd_scrub.c index 054239b..0e3ecaa 100644 --- a/lustre/osd-ldiskfs/osd_scrub.c +++ b/lustre/osd-ldiskfs/osd_scrub.c @@ -2573,134 +2573,112 @@ 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'); - if (rc <= 0) - return -ENOSPC; + rc = seq_printf(m, "%s:%c", prefix, bits != 0 ? ' ' : '\n'); + if (rc < 0) + return rc; - *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'); - if (rc <= 0) - return -ENOSPC; - - *buf += rc; - *len -= rc; + rc = seq_printf(m, "%s%c", names[i], + bits != 0 ? ',' : '\n'); + if (rc < 0) + return 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); - if (rc <= 0) - return -ENOSPC; - - *buf += rc; - *len -= rc; + rc = seq_printf(m, "%s: N/A\n", prefix); return rc; } -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); - if (rc <= 0) - return -ENOSPC; - - *buf += rc; - *len -= rc; + rc = seq_printf(m, "%s: N/A\n", prefix); 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, - "name: OI_scrub\n" - "magic: 0x%x\n" - "oi_files: %d\n" - "status: %s\n", - sf->sf_magic, (int)sf->sf_oi_count, - scrub_status_names[sf->sf_status]); - if (rc <= 0) + rc = seq_printf(m, "name: OI_scrub\n" + "magic: 0x%x\n" + "oi_files: %d\n" + "status: %s\n", + sf->sf_magic, (int)sf->sf_oi_count, + scrub_status_names[sf->sf_status]); + 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" @@ -2710,11 +2688,9 @@ int osd_scrub_dump(struct osd_device *dev, char *buf, int len) checked, sf->sf_items_updated, sf->sf_items_failed, sf->sf_items_updated_prior, sf->sf_items_noscrub, sf->sf_items_igif, sf->sf_success_count); - if (rc <= 0) + 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() - @@ -2727,8 +2703,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" @@ -2741,8 +2716,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" @@ -2752,14 +2726,8 @@ int osd_scrub_dump(struct osd_device *dev, char *buf, int len) sf->sf_run_time, speed, scrub->os_lf_scanned, scrub->os_lf_repaired, scrub->os_lf_failed); } - if (rc <= 0) - goto out; - - buf += rc; - len -= rc; - ret = save - len; out: up_read(&scrub->os_rwsem); - return ret; + return (rc < 0 ? -ENOSPC : 0); } -- 1.8.3.1