summaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorSandeep K Sinha <sandeepksinha@gmail.com>2009-06-16 08:57:08 +0200
committerNeilBrown <neilb@suse.de>2009-06-16 08:57:08 +0200
commitaece3d1f40879759f641dfbfdbb9e2593adeb43c (patch)
tree0264ac8e02f4d08472c11b04305f8c39695d9007 /drivers/md
parentmd: Removing num_sector and replacing start_sector with end_sector (diff)
downloadlinux-aece3d1f40879759f641dfbfdbb9e2593adeb43c.tar.xz
linux-aece3d1f40879759f641dfbfdbb9e2593adeb43c.zip
md: Binary search in linear raid
Replace the linear search with binary search in which_dev. Signed-off-by: Sandeep K Sinha <sandeepksinha@gmail.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/linear.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/md/linear.c b/drivers/md/linear.c
index 529a3d37e3fe..9b02a73fbc6b 100644
--- a/drivers/md/linear.c
+++ b/drivers/md/linear.c
@@ -27,14 +27,26 @@
*/
static inline dev_info_t *which_dev(mddev_t *mddev, sector_t sector)
{
- dev_info_t *hash;
+ int lo, mid, hi;
linear_conf_t *conf = mddev->private;
- hash = conf->disks;
+ lo = 0;
+ hi = mddev->raid_disks - 1;
- while (sector >= hash->end_sector)
- hash++;
- return hash;
+ /*
+ * Binary Search
+ */
+
+ while (hi > lo) {
+
+ mid = (hi + lo) / 2;
+ if (sector < conf->disks[mid].end_sector)
+ hi = mid;
+ else
+ lo = mid + 1;
+ }
+
+ return conf->disks + lo;
}
/**