From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andreas Gruenbacher Date: Thu, 31 May 2018 13:08:23 +0200 Subject: [Cluster-devel] [GFS2 PATCH] GFS2: Fix allocation error bug with recursive rgrp glocking In-Reply-To: <492648779.38585592.1527707671394.JavaMail.zimbra@redhat.com> References: <492648779.38585592.1527707671394.JavaMail.zimbra@redhat.com> Message-ID: <20180531110823.29096-1-agruenba@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Bob, On 30 May 2018 at 21:14, Bob Peterson wrote: > Before this patch function gfs2_write_begin, upon discovering an > error, called gfs2_trim_blocks while the rgrp glock was still held. > That's because gfs2_inplace_release is not called until later. agreed. > This patch reorganizes the logic a bit so gfs2_inplace_release > is called to release the lock prior to the call to gfs2_trim_blocks, > thus preventing the glock recursion. gfs2_trim_blocks only needs to be called after __block_write_begin but with your proposed patch, it also ends up being called on other error paths. This complicates gfs2_write_begin, so how about the below patch instead? Thanks, Andreas --- fs/gfs2/aops.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index f58716567972..66e7172e0134 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -747,18 +747,21 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping, put_page(page); gfs2_trans_end(sdp); - if (pos + len > ip->i_inode.i_size) - gfs2_trim_blocks(&ip->i_inode); - goto out_trans_fail; + if (alloc_required) { + gfs2_inplace_release(ip); + if (pos + len > ip->i_inode.i_size) + gfs2_trim_blocks(&ip->i_inode); + } + goto out_qunlock; out_endtrans: gfs2_trans_end(sdp); out_trans_fail: - if (alloc_required) { + if (alloc_required) gfs2_inplace_release(ip); out_qunlock: + if (alloc_required) gfs2_quota_unlock(ip); - } out_unlock: if (&ip->i_inode == sdp->sd_rindex) { gfs2_glock_dq(&m_ip->i_gh); -- 2.17.0