+#ifdef HAVE_SERVER_SUPPORT
+int lprocfs_hash_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *obd = m->private;
+ int c = 0;
+
+ if (obd == NULL)
+ return 0;
+
+ c += cfs_hash_debug_header_seq(m);
+ c += cfs_hash_debug_str_seq(obd->obd_uuid_hash, m);
+ c += cfs_hash_debug_str_seq(obd->obd_nid_hash, m);
+ c += cfs_hash_debug_str_seq(obd->obd_nid_stats_hash, m);
+ return c;
+}
+EXPORT_SYMBOL(lprocfs_hash_seq_show);
+
+int lprocfs_recovery_status_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *obd = m->private;
+
+ LASSERT(obd != NULL);
+
+ seq_printf(m, "status: ");
+ if (obd->obd_max_recoverable_clients == 0) {
+ seq_printf(m, "INACTIVE\n");
+ goto out;
+ }
+
+ /* sampled unlocked, but really... */
+ if (obd->obd_recovering == 0) {
+ seq_printf(m, "COMPLETE\n");
+ seq_printf(m, "recovery_start: %lu\n", obd->obd_recovery_start);
+ seq_printf(m, "recovery_duration: %lu\n",
+ obd->obd_recovery_end - obd->obd_recovery_start);
+ /* Number of clients that have completed recovery */
+ seq_printf(m, "completed_clients: %d/%d\n",
+ obd->obd_max_recoverable_clients -
+ obd->obd_stale_clients,
+ obd->obd_max_recoverable_clients);
+ seq_printf(m, "replayed_requests: %d\n",
+ obd->obd_replayed_requests);
+ seq_printf(m, "last_transno: "LPD64"\n",
+ obd->obd_next_recovery_transno - 1);
+ seq_printf(m, "VBR: %s\n", obd->obd_version_recov ?
+ "ENABLED" : "DISABLED");
+ seq_printf(m, "IR: %s\n", obd->obd_no_ir ?
+ "DISABLED" : "ENABLED");
+ goto out;
+ }
+
+ seq_printf(m, "RECOVERING\n");
+ seq_printf(m, "recovery_start: %lu\n", obd->obd_recovery_start);
+ seq_printf(m, "time_remaining: %lu\n",
+ cfs_time_current_sec() >=
+ obd->obd_recovery_start +
+ obd->obd_recovery_timeout ? 0 :
+ obd->obd_recovery_start +
+ obd->obd_recovery_timeout -
+ cfs_time_current_sec());
+ seq_printf(m, "connected_clients: %d/%d\n",
+ atomic_read(&obd->obd_connected_clients),
+ obd->obd_max_recoverable_clients);
+ /* Number of clients that have completed recovery */
+ seq_printf(m, "req_replay_clients: %d\n",
+ atomic_read(&obd->obd_req_replay_clients));
+ seq_printf(m, "lock_repay_clients: %d\n",
+ atomic_read(&obd->obd_lock_replay_clients));
+ seq_printf(m, "completed_clients: %d\n",
+ atomic_read(&obd->obd_connected_clients) -
+ atomic_read(&obd->obd_lock_replay_clients));
+ seq_printf(m, "evicted_clients: %d\n", obd->obd_stale_clients);
+ seq_printf(m, "replayed_requests: %d\n", obd->obd_replayed_requests);
+ seq_printf(m, "queued_requests: %d\n",
+ obd->obd_requests_queued_for_recovery);
+ seq_printf(m, "next_transno: "LPD64"\n",
+ obd->obd_next_recovery_transno);
+out:
+ return 0;
+}
+EXPORT_SYMBOL(lprocfs_recovery_status_seq_show);
+
+int lprocfs_ir_factor_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *obd = m->private;
+
+ LASSERT(obd != NULL);
+ return seq_printf(m, "%d\n", obd->obd_recovery_ir_factor);
+}
+EXPORT_SYMBOL(lprocfs_ir_factor_seq_show);
+
+ssize_t
+lprocfs_ir_factor_seq_write(struct file *file, const char *buffer,
+ size_t count, loff_t *off)
+{
+ struct obd_device *obd = ((struct seq_file *)file->private_data)->private;
+ int val, rc;
+
+ LASSERT(obd != NULL);
+ rc = lprocfs_write_helper(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ if (val < OBD_IR_FACTOR_MIN || val > OBD_IR_FACTOR_MAX)
+ return -EINVAL;
+
+ obd->obd_recovery_ir_factor = val;
+ return count;
+}
+EXPORT_SYMBOL(lprocfs_ir_factor_seq_write);
+
+int lprocfs_recovery_time_soft_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *obd = m->private;
+
+ LASSERT(obd != NULL);
+ return seq_printf(m, "%d\n", obd->obd_recovery_timeout);
+}
+EXPORT_SYMBOL(lprocfs_recovery_time_soft_seq_show);
+
+ssize_t
+lprocfs_recovery_time_soft_seq_write(struct file *file, const char *buffer,
+ size_t count, loff_t *off)
+{
+ struct obd_device *obd = ((struct seq_file *)file->private_data)->private;
+ int val, rc;
+
+ LASSERT(obd != NULL);
+ rc = lprocfs_write_helper(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ obd->obd_recovery_timeout = val;
+ return count;
+}
+EXPORT_SYMBOL(lprocfs_recovery_time_soft_seq_write);
+
+int lprocfs_recovery_time_hard_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *obd = m->private;
+
+ LASSERT(obd != NULL);
+ return seq_printf(m, "%u\n", obd->obd_recovery_time_hard);
+}
+EXPORT_SYMBOL(lprocfs_recovery_time_hard_seq_show);
+
+ssize_t
+lprocfs_recovery_time_hard_seq_write(struct file *file, const char *buffer,
+ size_t count, loff_t *off)
+{
+ struct obd_device *obd = ((struct seq_file *)file->private_data)->private;
+ int val, rc;
+
+ LASSERT(obd != NULL);
+ rc = lprocfs_write_helper(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ obd->obd_recovery_time_hard = val;
+ return count;
+}
+EXPORT_SYMBOL(lprocfs_recovery_time_hard_seq_write);
+
+int lprocfs_target_instance_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *obd = m->private;
+ struct obd_device_target *target = &obd->u.obt;
+
+ LASSERT(obd != NULL);
+ LASSERT(target->obt_magic == OBT_MAGIC);
+ return seq_printf(m, "%u\n", obd->u.obt.obt_instance);
+}
+EXPORT_SYMBOL(lprocfs_target_instance_seq_show);
+
+#ifndef HAVE_ONLY_PROCFS_SEQ