aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid5.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2008-06-27 19:16:30 -0400
committerNeil Brown <neilb@notabene.brown>2008-06-27 19:16:30 -0400
commit1fe797e67fb07d605b82300934d0de67068a0aca (patch)
treeb34186b86f446bfaafec0fda3f1f42d2f3a47613 /drivers/md/raid5.c
parent7b3a871ed995270268a481404454ceafe1a87478 (diff)
md: rationalize raid5 function names
From: Dan Williams <dan.j.williams@intel.com> Commit a4456856 refactored some of the deep code paths in raid5.c into separate functions. The names chosen at the time do not consistently indicate what is going to happen to the stripe. So, update the names, and since a stripe is a cache element use cache semantics like fill, dirty, and clean. (also, fix up the indentation in fetch_block5) Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Neil Brown <neilb@suse.de>
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r--drivers/md/raid5.c76
1 files changed, 40 insertions, 36 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 456c3c2c961d..442622067cae 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -1618,7 +1618,7 @@ static void compute_block_2(struct stripe_head *sh, int dd_idx1, int dd_idx2)
1618} 1618}
1619 1619
1620static void 1620static void
1621handle_write_operations5(struct stripe_head *sh, struct stripe_head_state *s, 1621schedule_reconstruction5(struct stripe_head *sh, struct stripe_head_state *s,
1622 int rcw, int expand) 1622 int rcw, int expand)
1623{ 1623{
1624 int i, pd_idx = sh->pd_idx, disks = sh->disks; 1624 int i, pd_idx = sh->pd_idx, disks = sh->disks;
@@ -1783,7 +1783,7 @@ static int stripe_to_pdidx(sector_t stripe, raid5_conf_t *conf, int disks)
1783} 1783}
1784 1784
1785static void 1785static void
1786handle_requests_to_failed_array(raid5_conf_t *conf, struct stripe_head *sh, 1786handle_failed_stripe(raid5_conf_t *conf, struct stripe_head *sh,
1787 struct stripe_head_state *s, int disks, 1787 struct stripe_head_state *s, int disks,
1788 struct bio **return_bi) 1788 struct bio **return_bi)
1789{ 1789{
@@ -1874,23 +1874,28 @@ handle_requests_to_failed_array(raid5_conf_t *conf, struct stripe_head *sh,
1874 md_wakeup_thread(conf->mddev->thread); 1874 md_wakeup_thread(conf->mddev->thread);
1875} 1875}
1876 1876
1877/* __handle_issuing_new_read_requests5 - returns 0 if there are no more disks 1877/* fetch_block5 - checks the given member device to see if its data needs
1878 * to process 1878 * to be read or computed to satisfy a request.
1879 *
1880 * Returns 1 when no more member devices need to be checked, otherwise returns
1881 * 0 to tell the loop in handle_stripe_fill5 to continue
1879 */ 1882 */
1880static int __handle_issuing_new_read_requests5(struct stripe_head *sh, 1883static int fetch_block5(struct stripe_head *sh, struct stripe_head_state *s,
1881 struct stripe_head_state *s, int disk_idx, int disks) 1884 int disk_idx, int disks)
1882{ 1885{
1883 struct r5dev *dev = &sh->dev[disk_idx]; 1886 struct r5dev *dev = &sh->dev[disk_idx];
1884 struct r5dev *failed_dev = &sh->dev[s->failed_num]; 1887 struct r5dev *failed_dev = &sh->dev[s->failed_num];
1885 1888
1886 /* is the data in this block needed, and can we get it? */ 1889 /* is the data in this block needed, and can we get it? */
1887 if (!test_bit(R5_LOCKED, &dev->flags) && 1890 if (!test_bit(R5_LOCKED, &dev->flags) &&
1888 !test_bit(R5_UPTODATE, &dev->flags) && (dev->toread || 1891 !test_bit(R5_UPTODATE, &dev->flags) &&
1889 (dev->towrite && !test_bit(R5_OVERWRITE, &dev->flags)) || 1892 (dev->toread ||
1890 s->syncing || s->expanding || (s->failed && 1893 (dev->towrite && !test_bit(R5_OVERWRITE, &dev->flags)) ||
1891 (failed_dev->toread || (failed_dev->towrite && 1894 s->syncing || s->expanding ||
1892 !test_bit(R5_OVERWRITE, &failed_dev->flags) 1895 (s->failed &&
1893 ))))) { 1896 (failed_dev->toread ||
1897 (failed_dev->towrite &&
1898 !test_bit(R5_OVERWRITE, &failed_dev->flags)))))) {
1894 /* We would like to get this block, possibly by computing it, 1899 /* We would like to get this block, possibly by computing it,
1895 * otherwise read it if the backing disk is insync 1900 * otherwise read it if the backing disk is insync
1896 */ 1901 */
@@ -1908,7 +1913,7 @@ static int __handle_issuing_new_read_requests5(struct stripe_head *sh,
1908 * subsequent operation. 1913 * subsequent operation.
1909 */ 1914 */
1910 s->uptodate++; 1915 s->uptodate++;
1911 return 0; /* uptodate + compute == disks */ 1916 return 1; /* uptodate + compute == disks */
1912 } else if (test_bit(R5_Insync, &dev->flags)) { 1917 } else if (test_bit(R5_Insync, &dev->flags)) {
1913 set_bit(R5_LOCKED, &dev->flags); 1918 set_bit(R5_LOCKED, &dev->flags);
1914 set_bit(R5_Wantread, &dev->flags); 1919 set_bit(R5_Wantread, &dev->flags);
@@ -1918,10 +1923,13 @@ static int __handle_issuing_new_read_requests5(struct stripe_head *sh,
1918 } 1923 }
1919 } 1924 }
1920 1925
1921 return ~0; 1926 return 0;
1922} 1927}
1923 1928
1924static void handle_issuing_new_read_requests5(struct stripe_head *sh, 1929/**
1930 * handle_stripe_fill5 - read or compute data to satisfy pending requests.
1931 */
1932static void handle_stripe_fill5(struct stripe_head *sh,
1925 struct stripe_head_state *s, int disks) 1933 struct stripe_head_state *s, int disks)
1926{ 1934{
1927 int i; 1935 int i;
@@ -1931,16 +1939,14 @@ static void handle_issuing_new_read_requests5(struct stripe_head *sh,
1931 * midst of changing due to a write 1939 * midst of changing due to a write
1932 */ 1940 */
1933 if (!test_bit(STRIPE_COMPUTE_RUN, &sh->state) && !sh->check_state && 1941 if (!test_bit(STRIPE_COMPUTE_RUN, &sh->state) && !sh->check_state &&
1934 !sh->reconstruct_state) { 1942 !sh->reconstruct_state)
1935 for (i = disks; i--; ) 1943 for (i = disks; i--; )
1936 if (__handle_issuing_new_read_requests5( 1944 if (fetch_block5(sh, s, i, disks))
1937 sh, s, i, disks) == 0)
1938 break; 1945 break;
1939 }
1940 set_bit(STRIPE_HANDLE, &sh->state); 1946 set_bit(STRIPE_HANDLE, &sh->state);
1941} 1947}
1942 1948
1943static void handle_issuing_new_read_requests6(struct stripe_head *sh, 1949static void handle_stripe_fill6(struct stripe_head *sh,
1944 struct stripe_head_state *s, struct r6_state *r6s, 1950 struct stripe_head_state *s, struct r6_state *r6s,
1945 int disks) 1951 int disks)
1946{ 1952{
@@ -1999,12 +2005,12 @@ static void handle_issuing_new_read_requests6(struct stripe_head *sh,
1999} 2005}
2000 2006
2001 2007
2002/* handle_completed_write_requests 2008/* handle_stripe_clean_event
2003 * any written block on an uptodate or failed drive can be returned. 2009 * any written block on an uptodate or failed drive can be returned.
2004 * Note that if we 'wrote' to a failed drive, it will be UPTODATE, but 2010 * Note that if we 'wrote' to a failed drive, it will be UPTODATE, but
2005 * never LOCKED, so we don't need to test 'failed' directly. 2011 * never LOCKED, so we don't need to test 'failed' directly.
2006 */ 2012 */
2007static void handle_completed_write_requests(raid5_conf_t *conf, 2013static void handle_stripe_clean_event(raid5_conf_t *conf,
2008 struct stripe_head *sh, int disks, struct bio **return_bi) 2014 struct stripe_head *sh, int disks, struct bio **return_bi)
2009{ 2015{
2010 int i; 2016 int i;
@@ -2049,7 +2055,7 @@ static void handle_completed_write_requests(raid5_conf_t *conf,
2049 md_wakeup_thread(conf->mddev->thread); 2055 md_wakeup_thread(conf->mddev->thread);
2050} 2056}
2051 2057
2052static void handle_issuing_new_write_requests5(raid5_conf_t *conf, 2058static void handle_stripe_dirtying5(raid5_conf_t *conf,
2053 struct stripe_head *sh, struct stripe_head_state *s, int disks) 2059 struct stripe_head *sh, struct stripe_head_state *s, int disks)
2054{ 2060{
2055 int rmw = 0, rcw = 0, i; 2061 int rmw = 0, rcw = 0, i;
@@ -2136,10 +2142,10 @@ static void handle_issuing_new_write_requests5(raid5_conf_t *conf,
2136 if ((s->req_compute || !test_bit(STRIPE_COMPUTE_RUN, &sh->state)) && 2142 if ((s->req_compute || !test_bit(STRIPE_COMPUTE_RUN, &sh->state)) &&
2137 (s->locked == 0 && (rcw == 0 || rmw == 0) && 2143 (s->locked == 0 && (rcw == 0 || rmw == 0) &&
2138 !test_bit(STRIPE_BIT_DELAY, &sh->state))) 2144 !test_bit(STRIPE_BIT_DELAY, &sh->state)))
2139 handle_write_operations5(sh, s, rcw == 0, 0); 2145 schedule_reconstruction5(sh, s, rcw == 0, 0);
2140} 2146}
2141 2147
2142static void handle_issuing_new_write_requests6(raid5_conf_t *conf, 2148static void handle_stripe_dirtying6(raid5_conf_t *conf,
2143 struct stripe_head *sh, struct stripe_head_state *s, 2149 struct stripe_head *sh, struct stripe_head_state *s,
2144 struct r6_state *r6s, int disks) 2150 struct r6_state *r6s, int disks)
2145{ 2151{
@@ -2597,8 +2603,7 @@ static void handle_stripe5(struct stripe_head *sh)
2597 * need to be failed 2603 * need to be failed
2598 */ 2604 */
2599 if (s.failed > 1 && s.to_read+s.to_write+s.written) 2605 if (s.failed > 1 && s.to_read+s.to_write+s.written)
2600 handle_requests_to_failed_array(conf, sh, &s, disks, 2606 handle_failed_stripe(conf, sh, &s, disks, &return_bi);
2601 &return_bi);
2602 if (s.failed > 1 && s.syncing) { 2607 if (s.failed > 1 && s.syncing) {
2603 md_done_sync(conf->mddev, STRIPE_SECTORS,0); 2608 md_done_sync(conf->mddev, STRIPE_SECTORS,0);
2604 clear_bit(STRIPE_SYNCING, &sh->state); 2609 clear_bit(STRIPE_SYNCING, &sh->state);
@@ -2614,7 +2619,7 @@ static void handle_stripe5(struct stripe_head *sh)
2614 !test_bit(R5_LOCKED, &dev->flags) && 2619 !test_bit(R5_LOCKED, &dev->flags) &&
2615 test_bit(R5_UPTODATE, &dev->flags)) || 2620 test_bit(R5_UPTODATE, &dev->flags)) ||
2616 (s.failed == 1 && s.failed_num == sh->pd_idx))) 2621 (s.failed == 1 && s.failed_num == sh->pd_idx)))
2617 handle_completed_write_requests(conf, sh, disks, &return_bi); 2622 handle_stripe_clean_event(conf, sh, disks, &return_bi);
2618 2623
2619 /* Now we might consider reading some blocks, either to check/generate 2624 /* Now we might consider reading some blocks, either to check/generate
2620 * parity, or to satisfy requests 2625 * parity, or to satisfy requests
@@ -2622,7 +2627,7 @@ static void handle_stripe5(struct stripe_head *sh)
2622 */ 2627 */
2623 if (s.to_read || s.non_overwrite || 2628 if (s.to_read || s.non_overwrite ||
2624 (s.syncing && (s.uptodate + s.compute < disks)) || s.expanding) 2629 (s.syncing && (s.uptodate + s.compute < disks)) || s.expanding)
2625 handle_issuing_new_read_requests5(sh, &s, disks); 2630 handle_stripe_fill5(sh, &s, disks);
2626 2631
2627 /* Now we check to see if any write operations have recently 2632 /* Now we check to see if any write operations have recently
2628 * completed 2633 * completed
@@ -2666,7 +2671,7 @@ static void handle_stripe5(struct stripe_head *sh)
2666 * block. 2671 * block.
2667 */ 2672 */
2668 if (s.to_write && !sh->reconstruct_state && !sh->check_state) 2673 if (s.to_write && !sh->reconstruct_state && !sh->check_state)
2669 handle_issuing_new_write_requests5(conf, sh, &s, disks); 2674 handle_stripe_dirtying5(conf, sh, &s, disks);
2670 2675
2671 /* maybe we need to check and possibly fix the parity for this stripe 2676 /* maybe we need to check and possibly fix the parity for this stripe
2672 * Any reads will already have been scheduled, so we just see if enough 2677 * Any reads will already have been scheduled, so we just see if enough
@@ -2722,7 +2727,7 @@ static void handle_stripe5(struct stripe_head *sh)
2722 sh->disks = conf->raid_disks; 2727 sh->disks = conf->raid_disks;
2723 sh->pd_idx = stripe_to_pdidx(sh->sector, conf, 2728 sh->pd_idx = stripe_to_pdidx(sh->sector, conf,
2724 conf->raid_disks); 2729 conf->raid_disks);
2725 handle_write_operations5(sh, &s, 1, 1); 2730 schedule_reconstruction5(sh, &s, 1, 1);
2726 } else if (s.expanded && !sh->reconstruct_state && s.locked == 0) { 2731 } else if (s.expanded && !sh->reconstruct_state && s.locked == 0) {
2727 clear_bit(STRIPE_EXPAND_READY, &sh->state); 2732 clear_bit(STRIPE_EXPAND_READY, &sh->state);
2728 atomic_dec(&conf->reshape_stripes); 2733 atomic_dec(&conf->reshape_stripes);
@@ -2854,8 +2859,7 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
2854 * might need to be failed 2859 * might need to be failed
2855 */ 2860 */
2856 if (s.failed > 2 && s.to_read+s.to_write+s.written) 2861 if (s.failed > 2 && s.to_read+s.to_write+s.written)
2857 handle_requests_to_failed_array(conf, sh, &s, disks, 2862 handle_failed_stripe(conf, sh, &s, disks, &return_bi);
2858 &return_bi);
2859 if (s.failed > 2 && s.syncing) { 2863 if (s.failed > 2 && s.syncing) {
2860 md_done_sync(conf->mddev, STRIPE_SECTORS,0); 2864 md_done_sync(conf->mddev, STRIPE_SECTORS,0);
2861 clear_bit(STRIPE_SYNCING, &sh->state); 2865 clear_bit(STRIPE_SYNCING, &sh->state);
@@ -2880,7 +2884,7 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
2880 ( r6s.q_failed || ((test_bit(R5_Insync, &qdev->flags) 2884 ( r6s.q_failed || ((test_bit(R5_Insync, &qdev->flags)
2881 && !test_bit(R5_LOCKED, &qdev->flags) 2885 && !test_bit(R5_LOCKED, &qdev->flags)
2882 && test_bit(R5_UPTODATE, &qdev->flags))))) 2886 && test_bit(R5_UPTODATE, &qdev->flags)))))
2883 handle_completed_write_requests(conf, sh, disks, &return_bi); 2887 handle_stripe_clean_event(conf, sh, disks, &return_bi);
2884 2888
2885 /* Now we might consider reading some blocks, either to check/generate 2889 /* Now we might consider reading some blocks, either to check/generate
2886 * parity, or to satisfy requests 2890 * parity, or to satisfy requests
@@ -2888,11 +2892,11 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
2888 */ 2892 */
2889 if (s.to_read || s.non_overwrite || (s.to_write && s.failed) || 2893 if (s.to_read || s.non_overwrite || (s.to_write && s.failed) ||
2890 (s.syncing && (s.uptodate < disks)) || s.expanding) 2894 (s.syncing && (s.uptodate < disks)) || s.expanding)
2891 handle_issuing_new_read_requests6(sh, &s, &r6s, disks); 2895 handle_stripe_fill6(sh, &s, &r6s, disks);
2892 2896
2893 /* now to consider writing and what else, if anything should be read */ 2897 /* now to consider writing and what else, if anything should be read */
2894 if (s.to_write) 2898 if (s.to_write)
2895 handle_issuing_new_write_requests6(conf, sh, &s, &r6s, disks); 2899 handle_stripe_dirtying6(conf, sh, &s, &r6s, disks);
2896 2900
2897 /* maybe we need to check and possibly fix the parity for this stripe 2901 /* maybe we need to check and possibly fix the parity for this stripe
2898 * Any reads will already have been scheduled, so we just see if enough 2902 * Any reads will already have been scheduled, so we just see if enough