X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flod%2Flproc_lod.c;h=b7621f18f7e660b16fa428103b7dadbc7fe6e104;hb=292aa42e0897ec4db0c07d00a3f050c19b3f908d;hp=b6eafe3e271092b3300665277873f3f0526468d4;hpb=e49995acfd026f3ca85d05dc1b91d97a8743fe72;p=fs%2Flustre-release.git diff --git a/lustre/lod/lproc_lod.c b/lustre/lod/lproc_lod.c index b6eafe3..b7621f1 100644 --- a/lustre/lod/lproc_lod.c +++ b/lustre/lod/lproc_lod.c @@ -15,11 +15,7 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -27,7 +23,7 @@ * Copyright 2008 Sun Microsystems, Inc. All rights reserved * Use is subject to license terms. * - * Copyright (c) 2012, 2014, Intel Corporation. + * Copyright (c) 2012, 2017, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -39,7 +35,7 @@ #include #include #include "lod_internal.h" -#include +#include /* * Notice, all the functions below (except for lod_procfs_init() and @@ -47,7 +43,70 @@ * called by Linux kernel's procfs. */ -#ifdef LPROCFS +#ifdef CONFIG_PROC_FS + +/** + * Show default stripe size. + * + * \param[in] m seq file + * \param[in] v unused for single entry + * + * \retval 0 on success + * \retval negative error code if failed + */ +static int lod_dom_stripesize_seq_show(struct seq_file *m, void *v) +{ + struct obd_device *dev = m->private; + struct lod_device *lod; + + LASSERT(dev != NULL); + lod = lu2lod_dev(dev->obd_lu_dev); + seq_printf(m, "%u\n", lod->lod_dom_max_stripesize); + return 0; +} + +/** + * Set default stripe size. + * + * \param[in] file proc file + * \param[in] buffer string containing the maximum number of bytes stored in + * each object before moving to the next object in the + * layout (if any) + * \param[in] count @buffer length + * \param[in] off unused for single entry + * + * \retval @count on success + * \retval negative error code if failed + */ +static ssize_t +lod_dom_stripesize_seq_write(struct file *file, const char __user *buffer, + size_t count, loff_t *off) +{ + struct seq_file *m = file->private_data; + struct obd_device *dev = m->private; + struct lod_device *lod; + s64 val; + int rc; + + LASSERT(dev != NULL); + lod = lu2lod_dev(dev->obd_lu_dev); + rc = lprocfs_str_with_units_to_s64(buffer, count, &val, '1'); + if (rc) + return rc; + if (val < 0) + return -ERANGE; + + /* 1GB is the limit */ + if (val > (1ULL << 30)) + return -ERANGE; + else if (val > 0) + lod_fix_desc_stripe_size(&val); + + lod->lod_dom_max_stripesize = val; + + return count; +} +LPROC_SEQ_FOPS(lod_dom_stripesize); /** * Show default stripe size. @@ -65,8 +124,9 @@ static int lod_stripesize_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, LPU64"\n", - lod->lod_desc.ld_default_stripe_size); + seq_printf(m, "%llu\n", + lod->lod_desc.ld_default_stripe_size); + return 0; } /** @@ -83,23 +143,26 @@ static int lod_stripesize_seq_show(struct seq_file *m, void *v) * \retval negative error code if failed */ static ssize_t -lod_stripesize_seq_write(struct file *file, const char *buffer, +lod_stripesize_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { - struct seq_file *m = file->private_data; + struct seq_file *m = file->private_data; struct obd_device *dev = m->private; struct lod_device *lod; - __u64 val; + s64 val; int rc; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - rc = lprocfs_write_u64_helper(buffer, count, &val); + rc = lprocfs_str_with_units_to_s64(buffer, count, &val, '1'); if (rc) return rc; + if (val < 0) + return -ERANGE; lod_fix_desc_stripe_size(&val); lod->lod_desc.ld_default_stripe_size = val; + return count; } LPROC_SEQ_FOPS(lod_stripesize); @@ -120,8 +183,8 @@ static int lod_stripeoffset_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, LPU64"\n", - lod->lod_desc.ld_default_stripe_offset); + seq_printf(m, "%lld\n", lod->lod_desc.ld_default_stripe_offset); + return 0; } /** @@ -139,22 +202,25 @@ static int lod_stripeoffset_seq_show(struct seq_file *m, void *v) * \retval negative error code if failed */ static ssize_t -lod_stripeoffset_seq_write(struct file *file, const char *buffer, +lod_stripeoffset_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { - struct seq_file *m = file->private_data; + struct seq_file *m = file->private_data; struct obd_device *dev = m->private; struct lod_device *lod; - __u64 val; + long val; int rc; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - rc = lprocfs_write_u64_helper(buffer, count, &val); + rc = kstrtol_from_user(buffer, count, 0, &val); if (rc) return rc; + if (val < -1 || val > LOV_MAX_STRIPE_COUNT) + return -ERANGE; lod->lod_desc.ld_default_stripe_offset = val; + return count; } LPROC_SEQ_FOPS(lod_stripeoffset); @@ -175,7 +241,8 @@ static int lod_stripetype_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, "%u\n", lod->lod_desc.ld_pattern); + seq_printf(m, "%u\n", lod->lod_desc.ld_pattern); + return 0; } /** @@ -191,22 +258,24 @@ static int lod_stripetype_seq_show(struct seq_file *m, void *v) * \retval negative error code if failed */ static ssize_t -lod_stripetype_seq_write(struct file *file, const char *buffer, +lod_stripetype_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { - struct seq_file *m = file->private_data; + struct seq_file *m = file->private_data; struct obd_device *dev = m->private; struct lod_device *lod; - int val, rc; + u32 pattern; + int rc; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - rc = lprocfs_write_helper(buffer, count, &val); + rc = kstrtouint_from_user(buffer, count, 0, &pattern); if (rc) return rc; - lod_fix_desc_pattern(&val); - lod->lod_desc.ld_pattern = val; + lod_fix_desc_pattern(&pattern); + lod->lod_desc.ld_pattern = pattern; + return count; } LPROC_SEQ_FOPS(lod_stripetype); @@ -227,8 +296,9 @@ static int lod_stripecount_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, "%d\n", - (__s16)(lod->lod_desc.ld_default_stripe_count + 1) - 1); + seq_printf(m, "%d\n", + (__s16)(lod->lod_desc.ld_default_stripe_count + 1) - 1); + return 0; } /** @@ -244,22 +314,24 @@ static int lod_stripecount_seq_show(struct seq_file *m, void *v) * \retval negative error code otherwise */ static ssize_t -lod_stripecount_seq_write(struct file *file, const char *buffer, +lod_stripecount_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { - struct seq_file *m = file->private_data; + struct seq_file *m = file->private_data; struct obd_device *dev = m->private; struct lod_device *lod; - int val, rc; + u32 stripe_count; + int rc; LASSERT(dev != NULL); - lod = lu2lod_dev(dev->obd_lu_dev); - rc = lprocfs_write_helper(buffer, count, &val); + lod = lu2lod_dev(dev->obd_lu_dev); + rc = kstrtouint_from_user(buffer, count, 0, &stripe_count); if (rc) return rc; - lod_fix_desc_stripe_count(&val); - lod->lod_desc.ld_default_stripe_count = val; + lod_fix_desc_stripe_count(&stripe_count); + lod->lod_desc.ld_default_stripe_count = stripe_count; + return count; } LPROC_SEQ_FOPS(lod_stripecount); @@ -280,7 +352,8 @@ static int lod_numobd_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, "%u\n", lod->lod_desc.ld_tgt_count); + seq_printf(m, "%u\n", lod->lod_desc.ld_tgt_count); + return 0; } LPROC_SEQ_FOPS_RO(lod_numobd); @@ -300,7 +373,8 @@ static int lod_activeobd_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, "%u\n", lod->lod_desc.ld_active_tgt_count); + seq_printf(m, "%u\n", lod->lod_desc.ld_active_tgt_count); + return 0; } LPROC_SEQ_FOPS_RO(lod_activeobd); @@ -320,7 +394,8 @@ static int lod_desc_uuid_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, "%s\n", lod->lod_desc.ld_uuid.uuid); + seq_printf(m, "%s\n", lod->lod_desc.ld_uuid.uuid); + return 0; } LPROC_SEQ_FOPS_RO(lod_desc_uuid); @@ -344,8 +419,9 @@ static int lod_qos_priofree_seq_show(struct seq_file *m, void *v) struct lod_device *lod = lu2lod_dev(dev->obd_lu_dev); LASSERT(lod != NULL); - return seq_printf(m, "%d%%\n", - (lod->lod_qos.lq_prio_free * 100 + 255) >> 8); + seq_printf(m, "%d%%\n", + (lod->lod_qos.lq_prio_free * 100 + 255) >> 8); + return 0; } /** @@ -368,15 +444,16 @@ static ssize_t lod_qos_priofree_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { - struct seq_file *m = file->private_data; + struct seq_file *m = file->private_data; struct obd_device *dev = m->private; struct lod_device *lod; - int val, rc; + unsigned int val; + int rc; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - rc = lprocfs_write_helper(buffer, count, &val); + rc = kstrtouint_from_user(buffer, count, 0, &val); if (rc) return rc; @@ -385,6 +462,7 @@ lod_qos_priofree_seq_write(struct file *file, const char __user *buffer, lod->lod_qos.lq_prio_free = (val << 8) / 100; lod->lod_qos.lq_dirty = 1; lod->lod_qos.lq_reset = 1; + return count; } LPROC_SEQ_FOPS(lod_qos_priofree); @@ -405,8 +483,9 @@ static int lod_qos_thresholdrr_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, "%d%%\n", - (lod->lod_qos.lq_threshold_rr * 100 + 255) >> 8); + seq_printf(m, "%d%%\n", + (lod->lod_qos.lq_threshold_rr * 100 + 255) >> 8); + return 0; } /** @@ -427,18 +506,19 @@ static int lod_qos_thresholdrr_seq_show(struct seq_file *m, void *v) * \retval negative error code if failed */ static ssize_t -lod_qos_thresholdrr_seq_write(struct file *file, const char *buffer, +lod_qos_thresholdrr_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { - struct seq_file *m = file->private_data; + struct seq_file *m = file->private_data; struct obd_device *dev = m->private; struct lod_device *lod; - int val, rc; + int rc; + __s64 val; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - rc = lprocfs_write_helper(buffer, count, &val); + rc = lprocfs_str_with_units_to_s64(buffer, count, &val, '%'); if (rc) return rc; @@ -447,6 +527,7 @@ lod_qos_thresholdrr_seq_write(struct file *file, const char *buffer, lod->lod_qos.lq_threshold_rr = (val << 8) / 100; lod->lod_qos.lq_dirty = 1; + return count; } LPROC_SEQ_FOPS(lod_qos_thresholdrr); @@ -468,7 +549,8 @@ static int lod_qos_maxage_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, "%u Sec\n", lod->lod_desc.ld_qos_maxage); + seq_printf(m, "%u Sec\n", lod->lod_desc.ld_qos_maxage); + return 0; } /** @@ -483,23 +565,24 @@ static int lod_qos_maxage_seq_show(struct seq_file *m, void *v) * \retval negative error code if failed */ static ssize_t -lod_qos_maxage_seq_write(struct file *file, const char *buffer, +lod_qos_maxage_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { - struct seq_file *m = file->private_data; - struct obd_device *dev = m->private; - struct lustre_cfg_bufs bufs; - struct lod_device *lod; - struct lu_device *next; - struct lustre_cfg *lcfg; - char str[32]; - unsigned int i; - int val, rc; + struct seq_file *m = file->private_data; + struct obd_device *dev = m->private; + struct lustre_cfg_bufs bufs; + struct lod_device *lod; + struct lu_device *next; + struct lustre_cfg *lcfg; + char str[32]; + unsigned int i; + int rc; + u32 val; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - rc = lprocfs_write_helper(buffer, count, &val); + rc = kstrtouint_from_user(buffer, count, 0, &val); if (rc) return rc; @@ -511,11 +594,12 @@ lod_qos_maxage_seq_write(struct file *file, const char *buffer, * propogate the value down to OSPs */ lustre_cfg_bufs_reset(&bufs, NULL); - sprintf(str, "%smaxage=%d", PARAM_OSP, val); + snprintf(str, 32, "%smaxage=%u", PARAM_OSP, val); lustre_cfg_bufs_set_string(&bufs, 1, str); - lcfg = lustre_cfg_new(LCFG_PARAM, &bufs); + OBD_ALLOC(lcfg, lustre_cfg_len(bufs.lcfg_bufcount, bufs.lcfg_buflen)); if (lcfg == NULL) return -ENOMEM; + lustre_cfg_init(lcfg, LCFG_PARAM, &bufs); lod_getref(&lod->lod_ost_descs); lod_foreach_ost(lod, i) { @@ -525,7 +609,7 @@ lod_qos_maxage_seq_write(struct file *file, const char *buffer, CERROR("can't set maxage on #%d: %d\n", i, rc); } lod_putref(lod, &lod->lod_ost_descs); - lustre_cfg_free(lcfg); + OBD_FREE(lcfg, lustre_cfg_len(lcfg->lcfg_bufcount, lcfg->lcfg_buflens)); return count; } @@ -612,9 +696,10 @@ static int lod_osts_seq_show(struct seq_file *p, void *v) } else if (rc) return rc; - return seq_printf(p, "%d: %s %sACTIVE\n", idx, - obd_uuid2str(&ost_desc->ltd_uuid), - active ? "" : "IN"); + seq_printf(p, "%d: %s %sACTIVE\n", idx, + obd_uuid2str(&ost_desc->ltd_uuid), + active ? "" : "IN"); + return 0; } static const struct seq_operations lod_osts_sops = { @@ -638,8 +723,6 @@ static int lod_osts_seq_open(struct inode *inode, struct file *file) return 0; } -LPROC_SEQ_FOPS_RO_TYPE(lod, uuid); - LPROC_SEQ_FOPS_RO_TYPE(lod, dt_blksize); LPROC_SEQ_FOPS_RO_TYPE(lod, dt_kbytestotal); LPROC_SEQ_FOPS_RO_TYPE(lod, dt_kbytesfree); @@ -664,7 +747,8 @@ static int lod_lmv_failout_seq_show(struct seq_file *m, void *v) LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - return seq_printf(m, "%d\n", lod->lod_lmv_failout ? 1 : 0); + seq_printf(m, "%d\n", lod->lod_lmv_failout ? 1 : 0); + return 0; } /** @@ -683,34 +767,29 @@ static int lod_lmv_failout_seq_show(struct seq_file *m, void *v) * \retval negative error code if failed */ static ssize_t -lod_lmv_failout_seq_write(struct file *file, const char *buffer, +lod_lmv_failout_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { - struct seq_file *m = file->private_data; - struct obd_device *dev = m->private; - struct lod_device *lod; - int val = 0; - int rc; + struct seq_file *m = file->private_data; + struct obd_device *dev = m->private; + struct lod_device *lod; + bool val = 0; + int rc; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - rc = lprocfs_write_helper(buffer, count, &val); - if (rc != 0) + rc = kstrtobool_from_user(buffer, count, &val); + if (rc) return rc; - if (val != 0) - lod->lod_lmv_failout = 1; - else - lod->lod_lmv_failout = 0; + lod->lod_lmv_failout = val; return count; } LPROC_SEQ_FOPS(lod_lmv_failout); -static struct lprocfs_seq_vars lprocfs_lod_obd_vars[] = { - { .name = "uuid", - .fops = &lod_uuid_fops }, +static struct lprocfs_vars lprocfs_lod_obd_vars[] = { { .name = "stripesize", .fops = &lod_stripesize_fops }, { .name = "stripeoffset", @@ -733,17 +812,21 @@ static struct lprocfs_seq_vars lprocfs_lod_obd_vars[] = { .fops = &lod_qos_maxage_fops }, { .name = "lmv_failout", .fops = &lod_lmv_failout_fops }, + { + .name = "dom_stripesize", + .fops = &lod_dom_stripesize_fops + }, { NULL } }; -static struct lprocfs_seq_vars lprocfs_lod_osd_vars[] = { - { "blocksize", &lod_dt_blksize_fops }, - { "kbytestotal", &lod_dt_kbytestotal_fops }, - { "kbytesfree", &lod_dt_kbytesfree_fops }, - { "kbytesavail", &lod_dt_kbytesavail_fops }, - { "filestotal", &lod_dt_filestotal_fops }, - { "filesfree", &lod_dt_filesfree_fops }, - { NULL } +static struct lprocfs_vars lprocfs_lod_osd_vars[] = { + { .name = "blocksize", .fops = &lod_dt_blksize_fops }, + { .name = "kbytestotal", .fops = &lod_dt_kbytestotal_fops }, + { .name = "kbytesfree", .fops = &lod_dt_kbytesfree_fops }, + { .name = "kbytesavail", .fops = &lod_dt_kbytesavail_fops }, + { .name = "filestotal", .fops = &lod_dt_filestotal_fops }, + { .name = "filesfree", .fops = &lod_dt_filesfree_fops }, + { .name = NULL } }; static const struct file_operations lod_proc_target_fops = { @@ -764,21 +847,22 @@ static const struct file_operations lod_proc_target_fops = { */ int lod_procfs_init(struct lod_device *lod) { - struct obd_device *obd = lod2obd(lod); - struct proc_dir_entry *lov_proc_dir = NULL; - struct obd_type *type; - int rc; + struct obd_device *obd = lod2obd(lod); + struct proc_dir_entry *lov_proc_dir; + struct obd_type *type; + struct kobject *lov; + int rc; obd->obd_vars = lprocfs_lod_obd_vars; - rc = lprocfs_obd_setup(obd); + rc = lprocfs_obd_setup(obd, true); if (rc) { CERROR("%s: cannot setup procfs entry: %d\n", obd->obd_name, rc); RETURN(rc); } - rc = lprocfs_seq_add_vars(obd->obd_proc_entry, lprocfs_lod_osd_vars, - &lod->lod_dt_dev); + rc = lprocfs_add_vars(obd->obd_proc_entry, lprocfs_lod_osd_vars, + &lod->lod_dt_dev); if (rc) { CERROR("%s: cannot setup procfs entry: %d\n", obd->obd_name, rc); @@ -793,9 +877,9 @@ int lod_procfs_init(struct lod_device *lod) GOTO(out, rc); } - lod->lod_pool_proc_entry = lprocfs_seq_register("pools", - obd->obd_proc_entry, - NULL, NULL); + lod->lod_pool_proc_entry = lprocfs_register("pools", + obd->obd_proc_entry, + NULL, NULL); if (IS_ERR(lod->lod_pool_proc_entry)) { rc = PTR_ERR(lod->lod_pool_proc_entry); lod->lod_pool_proc_entry = NULL; @@ -804,6 +888,19 @@ int lod_procfs_init(struct lod_device *lod) GOTO(out, rc); } + lov = kset_find_obj(lustre_kset, "lov"); + if (lov) { + rc = sysfs_create_link(lov, &obd->obd_kset.kobj, + obd->obd_name); + kobject_put(lov); + } + + lod->lod_debugfs = ldebugfs_add_symlink(obd->obd_name, "lov", + "../lod/%s", obd->obd_name); + if (!lod->lod_debugfs) + CERROR("%s: failed to create LOV debugfs symlink\n", + obd->obd_name); + /* If the real LOV is present which is the case for setups * with both server and clients on the same node then use * the LOV's proc root */ @@ -838,17 +935,24 @@ out: void lod_procfs_fini(struct lod_device *lod) { struct obd_device *obd = lod2obd(lod); + struct kobject *lov; - if (lod->lod_symlink != NULL) + if (lod->lod_symlink != NULL) { lprocfs_remove(&lod->lod_symlink); + lod->lod_symlink = NULL; + } - if (lod->lod_pool_proc_entry != NULL) { - lprocfs_remove(&lod->lod_pool_proc_entry); - lod->lod_pool_proc_entry = NULL; + lov = kset_find_obj(lustre_kset, "lov"); + if (lov) { + sysfs_remove_link(lov, obd->obd_name); + kobject_put(lov); } + if (!IS_ERR_OR_NULL(lod->lod_debugfs)) + ldebugfs_remove(&lod->lod_debugfs); + lprocfs_obd_cleanup(obd); } -#endif /* LPROCFS */ +#endif /* CONFIG_PROC_FS */