1 diff -pru linux-2.6.18-53.orig/drivers/md/raid5.c linux-2.6.18-53/drivers/md/raid5.c
2 --- linux-2.6.18-53.orig/drivers/md/raid5.c 2007-12-06 17:15:22.000000000 +0800
3 +++ linux-2.6.18-53/drivers/md/raid5.c 2007-12-06 17:17:30.000000000 +0800
4 @@ -115,10 +115,12 @@ static void __release_stripe(raid5_conf_
5 if (test_bit(STRIPE_DELAYED, &sh->state)) {
6 list_add_tail(&sh->lru, &conf->delayed_list);
7 blk_plug_device(conf->mddev->queue);
8 + atomic_inc(&conf->delayed);
9 } else if (test_bit(STRIPE_BIT_DELAY, &sh->state) &&
10 sh->bm_seq - conf->seq_write > 0) {
11 list_add_tail(&sh->lru, &conf->bitmap_list);
12 blk_plug_device(conf->mddev->queue);
13 + atomic_inc(&conf->bit_delayed);
15 clear_bit(STRIPE_BIT_DELAY, &sh->state);
16 list_add_tail(&sh->lru, &conf->handle_list);
17 @@ -289,6 +291,7 @@ static struct stripe_head *get_active_st
18 if (noblock && sh == NULL)
21 + atomic_inc(&conf->out_of_stripes);
22 conf->inactive_blocked = 1;
23 wait_event_lock_irq(conf->wait_for_stripe,
24 !list_empty(&conf->inactive_list) &&
25 @@ -311,6 +314,10 @@ static struct stripe_head *get_active_st
26 !test_bit(STRIPE_EXPANDING, &sh->state))
28 list_del_init(&sh->lru);
29 + if (test_bit(STRIPE_DELAYED, &sh->state))
30 + atomic_dec(&conf->delayed);
31 + if (test_bit(STRIPE_BIT_DELAY, &sh->state))
32 + atomic_dec(&conf->bit_delayed);
36 @@ -529,6 +536,8 @@ static int raid5_end_read_request(struct
40 + atomic_dec(&conf->out_reqs_in_queue);
42 for (i=0 ; i<disks; i++)
43 if (bi == &sh->dev[i].req)
45 @@ -642,6 +651,8 @@ static int raid5_end_write_request (stru
49 + atomic_dec(&conf->out_reqs_in_queue);
51 for (i=0 ; i<disks; i++)
52 if (bi == &sh->dev[i].req)
54 @@ -1402,6 +1413,8 @@ static void handle_stripe5(struct stripe
55 clear_bit(STRIPE_HANDLE, &sh->state);
56 clear_bit(STRIPE_DELAYED, &sh->state);
58 + atomic_inc(&conf->handle_called);
60 syncing = test_bit(STRIPE_SYNCING, &sh->state);
61 expanding = test_bit(STRIPE_EXPAND_SOURCE, &sh->state);
62 expanded = test_bit(STRIPE_EXPAND_READY, &sh->state);
63 @@ -1684,6 +1697,7 @@ static void handle_stripe5(struct stripe
64 set_bit(R5_LOCKED, &dev->flags);
65 set_bit(R5_Wantread, &dev->flags);
67 + atomic_inc(&conf->reads_for_rmw);
69 set_bit(STRIPE_DELAYED, &sh->state);
70 set_bit(STRIPE_HANDLE, &sh->state);
71 @@ -1703,6 +1717,7 @@ static void handle_stripe5(struct stripe
72 set_bit(R5_LOCKED, &dev->flags);
73 set_bit(R5_Wantread, &dev->flags);
75 + atomic_inc(&conf->reads_for_rcw);
77 set_bit(STRIPE_DELAYED, &sh->state);
78 set_bit(STRIPE_HANDLE, &sh->state);
79 @@ -1870,6 +1885,7 @@ static void handle_stripe5(struct stripe
82 bi->bi_end_io(bi, bytes, 0);
83 + atomic_dec(&conf->in_reqs_in_queue);
85 for (i=disks; i-- ;) {
87 @@ -1885,10 +1901,13 @@ static void handle_stripe5(struct stripe
93 + atomic_inc(&conf->writes_out);
94 bi->bi_end_io = raid5_end_write_request;
97 + atomic_inc(&conf->reads_out);
98 bi->bi_end_io = raid5_end_read_request;
102 rdev = rcu_dereference(conf->disks[i].rdev);
103 @@ -1919,6 +1938,7 @@ static void handle_stripe5(struct stripe
105 test_bit(R5_ReWrite, &sh->dev[i].flags))
106 atomic_add(STRIPE_SECTORS, &rdev->corrected_errors);
107 + atomic_inc(&conf->out_reqs_in_queue);
108 generic_make_request(bi);
111 @@ -1955,6 +1975,8 @@ static void handle_stripe6(struct stripe
112 clear_bit(STRIPE_HANDLE, &sh->state);
113 clear_bit(STRIPE_DELAYED, &sh->state);
115 + atomic_inc(&conf->handle_called);
117 syncing = test_bit(STRIPE_SYNCING, &sh->state);
118 /* Now to look around and see what can be done */
120 @@ -2255,6 +2277,7 @@ static void handle_stripe6(struct stripe
121 set_bit(R5_LOCKED, &dev->flags);
122 set_bit(R5_Wantread, &dev->flags);
124 + atomic_inc(&conf->reads_for_rcw);
126 PRINTK("Request delayed stripe %llu block %d for Reconstruct\n",
127 (unsigned long long)sh->sector, i);
128 @@ -2423,6 +2446,7 @@ static void handle_stripe6(struct stripe
131 bi->bi_end_io(bi, bytes, 0);
132 + atomic_dec(&conf->in_reqs_in_queue);
134 for (i=disks; i-- ;) {
136 @@ -2438,10 +2462,13 @@ static void handle_stripe6(struct stripe
137 bi = &sh->dev[i].req;
142 + atomic_inc(&conf->writes_out);
143 bi->bi_end_io = raid5_end_write_request;
146 + atomic_inc(&conf->reads_out);
147 bi->bi_end_io = raid5_end_read_request;
151 rdev = rcu_dereference(conf->disks[i].rdev);
152 @@ -2473,6 +2500,7 @@ static void handle_stripe6(struct stripe
153 test_bit(R5_ReWrite, &sh->dev[i].flags))
154 atomic_add(STRIPE_SECTORS, &rdev->corrected_errors);
155 generic_make_request(bi);
156 + atomic_inc(&conf->out_reqs_in_queue);
159 set_bit(STRIPE_DEGRADED, &sh->state);
160 @@ -2506,6 +2534,7 @@ static void raid5_activate_delayed(raid5
161 if (!test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
162 atomic_inc(&conf->preread_active_stripes);
163 list_add_tail(&sh->lru, &conf->handle_list);
164 + atomic_dec(&conf->delayed);
168 @@ -2608,6 +2637,8 @@ static int make_request(request_queue_t
169 const int rw = bio_data_dir(bi);
172 + atomic_inc(&conf->in_reqs_in_queue);
174 if (unlikely(bio_barrier(bi))) {
175 bio_endio(bi, bi->bi_size, -EOPNOTSUPP);
177 @@ -2617,6 +2648,11 @@ static int make_request(request_queue_t
179 disk_stat_inc(mddev->gendisk, ios[rw]);
180 disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bi));
182 + atomic_inc(&conf->writes_in);
184 + atomic_inc(&conf->reads_in);
187 logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
188 last_sector = bi->bi_sector + (bi->bi_size>>9);
189 @@ -2724,6 +2760,7 @@ static int make_request(request_queue_t
193 + atomic_dec(&conf->in_reqs_in_queue);
195 bi->bi_end_io(bi, bytes, 0);
197 @@ -2985,6 +3022,7 @@ static void raid5d (mddev_t *mddev)
198 spin_unlock_irq(&conf->device_lock);
201 + atomic_inc(&conf->handled_in_raid5d);
202 handle_stripe(sh, conf->spare_page);
205 @@ -3381,6 +3419,21 @@ static void status (struct seq_file *seq
206 conf->disks[i].rdev &&
207 test_bit(In_sync, &conf->disks[i].rdev->flags) ? "U" : "_");
208 seq_printf (seq, "]");
209 + seq_printf (seq, "\n\t\tin: %u reads, %u writes; out: %u reads, %u writes",
210 + atomic_read(&conf->reads_in), atomic_read(&conf->writes_in),
211 + atomic_read(&conf->reads_out), atomic_read(&conf->writes_out));
212 + seq_printf (seq, "\n\t\t%u in raid5d, %u out of stripes, %u handle called",
213 + atomic_read(&conf->handled_in_raid5d),
214 + atomic_read(&conf->out_of_stripes),
215 + atomic_read(&conf->handle_called));
216 + seq_printf (seq, "\n\t\treads: %u for rmw, %u for rcw",
217 + atomic_read(&conf->reads_for_rmw),
218 + atomic_read(&conf->reads_for_rcw));
219 + seq_printf (seq, "\n\t\t%u delayed, %u bit delayed, %u active, queues: %u in, %u out\n",
220 + atomic_read(&conf->delayed), atomic_read(&conf->bit_delayed),
221 + atomic_read(&conf->active_stripes),
222 + atomic_read(&conf->in_reqs_in_queue),
223 + atomic_read(&conf->out_reqs_in_queue));
225 seq_printf (seq, "\n");
227 diff -pru linux-2.6.18-53.orig/include/linux/raid/raid5.h linux-2.6.18-53/include/linux/raid/raid5.h
228 --- linux-2.6.18-53.orig/include/linux/raid/raid5.h 2007-12-06 17:15:22.000000000 +0800
229 +++ linux-2.6.18-53/include/linux/raid/raid5.h 2007-12-06 17:15:32.000000000 +0800
230 @@ -259,6 +259,25 @@ struct raid5_private_data {
231 int pool_size; /* number of disks in stripeheads in pool */
232 spinlock_t device_lock;
233 struct disk_info *disks;
239 + atomic_t writes_in;
240 + atomic_t reads_out;
241 + atomic_t writes_out;
242 + atomic_t handled_in_raid5d;
243 + atomic_t out_of_stripes;
244 + atomic_t reads_for_rmw;
245 + atomic_t reads_for_rcw;
246 + atomic_t writes_zcopy;
247 + atomic_t writes_copied;
248 + atomic_t handle_called;
250 + atomic_t bit_delayed;
251 + atomic_t in_reqs_in_queue;
252 + atomic_t out_reqs_in_queue;
255 typedef struct raid5_private_data raid5_conf_t;
256 Only in linux-2.6.18-53.orig/include/linux/raid: .raid5.h.swp