From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Tue, 30 Nov 2010 16:05:32 +0000 Subject: [Cluster-devel] [PATCH] GFS2: fix recursive locking during rindex truncates In-Reply-To: <20101124055255.GM13763@ether.msp.redhat.com> References: <20101124055255.GM13763@ether.msp.redhat.com> Message-ID: <1291133132.2448.15.camel@dolmen> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Now in the -nmw git tree. Thanks, Steve. On Tue, 2010-11-23 at 23:52 -0600, Benjamin Marzinski wrote: > 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 > --- > fs/gfs2/bmap.c | 9 +++++++-- > fs/gfs2/rgrp.c | 2 +- > fs/gfs2/rgrp.h | 1 + > 3 files changed, 9 insertions(+), 3 deletions(-) > > Index: gfs2-2.6-nmw/fs/gfs2/bmap.c > =================================================================== > --- gfs2-2.6-nmw.orig/fs/gfs2/bmap.c > +++ gfs2-2.6-nmw/fs/gfs2/bmap.c > @@ -780,7 +780,11 @@ static int do_strip(struct gfs2_inode *i > if (metadata) > revokes = (height) ? sdp->sd_inptrs : sdp->sd_diptrs; > > - error = gfs2_rindex_hold(sdp, &ip->i_alloc->al_ri_gh); > + if (ip != GFS2_I(sdp->sd_rindex)) > + error = gfs2_rindex_hold(sdp, &ip->i_alloc->al_ri_gh); > + else if (!sdp->sd_rgrps) > + error = gfs2_ri_update(ip); > + > if (error) > return error; > > @@ -879,7 +883,8 @@ out_rg_gunlock: > out_rlist: > gfs2_rlist_free(&rlist); > out: > - gfs2_glock_dq_uninit(&ip->i_alloc->al_ri_gh); > + if (ip != GFS2_I(sdp->sd_rindex)) > + gfs2_glock_dq_uninit(&ip->i_alloc->al_ri_gh); > return error; > } > > Index: gfs2-2.6-nmw/fs/gfs2/rgrp.c > =================================================================== > --- gfs2-2.6-nmw.orig/fs/gfs2/rgrp.c > +++ gfs2-2.6-nmw/fs/gfs2/rgrp.c > @@ -583,7 +583,7 @@ static int read_rindex_entry(struct gfs2 > * Returns: 0 on successful update, error code otherwise > */ > > -static int gfs2_ri_update(struct gfs2_inode *ip) > +int gfs2_ri_update(struct gfs2_inode *ip) > { > struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); > struct inode *inode = &ip->i_inode; > Index: gfs2-2.6-nmw/fs/gfs2/rgrp.h > =================================================================== > --- gfs2-2.6-nmw.orig/fs/gfs2/rgrp.h > +++ gfs2-2.6-nmw/fs/gfs2/rgrp.h > @@ -46,6 +46,7 @@ gfs2_inplace_reserve_i((ip), __FILE__, _ > > extern void gfs2_inplace_release(struct gfs2_inode *ip); > > +extern int gfs2_ri_update(struct gfs2_inode *ip); > extern int gfs2_alloc_block(struct gfs2_inode *ip, u64 *bn, unsigned int *n); > extern int gfs2_alloc_di(struct gfs2_inode *ip, u64 *bn, u64 *generation); > >