This file is indexed.

/usr/src/kernel-patches/lustre/patches/md-rebuild-policy.patch is in linux-patch-lustre 1.8.5+dfsg-3ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Index: linux-2.6.18-128.1.14/drivers/md/md.c
===================================================================
--- linux-2.6.18-128.1.14.orig/drivers/md/md.c	2009-06-19 12:33:11.000000000 -0600
+++ linux-2.6.18-128.1.14/drivers/md/md.c	2009-06-19 12:35:02.000000000 -0600
@@ -90,6 +90,8 @@
 
 static int sysctl_speed_limit_min = 1000;
 static int sysctl_speed_limit_max = 200000;
+static int sysctl_rebuild_window_size = 256;
+static int sysctl_disk_idle_size = 4096;
 static inline int speed_min(mddev_t *mddev)
 {
 	return mddev->sync_speed_min ?
@@ -121,6 +123,22 @@
 		.mode		= S_IRUGO|S_IWUSR,
 		.proc_handler	= &proc_dointvec,
 	},
+	{
+		.ctl_name	= DEV_RAID_REBUILD_WINDOW,
+		.procname	= "rebuild_window_size",
+		.data		= &sysctl_rebuild_window_size,
+		.maxlen		= sizeof(int),
+		.mode		= S_IRUGO|S_IWUSR,
+		.proc_handler	= &proc_dointvec,
+	},
+	{
+		.ctl_name	= DEV_RAID_DISK_IDLE_SIZE,
+		.procname	= "disk_idle_size",
+		.data		= &sysctl_disk_idle_size,
+		.maxlen		= sizeof(int),
+		.mode		= S_IRUGO|S_IWUSR,
+		.proc_handler	= &proc_dointvec,
+	},
 	{ .ctl_name = 0 }
 };
 
@@ -5009,15 +5027,16 @@
 {
 	mdk_rdev_t * rdev;
 	int idle;
-	unsigned long curr_events;
+	unsigned long rw, sync;
 
 	idle = 1;
 	rcu_read_lock();
 	rdev_for_each_rcu(rdev, mddev) {
 		struct gendisk *disk = rdev->bdev->bd_contains->bd_disk;
-		curr_events = disk_stat_read(disk, sectors[0]) + 
-				disk_stat_read(disk, sectors[1]) - 
-				atomic_read(&disk->sync_io);
+
+		rw = disk_stat_read(disk, sectors[READ])+disk_stat_read(disk, sectors[WRITE]);
+		sync = atomic_read(&disk->sync_io);
+
 		/* The difference between curr_events and last_events
 		 * will be affected by any new non-sync IO (making
 		 * curr_events bigger) and any difference in the amount of
@@ -5031,9 +5050,9 @@
 		 *
 		 * Note: the following is an unsigned comparison.
 		 */
-		if ((curr_events - rdev->last_events + 4096) > 8192) {
-			rdev->last_events = curr_events;
+		if (rw - rdev->last_events > sync + sysctl_disk_idle_size) {
 			idle = 0;
+			rdev->last_events = rw - sync;
 		}
 	}
 	rcu_read_unlock();
@@ -5100,8 +5119,7 @@
 void md_do_sync(mddev_t *mddev)
 {
 	mddev_t *mddev2;
-	unsigned int currspeed = 0,
-		 window;
+	unsigned int currspeed = 0;
 	sector_t max_sectors,j, io_sectors;
 	unsigned long mark[SYNC_MARKS];
 	sector_t mark_cnt[SYNC_MARKS];
@@ -5221,9 +5239,8 @@
 	/*
 	 * Tune reconstruction:
 	 */
-	window = 32*(PAGE_SIZE/512);
 	printk(KERN_INFO "md: using %dk window, over a total of %llu blocks.\n",
-		window/2,(unsigned long long) max_sectors/2);
+		sysctl_rebuild_window_size/2,(unsigned long long) max_sectors/2);
 
 	atomic_set(&mddev->recovery_active, 0);
 	init_waitqueue_head(&mddev->recovery_wait);
@@ -5261,7 +5278,7 @@
 			 */
 			md_new_event(mddev);
 
-		if (last_check + window > io_sectors || j == max_sectors)
+		if (last_check + sysctl_rebuild_window_size > io_sectors || j == max_sectors)
 			continue;
 
 		last_check = io_sectors;
@@ -5282,7 +5299,6 @@
 			last_mark = next;
 		}
 
-
 		if (kthread_should_stop()) {
 			/*
 			 * got a signal, exit.
@@ -5306,10 +5322,16 @@
 
 		currspeed = ((unsigned long)(io_sectors-mddev->resync_mark_cnt))/2
 			/((jiffies-mddev->resync_mark)/HZ +1) +1;
-
 		if (currspeed > speed_min(mddev)) {
 			if ((currspeed > speed_max(mddev)) ||
 					!is_mddev_idle(mddev)) {
+				static unsigned long next_report;
+				if (time_after(jiffies, next_report)) {
+					printk(KERN_INFO "md: rebuild %s throttled due to IO\n",
+						mdname(mddev));
+					/* once per 10 minutes */
+					next_report = jiffies + 600 * HZ;
+				}
 				msleep(500);
 				goto repeat;
 			}
Index: linux-2.6.18-128.1.14/include/linux/sysctl.h
===================================================================
--- linux-2.6.18-128.1.14.orig/include/linux/sysctl.h	2009-06-19 12:33:11.000000000 -0600
+++ linux-2.6.18-128.1.14/include/linux/sysctl.h	2009-06-19 12:35:02.000000000 -0600
@@ -928,7 +928,9 @@
 /* /proc/sys/dev/raid */
 enum {
 	DEV_RAID_SPEED_LIMIT_MIN=1,
-	DEV_RAID_SPEED_LIMIT_MAX=2
+	DEV_RAID_SPEED_LIMIT_MAX=2,
+	DEV_RAID_REBUILD_WINDOW=3,
+	DEV_RAID_DISK_IDLE_SIZE=4
 };
 
 /* /proc/sys/dev/parport/default */