+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;
+
+ seq_printf(m, "%llu\n", dev->od_full_scrub_ratio);
+ return 0;
+}
+
+static ssize_t
+ldiskfs_osd_full_scrub_ratio_seq_write(struct file *file,
+ const char __user *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 rc;
+ __s64 val;
+
+ LASSERT(dev != NULL);
+ if (unlikely(dev->od_mnt == NULL))
+ return -EINPROGRESS;
+
+ rc = lprocfs_str_to_s64(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;
+
+ seq_printf(m, "%llu (bad OI mappings/minute)\n",
+ dev->od_full_scrub_threshold_rate);
+ return 0;
+}
+
+static ssize_t
+ldiskfs_osd_full_scrub_threshold_rate_seq_write(struct file *file,
+ const char __user *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 rc;
+ __s64 val;
+
+ LASSERT(dev != NULL);
+ if (unlikely(dev->od_mnt == NULL))
+ return -EINPROGRESS;
+
+ rc = lprocfs_str_to_s64(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);
+