- struct mdd_device *mdd = (struct mdd_device *)data;
- char kernbuf[32];
- char *end;
- int rc;
-
- if (count > (sizeof(kernbuf) - 1))
- goto out_usage;
-
- count = min_t(unsigned long, count, sizeof(kernbuf));
- if (copy_from_user(kernbuf, buffer, count))
- return -EFAULT;
-
- kernbuf[count] = '\0';
- /* strip trailing newline from "echo blah" */
- if (kernbuf[count - 1] == '\n')
- kernbuf[count - 1] = '\0';
-
- /* Forced on/off/purge rec, independent of changelog users! */
- if (strcmp(kernbuf, "on") == 0) {
- rc = mdd_changelog_on(mdd, 1);
- } else if (strcmp(kernbuf, "off") == 0) {
- rc = mdd_changelog_on(mdd, 0);
- } else {
- /* purge to an index */
- long long unsigned endrec;
-
- endrec = (long long)simple_strtoull(kernbuf, &end, 0);
- if (end == kernbuf)
- goto out_usage;
-
- LCONSOLE_INFO("changelog purge to %llu\n", endrec);
-
- rc = mdd_changelog_llog_cancel(mdd, endrec);
- }
-
- if (rc < 0)
- return rc;
- return count;
-
-out_usage:
- CWARN("changelog write usage: [on|off] | <purge_idx (0=all)>\n");
- return -EINVAL;
-}
-
-static ssize_t mdd_changelog_seq_write(struct file *file, const char *buffer,
- size_t count, loff_t *off)
-{
- struct seq_file *seq = file->private_data;
- struct changelog_seq_iter *csi = seq->private;
- struct mdd_device *mdd = (struct mdd_device *)csi->csi_dev;
-
- return mdd_changelog_write(file, buffer, count, mdd);
-}
-
-static int mdd_changelog_done(struct changelog_seq_iter *csi)
-{
- struct mdd_device *mdd = (struct mdd_device *)csi->csi_dev;
- int done = 0;