From: Bob Peterson Date: Wed, 30 May 2018 08:23:51 -0400 (EDT) Subject: [Cluster-devel] [RHEL6.10 PATCH] GFS2: allow gfs2_write_calc_reserv to use minimum values for rindex In-Reply-To: <703594571.38276595.1527682769851.JavaMail.zimbra@redhat.com> Message-ID: <68146999.38277295.1527683031995.JavaMail.zimbra@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, QE found problems with the previous patch for bug #1384184. This replacement patch reverts the first patch and adds new code that passes the QE tests. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1384184 Upstream Status: N/A (not needed upstream) Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=16448851 Tested: by Justin Payne on virt host-029 GFS2: allow gfs2_write_calc_reserv to use minimum values for rindex Before this patch function gfs2_write_calc_reserv built in several "slop" blocks into its calculations for the number of blocks required to do a write. This was fine for the most part, but when the file system is down to its last blocks, and needs to be extended with gfs2_grow, the rindex file needs to use a minimum amount of blocks. This patch makes a special exception for the rindex file, which now calculates a bare minimum number of blocks we need to allocate. Signed-off-by: Bob Peterson --- fs/gfs2/bmap.c | 2 +- fs/gfs2/bmap.h | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 2d2b14371b72..9e6d6775fbf7 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -1375,7 +1375,7 @@ int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, *alloc_required = 0; - if (!len || &ip->i_inode == sdp->sd_rindex) + if (!len) return 0; if (gfs2_is_stuffed(ip)) { diff --git a/fs/gfs2/bmap.h b/fs/gfs2/bmap.h index c68252a61a26..191f5df092f2 100644 --- a/fs/gfs2/bmap.h +++ b/fs/gfs2/bmap.h @@ -35,6 +35,19 @@ static inline void gfs2_write_calc_reserv(const struct gfs2_inode *ip, unsigned int tmp; BUG_ON(gfs2_is_dir(ip)); + if (&ip->i_inode == sdp->sd_rindex) { + const u64 *arr = sdp->sd_heightsize; + int h = ip->i_height; + + *data_blocks = (len + sdp->sd_sb.sb_bsize - + 1) >> sdp->sd_sb.sb_bsize_shift; + *ind_blocks = 0; + while (i_size_read(&ip->i_inode) + len > arr[h]) { + h++; + (*ind_blocks)++; + } + return; + } *data_blocks = (len >> sdp->sd_sb.sb_bsize_shift) + 3; *ind_blocks = 3 * (sdp->sd_max_height - 1);