RAID1 ramdisk patch

From: Wilco Baan Hofman
Date: Sun Sep 04 2005 - 19:49:57 EST


Hi all,

I have written a small patch for use with a HDD-backed ramdisk in the md raid1 driver. The raid1 driver usually does read balancing on the disks, but I feel that if it encounters a single ram disk in the array that should be the preferred read disk. The application of this would be for example a 2GB ram disk in raid1 with a 2GB partition, where the ram disk is used for reading and both 'disks' used for writing.

Attached is a bit of code which checks for a ram-disk and sets it as preferred disk. It also checks if the ram disk is in sync before allowing the read.

PS. I am not this list, please CC me if a reply were to be made.

Regards,

Wilco Baan Hofman diff -urN linux-2.6.13-rc6.orig/include/linux/raid/raid1.h linux-2.6.13-rc6/include/linux/raid/raid1.h
--- linux-2.6.13-rc6.orig/include/linux/raid/raid1.h 2005-08-07 20:18:56.000000000 +0200
+++ linux-2.6.13-rc6/include/linux/raid/raid1.h 2005-09-04 11:41:24.000000000 +0200
@@ -32,6 +32,7 @@
int raid_disks;
int working_disks;
int last_used;
+ int preferred_read_disk;
sector_t next_seq_sect;
spinlock_t device_lock;
diff -urN linux-2.6.13-rc6.orig/drivers/md/raid1.c linux-2.6.13-rc6/drivers/md/raid1.c
--- linux-2.6.13-rc6.orig/drivers/md/raid1.c 2005-08-07 20:18:56.000000000 +0200
+++ linux-2.6.13-rc6/drivers/md/raid1.c 2005-09-05 01:54:26.000000000 +0200
@@ -21,6 +21,8 @@
* Additions to bitmap code, (C) 2003-2004 Paul Clements, SteelEye Technology:
* - persistent bitmap code
*
+ * Special handling of ramdisk (C) 2005 Wilco Baan Hofman <wilco@xxxxxxxxxxxxx>
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
@@ -399,8 +401,6 @@
goto rb_out;
}
}
- disk = new_disk;
- /* now disk == new_disk == starting point for search */

/*
* Don't change to another disk for sequential reads:
@@ -409,7 +409,18 @@
goto rb_out;
if (this_sector == conf->mirrors[new_disk].head_position)
goto rb_out;
-
+
+ /* [SYN] If the preferred disk exists, return it */
+ if (conf->preferred_read_disk != -1 &&
+ (new_rdev=conf->mirrors[conf->preferred_read_disk].rdev) != NULL &&
+ new_rdev->in_sync) {
+ new_disk = conf->preferred_read_disk;
+ goto rb_out;
+ }
+
+ disk = new_disk;
+ /* now disk == new_disk == starting point for search */
+
current_distance = abs(this_sector - conf->mirrors[disk].head_position);

/* Find the disk whose head is closest */
@@ -1292,10 +1303,11 @@
static int run(mddev_t *mddev)
{
conf_t *conf;
- int i, j, disk_idx;
+ int i, j, disk_idx, ram_count;
mirror_info_t *disk;
mdk_rdev_t *rdev;
struct list_head *tmp;
+ char b[BDEVNAME_SIZE];

if (mddev->level != 1) {
printk("raid1: %s: raid level not set to mirroring (%d)\n",
@@ -1417,6 +1429,30 @@
mddev->queue->unplug_fn = raid1_unplug;
mddev->queue->issue_flush_fn = raid1_issue_flush;

+ /* [SYN] if there is a ram disk, that will be the preferred disk.
+ * .. unless there are multiple ram disks. */
+ conf->preferred_read_disk = -1;
+ for (i = 0,
+ ram_count = 0;
+ i < mddev->raid_disks;
+ i++) {
+
+ bdevname(conf->mirrors[i].rdev->bdev, b);
+ if (strncmp(b, "ram", 3) == 0) {
+ if (ram_count) {
+ conf->preferred_read_disk = -1;
+ break;
+ }
+ conf->preferred_read_disk = i;
+ ram_count++;
+ }
+ }
+ if (conf->preferred_read_disk >= 0) {
+ printk(KERN_INFO
+ "raid1: One ram disk (%s) found, setting it preferred read disk.\n", b);
+ }
+
+
return 0;

out_no_mem: