Re: [RFC PATCH] ceph: add a "client_shutdown" fault-injection file to debugfs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 10/27/21 8:31 PM, Jeff Layton wrote:
Writing a non-zero value to this file will trigger spurious shutdown of
the client, simulating the effect of receiving a bad mdsmap or fsmap.

Note that this effect cannot be reversed. The only remedy is to unmount.

Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
---
  fs/ceph/debugfs.c | 28 ++++++++++++++++++++++++++++
  fs/ceph/super.h   |  1 +
  2 files changed, 29 insertions(+)

I used this patch to do some fault injection testing before I proposed
the patch recently to shut down the mount on receipt of a bad fsmap or
mdsmap.

Is this something we should consider for mainline kernels?

We could put it behind a new Kconfig option if we're worried about
footguns in production kernels. Maybe we could call the new file
"fault_inject", and allow writing a mask value to it? We could roll
tests for teuthology that use this too.

How about adding one mount option to enable this ? And disable it as default.


There are a lot of possibilities.

diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index 55426514491b..57a72f267f6e 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -401,11 +401,32 @@ DEFINE_SIMPLE_ATTRIBUTE(congestion_kb_fops, congestion_kb_get,
  			congestion_kb_set, "%llu\n");
+static int client_shutdown_set(void *data, u64 val)
+{
+	struct ceph_fs_client *fsc = (struct ceph_fs_client *)data;
+
+	if (val)
+		ceph_umount_begin(fsc->sb);
+	return 0;
+}
+
+static int client_shutdown_get(void *data, u64 *val)
+{
+	struct ceph_fs_client *fsc = (struct ceph_fs_client *)data;
+
+	*val = (u64)(fsc->mount_state == CEPH_MOUNT_SHUTDOWN);
+	return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(client_shutdown_fops, client_shutdown_get,
+			client_shutdown_set, "%llu\n");
+
  void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
  {
  	dout("ceph_fs_debugfs_cleanup\n");
  	debugfs_remove(fsc->debugfs_bdi);
  	debugfs_remove(fsc->debugfs_congestion_kb);
+	debugfs_remove(fsc->debugfs_client_shutdown);
  	debugfs_remove(fsc->debugfs_mdsmap);
  	debugfs_remove(fsc->debugfs_mds_sessions);
  	debugfs_remove(fsc->debugfs_caps);
@@ -426,6 +447,13 @@ void ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
  				    fsc,
  				    &congestion_kb_fops);
+ fsc->debugfs_client_shutdown =
+		debugfs_create_file("client_shutdown",
+				    0600,
+				    fsc->client->debugfs_dir,
+				    fsc,
+				    &client_shutdown_fops);
+
  	snprintf(name, sizeof(name), "../../bdi/%s",
  		 bdi_dev_name(fsc->sb->s_bdi));
  	fsc->debugfs_bdi =
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index ed51e04739c4..e5d0ad5c6135 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -135,6 +135,7 @@ struct ceph_fs_client {
  	struct dentry *debugfs_status;
  	struct dentry *debugfs_mds_sessions;
  	struct dentry *debugfs_metrics_dir;
+	struct dentry *debugfs_client_shutdown;
  #endif
#ifdef CONFIG_CEPH_FSCACHE




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux