All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] dm-flakey target refreshed for 2.6.33
@ 2010-01-26 19:20 Josef Bacik
  2010-01-27 19:40 ` Alasdair G Kergon
  0 siblings, 1 reply; 2+ messages in thread
From: Josef Bacik @ 2010-01-26 19:20 UTC (permalink / raw)
  To: dm-devel

Hello,

I needed a dm target to do some failure testing on btrfs's raid code, and
Mike pointed me at this

http://www.kernel.org/pub/linux/kernel/people/agk/patches/2.6/editing/dm-flakey.patch

It just needed a few tweaks, all I did was

-fix the Kconfig/Makefile part so it would apply properly
-changed SECTOR_FORMAT to "%llu"
-changed DMERR to printk (for some reason DMERR was failing and I have no idea
why)
-dm_unregister_target is void now, whereas this patch had it returning an int,
so fixed that too

Then this thing worked great for me.  It probably needs to be cleaned up more,
but I'm an FS person, not a DM person :).  This (or something like it) would be
super usefull for testing btrfs's raid code, or really any sort of failure mode
with an fs without having to do crazy things like rip out cables, so if it could
be included in mainline that would be helpful.  Thanks,

Josef
---
 drivers/md/Kconfig     |    6 ++
 drivers/md/Makefile    |    1 +
 drivers/md/dm-flakey.c |  155 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 162 insertions(+), 0 deletions(-)
 create mode 100644 drivers/md/dm-flakey.c

diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig
index acb3a4e..0ae5420 100644
--- a/drivers/md/Kconfig
+++ b/drivers/md/Kconfig
@@ -319,4 +319,10 @@ config DM_UEVENT
 	---help---
 	Generate udev events for DM events.
 
+config DM_FLAKEY
+       tristate "Flakey target (EXPERIMENTAL)"
+       depends on BLK_DEV_DM && EXPERIMENTAL
+       ---help---
+         A debug only target that intermittently fails io.
+
 endif # MD
diff --git a/drivers/md/Makefile b/drivers/md/Makefile
index e355e7f..1d2a975 100644
--- a/drivers/md/Makefile
+++ b/drivers/md/Makefile
@@ -37,6 +37,7 @@ obj-$(CONFIG_BLK_DEV_MD)	+= md-mod.o
 obj-$(CONFIG_BLK_DEV_DM)	+= dm-mod.o
 obj-$(CONFIG_DM_CRYPT)		+= dm-crypt.o
 obj-$(CONFIG_DM_DELAY)		+= dm-delay.o
+obj-$(CONFIG_DM_FLAKEY)		+= dm-flakey.o
 obj-$(CONFIG_DM_MULTIPATH)	+= dm-multipath.o dm-round-robin.o
 obj-$(CONFIG_DM_MULTIPATH_QL)	+= dm-queue-length.o
 obj-$(CONFIG_DM_MULTIPATH_ST)	+= dm-service-time.o
diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c
new file mode 100644
index 0000000..16d3704
--- /dev/null
+++ b/drivers/md/dm-flakey.c
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2003 Sistina Software (UK) Limited.
+ * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
+ *
+ * This file is released under the GPL.
+ */
+
+#include "dm.h"
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/blkdev.h>
+#include <linux/bio.h>
+#include <linux/slab.h>
+
+typedef typeof(jiffies) jiffy_t;
+
+/*
+ * Flakey: Used for testing only, simulates intermittent,
+ * catastrophic device failure.
+ */
+struct flakey {
+	struct dm_dev *dev;
+	jiffy_t start_time;
+	sector_t start;
+	unsigned up_interval;
+	unsigned down_interval;
+};
+
+/*
+ * Construct a flakey mapping: <dev_path> <offset> <up interval> <down interval>
+ */
+static int flakey_ctr(struct dm_target *ti, unsigned int argc, char **argv)
+{
+	struct flakey *f;
+
+	if (argc != 4) {
+		ti->error = "dm-flakey: Invalid argument count";
+		return -EINVAL;
+	}
+
+	f = kmalloc(sizeof(*f), GFP_KERNEL);
+	if (!f) {
+		ti->error = "dm-flakey: Cannot allocate linear context";
+		return -ENOMEM;
+	}
+	f->start_time = jiffies;
+
+	if (sscanf(argv[1], "%llu", &f->start) != 1) {
+		ti->error = "dm-flakey: Invalid device sector";
+		goto bad;
+	}
+
+	if (sscanf(argv[2], "%u", &f->up_interval) != 1) {
+		ti->error = "dm-flakey: Invalid up interval";
+		goto bad;
+	}
+
+	if (sscanf(argv[3], "%u", &f->down_interval) != 1) {
+		ti->error = "dm-flakey: Invalid down interval";
+		goto bad;
+	}
+
+	if (dm_get_device(ti, argv[0], f->start, ti->len,
+			  dm_table_get_mode(ti->table), &f->dev)) {
+		ti->error = "dm-flakey: Device lookup failed";
+		goto bad;
+	}
+
+	ti->private = f;
+	return 0;
+
+ bad:
+	kfree(f);
+	return -EINVAL;
+}
+
+static void flakey_dtr(struct dm_target *ti)
+{
+	struct flakey *f = (struct flakey *) ti->private;
+
+	dm_put_device(ti, f->dev);
+	kfree(f);
+}
+
+static int flakey_map(struct dm_target *ti, struct bio *bio,
+		      union map_info *map_context)
+{
+	struct flakey *f = (struct flakey *) ti->private;
+	unsigned elapsed;
+
+	/* are we alive ? */
+	elapsed = (jiffies - f->start_time) / HZ;
+	elapsed %= (f->up_interval + f->down_interval);
+	if (elapsed >= f->up_interval)
+		return -EIO;
+
+	else {
+		bio->bi_bdev = f->dev->bdev;
+		bio->bi_sector = f->start + (bio->bi_sector - ti->begin);
+	}
+
+	return 1;
+}
+
+static int flakey_status(struct dm_target *ti, status_type_t type,
+			 char *result, unsigned int maxlen)
+{
+	struct flakey *f = (struct flakey *) ti->private;
+
+	switch (type) {
+	case STATUSTYPE_INFO:
+		result[0] = '\0';
+		break;
+
+	case STATUSTYPE_TABLE:
+		snprintf(result, maxlen, "%s %llu", f->dev->name,
+			 f->start);
+		break;
+	}
+	return 0;
+}
+
+static struct target_type flakey_target = {
+	.name   = "flakey",
+	.version= {1, 0, 1},
+	.module = THIS_MODULE,
+	.ctr    = flakey_ctr,
+	.dtr    = flakey_dtr,
+	.map    = flakey_map,
+	.status = flakey_status,
+};
+
+int __init dm_flakey_init(void)
+{
+	int r = dm_register_target(&flakey_target);
+
+	if (r < 0)
+		printk(KERN_ERR "flakey: register failed %d", r);
+
+	return r;
+}
+
+void __exit dm_flakey_exit(void)
+{
+	dm_unregister_target(&flakey_target);
+}
+
+/* Module hooks */
+module_init(dm_flakey_init);
+module_exit(dm_flakey_exit);
+
+MODULE_DESCRIPTION(DM_NAME " flakey target");
+MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
+MODULE_LICENSE("GPL");
-- 
1.5.4.3

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] dm-flakey target refreshed for 2.6.33
  2010-01-26 19:20 [PATCH] dm-flakey target refreshed for 2.6.33 Josef Bacik
@ 2010-01-27 19:40 ` Alasdair G Kergon
  0 siblings, 0 replies; 2+ messages in thread
