aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Peterson <rpeterso@redhat.com>2018-10-15 13:17:30 -0400
committerBob Peterson <rpeterso@redhat.com>2018-10-15 13:17:30 -0400
commitc9e58fb2aad5231e7c49d90d059caa3c67a3ff31 (patch)
treebe17d7ad5505903535ea9e547e70bd712c05c1d0
parent0ddeded4ae768882e5c3a5558f77f27e4e445a6a (diff)
gfs2: write revokes should traverse sd_ail1_list in reverse
All the other functions that deal with the sd_ail_list run the list from the tail back to the head, iow, in reverse. We should do the same while writing revokes, otherwise we might miss removing entries properly from the list when we hit the limit of how many revokes we can write at one time (based on block size, which determines how many block pointers will fit in the revoke block). Signed-off-by: Bob Peterson <rpeterso@redhat.com>
-rw-r--r--fs/gfs2/log.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index 96706a2bd2b6..99dd58694ba1 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -621,7 +621,7 @@ void gfs2_write_revokes(struct gfs2_sbd *sdp)
621 621
622 gfs2_ail1_empty(sdp); 622 gfs2_ail1_empty(sdp);
623 spin_lock(&sdp->sd_ail_lock); 623 spin_lock(&sdp->sd_ail_lock);
624 list_for_each_entry(tr, &sdp->sd_ail1_list, tr_list) { 624 list_for_each_entry_reverse(tr, &sdp->sd_ail1_list, tr_list) {
625 list_for_each_entry(bd, &tr->tr_ail2_list, bd_ail_st_list) { 625 list_for_each_entry(bd, &tr->tr_ail2_list, bd_ail_st_list) {
626 if (list_empty(&bd->bd_list)) { 626 if (list_empty(&bd->bd_list)) {
627 have_revokes = 1; 627 have_revokes = 1;
@@ -645,7 +645,7 @@ done:
645 } 645 }
646 gfs2_log_lock(sdp); 646 gfs2_log_lock(sdp);
647 spin_lock(&sdp->sd_ail_lock); 647 spin_lock(&sdp->sd_ail_lock);
648 list_for_each_entry(tr, &sdp->sd_ail1_list, tr_list) { 648 list_for_each_entry_reverse(tr, &sdp->sd_ail1_list, tr_list) {
649 list_for_each_entry_safe(bd, tmp, &tr->tr_ail2_list, bd_ail_st_list) { 649 list_for_each_entry_safe(bd, tmp, &tr->tr_ail2_list, bd_ail_st_list) {
650 if (max_revokes == 0) 650 if (max_revokes == 0)
651 goto out_of_blocks; 651 goto out_of_blocks;