diff options
author | Benjamin Marzinski <bmarzins@redhat.com> | 2010-11-24 00:52:55 -0500 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2010-11-30 10:41:54 -0500 |
commit | 086d8334cf73b3bb695b82dd864a7a8b00d96b7e (patch) | |
tree | acadf5458a2ccfde44049bcb7ba63e136844f875 /fs/gfs2 | |
parent | 0489b3f5eba735413ccedd425651cf41d6b1f7c5 (diff) |
GFS2: fix recursive locking during rindex truncates
When you truncate the rindex file, you need to avoid calling gfs2_rindex_hold,
since you already hold it. However, if you haven't already read in the
resource groups, you need to do that.
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/bmap.c | 9 | ||||
-rw-r--r-- | fs/gfs2/rgrp.c | 2 | ||||
-rw-r--r-- | fs/gfs2/rgrp.h | 1 |
3 files changed, 9 insertions, 3 deletions
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 5476c066d4ee..ae7d205de0d1 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c | |||
@@ -780,7 +780,11 @@ static int do_strip(struct gfs2_inode *ip, struct buffer_head *dibh, | |||
780 | if (metadata) | 780 | if (metadata) |
781 | revokes = (height) ? sdp->sd_inptrs : sdp->sd_diptrs; | 781 | revokes = (height) ? sdp->sd_inptrs : sdp->sd_diptrs; |
782 | 782 | ||
783 | error = gfs2_rindex_hold(sdp, &ip->i_alloc->al_ri_gh); | 783 | if (ip != GFS2_I(sdp->sd_rindex)) |
784 | error = gfs2_rindex_hold(sdp, &ip->i_alloc->al_ri_gh); | ||
785 | else if (!sdp->sd_rgrps) | ||
786 | error = gfs2_ri_update(ip); | ||
787 | |||
784 | if (error) | 788 | if (error) |
785 | return error; | 789 | return error; |
786 | 790 | ||
@@ -879,7 +883,8 @@ out_rg_gunlock: | |||
879 | out_rlist: | 883 | out_rlist: |
880 | gfs2_rlist_free(&rlist); | 884 | gfs2_rlist_free(&rlist); |
881 | out: | 885 | out: |
882 | gfs2_glock_dq_uninit(&ip->i_alloc->al_ri_gh); | 886 | if (ip != GFS2_I(sdp->sd_rindex)) |
887 | gfs2_glock_dq_uninit(&ip->i_alloc->al_ri_gh); | ||
883 | return error; | 888 | return error; |
884 | } | 889 | } |
885 | 890 | ||
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 6375b3860a9a..25dbe5c84dff 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c | |||
@@ -583,7 +583,7 @@ static int read_rindex_entry(struct gfs2_inode *ip, | |||
583 | * Returns: 0 on successful update, error code otherwise | 583 | * Returns: 0 on successful update, error code otherwise |
584 | */ | 584 | */ |
585 | 585 | ||
586 | static int gfs2_ri_update(struct gfs2_inode *ip) | 586 | int gfs2_ri_update(struct gfs2_inode *ip) |
587 | { | 587 | { |
588 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | 588 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
589 | struct inode *inode = &ip->i_inode; | 589 | struct inode *inode = &ip->i_inode; |
diff --git a/fs/gfs2/rgrp.h b/fs/gfs2/rgrp.h index 0e35c0466f9a..50c2bb04369c 100644 --- a/fs/gfs2/rgrp.h +++ b/fs/gfs2/rgrp.h | |||
@@ -48,6 +48,7 @@ extern int gfs2_inplace_reserve_i(struct gfs2_inode *ip, int hold_rindex, | |||
48 | 48 | ||
49 | extern void gfs2_inplace_release(struct gfs2_inode *ip); | 49 | extern void gfs2_inplace_release(struct gfs2_inode *ip); |
50 | 50 | ||
51 | extern int gfs2_ri_update(struct gfs2_inode *ip); | ||
51 | extern int gfs2_alloc_block(struct gfs2_inode *ip, u64 *bn, unsigned int *n); | 52 | extern int gfs2_alloc_block(struct gfs2_inode *ip, u64 *bn, unsigned int *n); |
52 | extern int gfs2_alloc_di(struct gfs2_inode *ip, u64 *bn, u64 *generation); | 53 | extern int gfs2_alloc_di(struct gfs2_inode *ip, u64 *bn, u64 *generation); |
53 | 54 | ||