From: Alasdair G Kergon @ 2010-01-27 19:40 UTC (permalink / raw)
  To: Josef Bacik, dm-devel

On Tue, Jan 26, 2010 at 02:20:51PM -0500, Josef Bacik wrote:
> -changed SECTOR_FORMAT to "%llu"

We also cast the parameter to 'unsigned long long' to match when displaying
sectors.

> -changed DMERR to printk (for some reason DMERR was failing and I have no idea

We moved the target name ('flakey: ') inside the macro instead of having to
write it in every message - so it needed #define DM_MSG_PREFIX.

I've made these changes and they'll appear at
http://www.kernel.org/pub/linux/kernel/people/agk/patches/2.6/editing/
next time I sync up.

> with an fs without having to do crazy things like rip out cables, so if it could
> be included in mainline that would be helpful.  Thanks,
 
Well the main thing I'm missing is a Documentation file and a patch header.
This shouldn't be hard to write - any volunteers?  Kconfig should get a few
more words too.

It still needs a review for adherence to the latest dm standards, but that should
be really quick, given how small it is.

Alasdair

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-01-27 19:40 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-01-26 19:20 [PATCH] dm-flakey target refreshed for 2.6.33 Josef Bacik
2010-01-27 19:40 ` Alasdair G Kergon

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.