raid5: fix stripe release order
Subsystems (2)
PATCH 1/1 raid5: fix stripe release order
patch "make release_stripe lockless" changes the order stripes are released. Originally I thought block layer can take care of request merge, but it appears there are still some requests not merged. It's easy to fix the order.
--- drivers/md/raid5.c | 1 + include/linux/llist.h | 1 + lib/llist.c | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+)
include/linux/llist.h +1 -0
@@ -172,4 +172,5 @@ static inline struct llist_node *llist_dextern struct llist_node *llist_del_first (struct llist_head *head); +extern struct llist_node *llist_reverse_order (struct llist_node *head);#endif /* LLIST_H */
lib/llist.c +27 -0
@@ -81,3 +81,30 @@ struct llist_node *llist_del_first(strucreturn entry; }EXPORT_SYMBOL_GPL (llist_del_first); + +/* +* llist_reverse_order - reverse llist order +* @head: list head +* +* Return reversed list head +*/ +struct llist_node *llist_reverse_order (struct llist_node *head) +{ +struct llist_node *second, *third; + +if (head ==NULL || head->next ==NULL ) +return head; + second = head->next; + head->next =NULL ; + +do { + third = second->next; + second->next = head; + + head = second; + second = third; + }while (second); + +return head; +} +EXPORT_SYMBOL_GPL (llist_reverse_order);
drivers/md/raid5.c +1 -0
@@ -247,6 +247,7 @@ static int release_stripe_list(struct r5struct llist_node *head; head =llist_del_all (&conf->released_stripes); + head =llist_reverse_order (head);while (head) { sh = llist_entry(head, struct stripe_head, release_list); head =llist_next (head);
Quoted 70 lines · On Thu, 25 Jul 2013 16:26:42 +0800 Shaohua Li <[email protected]> wrote:
patch "make
release_stripelockless" changes the order stripes are released. Originally I thought block layer can take care of request merge, but it appears there are still some requests not merged. It's easy to fix the order.Signed-off-by Shaohua Li <[email protected]>--- drivers/md/raid5.c | 1 + include/linux/llist.h | 1 + lib/llist.c | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+)Index:
linux/include/linux/llist.h
===================================================================include/linux/llist.h +1
-0@@ -172,4 +172,5 @@ static inline struct llist_node *llist_dextern struct llist_node *llist_del_first (struct llist_head *head); +extern struct llist_node *llist_reverse_order (struct llist_node *head);#endif /* LLIST_H */ Index:
linux/lib/llist.c
===================================================================lib/llist.c +27
-0@@ -81,3 +81,30 @@ struct llist_node *llist_del_first(strucreturn entry; }EXPORT_SYMBOL_GPL (llist_del_first); + +/* +* llist_reverse_order - reverse llist order +* @head: list head +* +* Return reversed list head +*/ +struct llist_node *llist_reverse_order (struct llist_node *head) +{ +struct llist_node *second, *third; + +if (head ==NULL || head->next ==NULL ) +return head; + second = head->next; + head->next =NULL ; + +do { + third = second->next; + second->next = head; + + head = second; + second = third; + }while (second); + +return head; +} +EXPORT_SYMBOL_GPL (llist_reverse_order);Index:
linux/drivers/md/raid5.c
===================================================================drivers/md/raid5.c +1
-1@@ -247,6 +247,7 @@ static int release_stripe_list(struct r5struct llist_node *head; head =llist_del_all (&conf->released_stripes); + head =llist_reverse_order (head);while (head) { sh = llist_entry(head, struct stripe_head, release_list); head =llist_next (head); --
Quoted 3 lines
To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Makes sense.
Applied- thanks.
NeilBrown