1 diff -pur linux-2.6.9-55.0.9.orig/drivers/md/raid6main.c linux-2.6.9-55.0.9/drivers/md/raid6main.c
2 --- linux-2.6.9-55.0.9.orig/drivers/md/raid6main.c 2007-09-28 17:53:55.000000000 +0800
3 +++ linux-2.6.9-55.0.9/drivers/md/raid6main.c 2007-12-13 20:19:11.000000000 +0800
4 @@ -96,9 +96,10 @@ static inline void __release_stripe(raid
5 if (atomic_read(&conf->active_stripes)==0)
7 if (test_bit(STRIPE_HANDLE, &sh->state)) {
8 - if (test_bit(STRIPE_DELAYED, &sh->state))
9 + if (test_bit(STRIPE_DELAYED, &sh->state)) {
10 list_add_tail(&sh->lru, &conf->delayed_list);
12 + atomic_inc(&conf->delayed);
14 list_add_tail(&sh->lru, &conf->handle_list);
15 md_wakeup_thread(conf->mddev->thread);
17 @@ -269,6 +270,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 @@ -290,6 +292,9 @@ static struct stripe_head *get_active_st
26 if (list_empty(&sh->lru))
28 list_del_init(&sh->lru);
29 + if (test_bit(STRIPE_DELAYED, &sh->state))
30 + atomic_dec(&conf->delayed);
35 @@ -368,6 +373,8 @@ static int raid6_end_read_request (struc
39 + atomic_dec(&conf->out_reqs_in_queue);
41 for (i=0 ; i<disks; i++)
42 if (bi == &sh->dev[i].req)
44 @@ -445,6 +452,8 @@ static int raid6_end_write_request (stru
45 if (bi == &sh->dev[i].req)
48 + atomic_dec(&conf->out_reqs_in_queue);
50 PRINTK("end_write_request %llu/%d, count %d, uptodate: %d.\n",
51 (unsigned long long)sh->sector, i, atomic_read(&sh->count),
53 @@ -989,6 +998,7 @@ static void handle_stripe(struct stripe_
55 clear_bit(STRIPE_HANDLE, &sh->state);
56 clear_bit(STRIPE_DELAYED, &sh->state);
57 + atomic_inc(&conf->handle_called);
59 syncing = test_bit(STRIPE_SYNCING, &sh->state);
60 /* Now to look around and see what can be done */
61 @@ -1257,6 +1267,7 @@ static void handle_stripe(struct stripe_
62 set_bit(R5_LOCKED, &dev->flags);
63 set_bit(R5_Wantread, &dev->flags);
65 + atomic_inc(&conf->reads_for_rcw);
67 PRINTK("Request delayed stripe %llu block %d for Reconstruct\n",
68 (unsigned long long)sh->sector, i);
69 @@ -1390,6 +1401,7 @@ static void handle_stripe(struct stripe_
72 bi->bi_end_io(bi, bytes, 0);
73 + atomic_dec(&conf->in_reqs_in_queue);
75 for (i=disks; i-- ;) {
77 @@ -1405,10 +1417,13 @@ static void handle_stripe(struct stripe_
83 + atomic_inc(&conf->writes_out);
84 bi->bi_end_io = raid6_end_write_request;
87 + atomic_inc(&conf->reads_out);
88 bi->bi_end_io = raid6_end_read_request;
91 spin_lock_irq(&conf->device_lock);
92 rdev = conf->disks[i].rdev;
93 @@ -1436,12 +1451,14 @@ static void handle_stripe(struct stripe_
94 bi->bi_io_vec[0].bv_offset = 0;
95 bi->bi_size = STRIPE_SIZE;
97 + atomic_inc(&conf->out_reqs_in_queue);
98 generic_make_request(bi);
100 PRINTK("skip op %ld on disc %d for sector %llu\n",
101 bi->bi_rw, i, (unsigned long long)sh->sector);
102 clear_bit(R5_LOCKED, &sh->dev[i].flags);
103 set_bit(STRIPE_HANDLE, &sh->state);
104 + atomic_dec(&conf->delayed);
108 @@ -1555,6 +1572,8 @@ static int make_request (request_queue_t
109 sector_t logical_sector, last_sector;
110 struct stripe_head *sh;
112 + atomic_inc(&conf->in_reqs_in_queue);
114 if (unlikely(bio_barrier(bi))) {
115 bio_endio(bi, bi->bi_size, -EOPNOTSUPP);
117 @@ -1563,9 +1582,11 @@ static int make_request (request_queue_t
118 if (bio_data_dir(bi)==WRITE) {
119 disk_stat_inc(mddev->gendisk, writes);
120 disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi));
121 + atomic_inc(&conf->writes_in);
123 disk_stat_inc(mddev->gendisk, reads);
124 disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi));
125 + atomic_inc(&conf->reads_in);
128 logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
129 @@ -1605,6 +1626,7 @@ static int make_request (request_queue_t
131 if ( bio_data_dir(bi) == WRITE )
133 + atomic_dec(&conf->in_reqs_in_queue);
135 bi->bi_end_io(bi, bytes, 0);
137 @@ -1701,6 +1723,8 @@ static void raid6d (mddev_t *mddev)
138 spin_unlock_irq(&conf->device_lock);
142 + atomic_inc(&conf->handled_in_raid5d);
146 @@ -1940,6 +1964,23 @@ static void status (struct seq_file *seq
147 conf->disks[i].rdev &&
148 conf->disks[i].rdev->in_sync ? "U" : "_");
149 seq_printf (seq, "]");
151 + seq_printf (seq, "\n\t\tin: %u reads, %u writes; out: %u reads, %u writes",
152 + atomic_read(&conf->reads_in), atomic_read(&conf->writes_in),
153 + atomic_read(&conf->reads_out), atomic_read(&conf->writes_out));
154 + seq_printf (seq, "\n\t\t%u in raid5d, %u out of stripes, %u handle called",
155 + atomic_read(&conf->handled_in_raid5d),
156 + atomic_read(&conf->out_of_stripes),
157 + atomic_read(&conf->handle_called));
158 + seq_printf (seq, "\n\t\treads: %u for rmw, %u for rcw",
159 + atomic_read(&conf->reads_for_rmw),
160 + atomic_read(&conf->reads_for_rcw));
161 + seq_printf (seq, "\n\t\t%u delayed, %u active, queues: %u in, %u out\n",
162 + atomic_read(&conf->delayed),
163 + atomic_read(&conf->active_stripes),
164 + atomic_read(&conf->in_reqs_in_queue),
165 + atomic_read(&conf->out_reqs_in_queue));
168 seq_printf (seq, "\n");