aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/rgrp.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/gfs2/rgrp.c')
-rw-r--r--fs/gfs2/rgrp.c40
1 files changed, 17 insertions, 23 deletions
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 3f10b1fafd66..66193b45e50b 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -915,24 +915,20 @@ static struct inode *try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked)
915static struct gfs2_rgrpd *recent_rgrp_first(struct gfs2_sbd *sdp, 915static struct gfs2_rgrpd *recent_rgrp_first(struct gfs2_sbd *sdp,
916 u64 rglast) 916 u64 rglast)
917{ 917{
918 struct gfs2_rgrpd *rgd = NULL; 918 struct gfs2_rgrpd *rgd;
919 919
920 spin_lock(&sdp->sd_rindex_spin); 920 spin_lock(&sdp->sd_rindex_spin);
921 921
922 if (list_empty(&sdp->sd_rindex_recent_list)) 922 if (rglast) {
923 goto out; 923 list_for_each_entry(rgd, &sdp->sd_rindex_recent_list, rd_recent) {
924 924 if (rgrp_contains_block(rgd, rglast))
925 if (!rglast) 925 goto out;
926 goto first; 926 }
927
928 list_for_each_entry(rgd, &sdp->sd_rindex_recent_list, rd_recent) {
929 if (rgd->rd_addr == rglast)
930 goto out;
931 } 927 }
932 928 rgd = NULL;
933first: 929 if (!list_empty(&sdp->sd_rindex_recent_list))
934 rgd = list_entry(sdp->sd_rindex_recent_list.next, struct gfs2_rgrpd, 930 rgd = list_entry(sdp->sd_rindex_recent_list.next,
935 rd_recent); 931 struct gfs2_rgrpd, rd_recent);
936out: 932out:
937 spin_unlock(&sdp->sd_rindex_spin); 933 spin_unlock(&sdp->sd_rindex_spin);
938 return rgd; 934 return rgd;
@@ -1078,7 +1074,7 @@ static struct inode *get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
1078 1074
1079 /* Try recently successful rgrps */ 1075 /* Try recently successful rgrps */
1080 1076
1081 rgd = recent_rgrp_first(sdp, ip->i_last_rg_alloc); 1077 rgd = recent_rgrp_first(sdp, ip->i_goal);
1082 1078
1083 while (rgd) { 1079 while (rgd) {
1084 rg_locked = 0; 1080 rg_locked = 0;
@@ -1162,8 +1158,6 @@ static struct inode *get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
1162 } 1158 }
1163 1159
1164out: 1160out:
1165 ip->i_last_rg_alloc = rgd->rd_addr;
1166
1167 if (begin) { 1161 if (begin) {
1168 recent_rgrp_add(rgd); 1162 recent_rgrp_add(rgd);
1169 rgd = gfs2_rgrpd_get_next(rgd); 1163 rgd = gfs2_rgrpd_get_next(rgd);
@@ -1425,8 +1419,8 @@ u64 gfs2_alloc_data(struct gfs2_inode *ip)
1425 u32 goal, blk; 1419 u32 goal, blk;
1426 u64 block; 1420 u64 block;
1427 1421
1428 if (rgrp_contains_block(rgd, ip->i_di.di_goal_data)) 1422 if (rgrp_contains_block(rgd, ip->i_goal))
1429 goal = ip->i_di.di_goal_data - rgd->rd_data0; 1423 goal = ip->i_goal - rgd->rd_data0;
1430 else 1424 else
1431 goal = rgd->rd_last_alloc_data; 1425 goal = rgd->rd_last_alloc_data;
1432 1426
@@ -1435,7 +1429,7 @@ u64 gfs2_alloc_data(struct gfs2_inode *ip)
1435 rgd->rd_last_alloc_data = blk; 1429 rgd->rd_last_alloc_data = blk;
1436 1430
1437 block = rgd->rd_data0 + blk; 1431 block = rgd->rd_data0 + blk;
1438 ip->i_di.di_goal_data = block; 1432 ip->i_goal = block;
1439 1433
1440 gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free); 1434 gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free);
1441 rgd->rd_rg.rg_free--; 1435 rgd->rd_rg.rg_free--;
@@ -1470,8 +1464,8 @@ u64 gfs2_alloc_meta(struct gfs2_inode *ip)
1470 u32 goal, blk; 1464 u32 goal, blk;
1471 u64 block; 1465 u64 block;
1472 1466
1473 if (rgrp_contains_block(rgd, ip->i_di.di_goal_meta)) 1467 if (rgrp_contains_block(rgd, ip->i_goal))
1474 goal = ip->i_di.di_goal_meta - rgd->rd_data0; 1468 goal = ip->i_goal - rgd->rd_data0;
1475 else 1469 else
1476 goal = rgd->rd_last_alloc_meta; 1470 goal = rgd->rd_last_alloc_meta;
1477 1471
@@ -1480,7 +1474,7 @@ u64 gfs2_alloc_meta(struct gfs2_inode *ip)
1480 rgd->rd_last_alloc_meta = blk; 1474 rgd->rd_last_alloc_meta = blk;
1481 1475
1482 block = rgd->rd_data0 + blk; 1476 block = rgd->rd_data0 + blk;
1483 ip->i_di.di_goal_meta = block; 1477 ip->i_goal = block;
1484 1478
1485 gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free); 1479 gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free);
1486 rgd->rd_rg.rg_free--; 1480 rgd->rd_rg.rg_free--;