+
+ n = snprintf(page, count, "status: ");
+ page += n; len += n; count -= n;
+ if (obd->obd_max_recoverable_clients == 0) {
+ n = snprintf(page, count, "INACTIVE\n");
+ return len + n;
+ }
+
+ if (obd->obd_recoverable_clients == 0) {
+ n = snprintf(page, count, "COMPLETE\n");
+ page += n; len += n; count -= n;
+ n = snprintf(page, count, "recovered_clients: %d\n",
+ max_recoverable);
+ page += n; len += n; count -= n;
+ n = snprintf(page, count, "last_transno: "LPD64"\n",
+ next_transno - 1);
+ page += n; len += n; count -= n;
+ n = snprintf(page, count, "replayed_requests: %d\n", replayed);
+ return len + n;
+ }
+
+ /* sampled unlocked, but really... */
+ if (obd->obd_recovering == 0) {
+ n = snprintf(page, count, "ABORTED\n");
+ return len + n;
+ }
+
+ n = snprintf(page, count, "RECOVERING\n");
+ page += n; len += n; count -= n;
+ n = snprintf(page, count, "connected_clients: %d/%d\n",
+ connected, max_recoverable);
+ page += n; len += n; count -= n;
+ n = snprintf(page, count, "completed_clients: %d/%d\n",
+ completed, max_recoverable);
+ page += n; len += n; count -= n;
+ n = snprintf(page, count, "replayed_requests: %d/??\n", replayed);
+ page += n; len += n; count -= n;
+ n = snprintf(page, count, "queued_requests: %d\n", queue_len);
+ page += n; len += n; count -= n;
+ n = snprintf(page, count, "next_transno: "LPD64"\n", next_transno);
+ return len + n;
+}
+
+static int lprocfs_mds_wr_evict_client(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ struct obd_device *obd = data;
+ struct obd_export *doomed_exp = NULL;
+ struct obd_uuid doomed;
+ struct list_head *p;
+ char tmpbuf[sizeof(doomed)];
+
+ sscanf(buffer, "%40s", tmpbuf);
+ obd_str2uuid(&doomed, tmpbuf);
+
+ spin_lock(&obd->obd_dev_lock);
+ list_for_each(p, &obd->obd_exports) {
+ doomed_exp = list_entry(p, struct obd_export, exp_obd_chain);
+ if (obd_uuid_equals(&doomed, &doomed_exp->exp_client_uuid)) {
+ class_export_get(doomed_exp);
+ break;
+ }
+ doomed_exp = NULL;
+ }
+ spin_unlock(&obd->obd_dev_lock);
+
+ if (doomed_exp == NULL) {
+ CERROR("can't disconnect %s: no export found\n",
+ doomed.uuid);
+ } else {
+ CERROR("evicting %s at adminstrative request\n",
+ doomed.uuid);
+ ptlrpc_fail_export(doomed_exp);
+ class_export_put(doomed_exp);
+ }
+ return count;