aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Peterson <rpeterso@redhat.com>2011-11-14 10:45:40 -0500
committerSteven Whitehouse <swhiteho@redhat.com>2011-11-15 10:24:22 -0500
commitc688b8b334d20acbc79b0383af2816ecf7365741 (patch)
tree88d6db882149dcb05af56d8739af928360739bac
parent79c4c379c8f16a12c28ea2084db5138e33d17ebd (diff)
GFS2: Add non-try locks back to get_local_rgrp
This upstream patch had what I believe is an unintended consequence: http://git.kernel.org/?p=linux/kernel/git/steve/gfs2-3.0-nmw.git;a=commitdiff;h=beca42486749c1538a5ed58fe9dcc9f26d428c93 The patch changed function get_local_rgrp such that it ONLY used TRY locks for RGRP searches. Prior to that patch, the code used TRY locks during the first loop, and if that was unsuccessful, it used normal blocking locks on subsequent searches. This patch changes it back to the old way. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/rgrp.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 96bd6d759f29..a1a815b691cd 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -978,7 +978,7 @@ static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
978 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); 978 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
979 struct gfs2_rgrpd *rgd, *begin = NULL; 979 struct gfs2_rgrpd *rgd, *begin = NULL;
980 struct gfs2_alloc *al = ip->i_alloc; 980 struct gfs2_alloc *al = ip->i_alloc;
981 int error, rg_locked; 981 int error, rg_locked, flags = LM_FLAG_TRY;
982 int loops = 0; 982 int loops = 0;
983 983
984 if (ip->i_rgd && rgrp_contains_block(ip->i_rgd, ip->i_goal)) 984 if (ip->i_rgd && rgrp_contains_block(ip->i_rgd, ip->i_goal))
@@ -997,7 +997,7 @@ static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
997 error = 0; 997 error = 0;
998 } else { 998 } else {
999 error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 999 error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE,
1000 LM_FLAG_TRY, &al->al_rgd_gh); 1000 flags, &al->al_rgd_gh);
1001 } 1001 }
1002 switch (error) { 1002 switch (error) {
1003 case 0: 1003 case 0:
@@ -1012,8 +1012,10 @@ static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
1012 /* fall through */ 1012 /* fall through */
1013 case GLR_TRYFAILED: 1013 case GLR_TRYFAILED:
1014 rgd = gfs2_rgrpd_get_next(rgd); 1014 rgd = gfs2_rgrpd_get_next(rgd);
1015 if (rgd == begin) 1015 if (rgd == begin) {
1016 flags = 0;
1016 loops++; 1017 loops++;
1018 }
1017 break; 1019 break;
1018 default: 1020 default:
1019 return error; 1021 return error;