raid6-merge-ios.patch
来自「lustre 1.6.5 source code」· PATCH 代码 · 共 127 行
PATCH
127 行
diff -pur linux-2.6.9.orig/drivers/md/raid6main.c linux-2.6.9/drivers/md/raid6main.c--- linux-2.6.9.orig/drivers/md/raid6main.c 2008-01-10 13:51:32.000000000 +0800+++ linux-2.6.9/drivers/md/raid6main.c 2008-01-10 13:52:20.000000000 +0800@@ -956,6 +956,26 @@ static void add_stripe_bio (struct strip } } +/*+ * The whole idea is to collect all bio's and then issue them+ * disk by disk to assist merging a bit -bzzz+ */+static void raid6_flush_bios(raid6_conf_t *conf, struct bio *bios[], int raid_disks)+{+ struct bio *bio, *nbio;+ int i;+ + for (i = 0; i < raid_disks; i++) {+ bio = bios[i];+ while (bio) {+ nbio = bio->bi_next;+ bio->bi_next = NULL;+ generic_make_request(bio);+ bio = nbio;+ }+ bios[i] = NULL;+ }+} /* * handle_stripe - do things to a stripe.@@ -975,7 +995,7 @@ static void add_stripe_bio (struct strip * */ -static void handle_stripe(struct stripe_head *sh)+static void handle_stripe(struct stripe_head *sh, struct bio *bios[]) { raid6_conf_t *conf = sh->raid_conf; int disks = conf->raid_disks;@@ -1452,7 +1472,11 @@ static void handle_stripe(struct stripe_ bi->bi_size = STRIPE_SIZE; bi->bi_next = NULL; atomic_inc(&conf->out_reqs_in_queue);- generic_make_request(bi);+ if(bios) {+ bi->bi_next = bios[i];+ bios[i] = bi;+ } else + generic_make_request(bi); } else { PRINTK("skip op %ld on disc %d for sector %llu\n", bi->bi_rw, i, (unsigned long long)sh->sector);@@ -1575,6 +1599,7 @@ static int make_request (request_queue_t int sectors_per_chunk; int stripes_per_chunk, sectors_per_block; int sectors_per_stripe;+ struct bio *bios[MD_SB_DISKS]; int i, j; atomic_inc(&conf->in_reqs_in_queue);@@ -1611,6 +1636,7 @@ static int make_request (request_queue_t sector_div(block, sectors_per_block); sectors = bi->bi_size >> 9; + memset(&bios, 0, sizeof(bios)); repeat: stripe = block * (sectors_per_block / data_disks); b_sector = stripe * data_disks;@@ -1630,9 +1656,17 @@ static int make_request (request_queue_t new_sector = raid6_compute_sector(r_sector, raid_disks, data_disks, &dd_idx, &pd_idx, conf);- if (sh == NULL)- sh = get_active_stripe(conf, new_sector, pd_idx,- (bi->bi_rw&RWA_MASK));+ if (sh == NULL) {+ /* first, try to get stripe w/o blocking+ * if we can't, then it's time to submit+ * all collected bio's in order to free+ * some space in the cache -bzzz */+ sh = get_active_stripe(conf, new_sector, pd_idx, 1);+ if (!sh && !(bi->bi_rw&RWA_MASK)) {+ raid6_flush_bios(conf, bios, raid_disks);+ sh = get_active_stripe(conf, new_sector, pd_idx, 0);+ }+ } if (sh) { add_stripe_bio(sh, bi, dd_idx, (bi->bi_rw&RW_MASK)); } else {@@ -1653,7 +1687,7 @@ static int make_request (request_queue_t if (sh) { raid6_plug_device(conf);- handle_stripe(sh);+ handle_stripe(sh, bios); release_stripe(sh); sh = NULL; }@@ -1664,6 +1698,9 @@ static int make_request (request_queue_t if(sectors > 0) goto repeat; + /* now flush all bio's */+ raid6_flush_bios(conf, bios, raid_disks);+ spin_lock_irq(&conf->device_lock); if (--bi->bi_phys_segments == 0) { int bytes = bi->bi_size;@@ -1719,7 +1756,7 @@ static int sync_request (mddev_t *mddev, clear_bit(STRIPE_INSYNC, &sh->state); spin_unlock(&sh->lock); - handle_stripe(sh);+ handle_stripe(sh, NULL); release_stripe(sh); return STRIPE_SECTORS;@@ -1769,7 +1806,7 @@ static void raid6d (mddev_t *mddev) handled++; atomic_inc(&conf->handled_in_raid5d);- handle_stripe(sh);+ handle_stripe(sh, NULL); release_stripe(sh); spin_lock_irq(&conf->device_lock);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?