X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_lproc.c;h=91fd2ae3ec151bed6739db886dbe04af3e054d36;hp=98e857a69811f0374b126facb508ece1dc051514;hb=ecd28d9b6cb691bda8184a7e07f1acc1ccded391;hpb=98d88213b8adde7cfa4a3b7aa1ff65e17e7e93a9 diff --git a/lustre/osd-ldiskfs/osd_lproc.c b/lustre/osd-ldiskfs/osd_lproc.c index 98e857a..91fd2ae 100644 --- a/lustre/osd-ldiskfs/osd_lproc.c +++ b/lustre/osd-ldiskfs/osd_lproc.c @@ -27,7 +27,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2013, Intel Corporation. + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -45,7 +45,7 @@ #include "osd_internal.h" -#ifdef LPROCFS +#ifdef CONFIG_PROC_FS void osd_brw_stats_update(struct osd_device *osd, struct osd_iobuf *iobuf) { @@ -154,7 +154,8 @@ static void brw_stats_show(struct seq_file *seq, struct brw_stats *brw_stats) display_brw_stats(seq, "I/O time (1/1000s)", "ios", &brw_stats->hist[BRW_R_IO_TIME], - &brw_stats->hist[BRW_W_IO_TIME], 1000 / HZ); + &brw_stats->hist[BRW_W_IO_TIME], + jiffies_to_msecs(1000) / MSEC_PER_SEC); display_brw_stats(seq, "disk I/O size", "ios", &brw_stats->hist[BRW_R_DISK_IOSIZE], @@ -402,6 +403,81 @@ ldiskfs_osd_auto_scrub_seq_write(struct file *file, const char *buffer, } LPROC_SEQ_FOPS(ldiskfs_osd_auto_scrub); +static int ldiskfs_osd_full_scrub_ratio_seq_show(struct seq_file *m, void *data) +{ + struct osd_device *dev = osd_dt_dev((struct dt_device *)m->private); + + LASSERT(dev != NULL); + if (unlikely(dev->od_mnt == NULL)) + return -EINPROGRESS; + + return seq_printf(m, LPU64"\n", dev->od_full_scrub_ratio); +} + +static ssize_t +ldiskfs_osd_full_scrub_ratio_seq_write(struct file *file, const char *buffer, + size_t count, loff_t *off) +{ + 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); + if (unlikely(dev->od_mnt == NULL)) + return -EINPROGRESS; + + rc = lprocfs_write_helper(buffer, count, &val); + if (rc != 0) + return rc; + + if (val < 0) + return -EINVAL; + + dev->od_full_scrub_ratio = val; + return count; +} +LPROC_SEQ_FOPS(ldiskfs_osd_full_scrub_ratio); + +static int ldiskfs_osd_full_scrub_threshold_rate_seq_show(struct seq_file *m, + void *data) +{ + struct osd_device *dev = osd_dt_dev((struct dt_device *)m->private); + + LASSERT(dev != NULL); + if (unlikely(dev->od_mnt == NULL)) + return -EINPROGRESS; + + return seq_printf(m, LPU64" (bad OI mappings/minute)\n", + dev->od_full_scrub_threshold_rate); +} + +static ssize_t +ldiskfs_osd_full_scrub_threshold_rate_seq_write(struct file *file, + const char *buffer, + size_t count, loff_t *off) +{ + 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); + if (unlikely(dev->od_mnt == NULL)) + return -EINPROGRESS; + + rc = lprocfs_write_helper(buffer, count, &val); + if (rc != 0) + return rc; + + if (val < 0) + return -EINVAL; + + dev->od_full_scrub_threshold_rate = val; + return count; +} +LPROC_SEQ_FOPS(ldiskfs_osd_full_scrub_threshold_rate); + static int ldiskfs_osd_track_declares_assert_seq_show(struct seq_file *m, void *data) { @@ -438,7 +514,7 @@ static int ldiskfs_osd_oi_scrub_seq_show(struct seq_file *m, void *data) } LPROC_SEQ_FOPS_RO(ldiskfs_osd_oi_scrub); -int ldiskfs_osd_readcache_seq_show(struct seq_file *m, void *data) +static int ldiskfs_osd_readcache_seq_show(struct seq_file *m, void *data) { struct osd_device *osd = osd_dt_dev((struct dt_device *)m->private); @@ -449,7 +525,7 @@ int ldiskfs_osd_readcache_seq_show(struct seq_file *m, void *data) return seq_printf(m, LPU64"\n", osd->od_readcache_max_filesize); } -ssize_t +static ssize_t ldiskfs_osd_readcache_seq_write(struct file *file, const char *buffer, size_t count, loff_t *off) { @@ -473,7 +549,8 @@ ldiskfs_osd_readcache_seq_write(struct file *file, const char *buffer, } LPROC_SEQ_FOPS(ldiskfs_osd_readcache); -static int ldiskfs_osd_lma_self_repair_seq_show(struct seq_file *m, void *data) +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 52, 0) +static int ldiskfs_osd_index_in_idif_seq_show(struct seq_file *m, void *data) { struct osd_device *dev = osd_dt_dev((struct dt_device *)m->private); @@ -481,31 +558,73 @@ static int ldiskfs_osd_lma_self_repair_seq_show(struct seq_file *m, void *data) if (unlikely(dev->od_mnt == NULL)) return -EINPROGRESS; - return seq_printf(m, "%d\n", !!dev->od_lma_self_repair); + return seq_printf(m, "%d\n", (int)(dev->od_index_in_idif)); } static ssize_t -ldiskfs_osd_lma_self_repair_seq_write(struct file *file, const char *buffer, - size_t count, loff_t *off) +ldiskfs_osd_index_in_idif_seq_write(struct file *file, const char *buffer, + size_t count, loff_t *off) { - 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; + struct lu_env env; + struct seq_file *m = file->private_data; + struct dt_device *dt = m->private; + struct osd_device *dev = osd_dt_dev(dt); + struct lu_target *tgt; + int val; + int rc; LASSERT(dev != NULL); if (unlikely(dev->od_mnt == NULL)) return -EINPROGRESS; rc = lprocfs_write_helper(buffer, count, &val); - if (rc) + if (rc != 0) + return rc; + + if (dev->od_index_in_idif) { + if (val != 0) + return count; + + LCONSOLE_WARN("%s: OST-index in IDIF has been enabled, " + "it cannot be reverted back.\n", osd_name(dev)); + return -EPERM; + } + + if (val == 0) + return count; + + rc = lu_env_init(&env, LCT_DT_THREAD); + if (rc != 0) return rc; - dev->od_lma_self_repair = !!val; + tgt = dev->od_dt_dev.dd_lu_dev.ld_site->ls_tgt; + tgt->lut_lsd.lsd_feature_rocompat |= OBD_ROCOMPAT_IDX_IN_IDIF; + rc = tgt_server_data_update(&env, tgt, 1); + lu_env_fini(&env); + if (rc < 0) + return rc; + + LCONSOLE_INFO("%s: enable OST-index in IDIF successfully, " + "it cannot be reverted back.\n", osd_name(dev)); + + dev->od_index_in_idif = 1; return count; } -LPROC_SEQ_FOPS(ldiskfs_osd_lma_self_repair); +LPROC_SEQ_FOPS(ldiskfs_osd_index_in_idif); + +int osd_register_proc_index_in_idif(struct osd_device *osd) +{ + struct proc_dir_entry *proc; + + proc = proc_create_data("index_in_idif", 0, osd->od_proc_entry, + &ldiskfs_osd_index_in_idif_fops, + &osd->od_dt_dev); + if (proc == NULL) + return -ENOMEM; + + return 0; +} +#endif LPROC_SEQ_FOPS_RO_TYPE(ldiskfs, dt_blksize); LPROC_SEQ_FOPS_RO_TYPE(ldiskfs, dt_kbytestotal); @@ -514,7 +633,7 @@ 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[] = { +struct lprocfs_vars lprocfs_osd_obd_vars[] = { { .name = "blocksize", .fops = &ldiskfs_dt_blksize_fops }, { .name = "kbytestotal", @@ -537,6 +656,10 @@ struct lprocfs_seq_vars lprocfs_osd_obd_vars[] = { .fops = &ldiskfs_osd_pdo_fops }, { .name = "auto_scrub", .fops = &ldiskfs_osd_auto_scrub_fops }, + { .name = "full_scrub_ratio", + .fops = &ldiskfs_osd_full_scrub_ratio_fops }, + { .name = "full_scrub_threshold_rate", + .fops = &ldiskfs_osd_full_scrub_threshold_rate_fops }, { .name = "oi_scrub", .fops = &ldiskfs_osd_oi_scrub_fops }, { .name = "read_cache_enable", @@ -545,15 +668,13 @@ struct lprocfs_seq_vars lprocfs_osd_obd_vars[] = { .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 } + { NULL } }; -struct lprocfs_seq_vars lprocfs_osd_module_vars[] = { +struct lprocfs_vars lprocfs_osd_module_vars[] = { { .name = "track_declares_assert", .fops = &ldiskfs_osd_track_declares_assert_fops }, - { 0 } + { NULL } }; @@ -574,9 +695,9 @@ int osd_procfs_init(struct osd_device *osd, const char *name) 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); + 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",