From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Fri, 27 May 2011 10:23:27 +0100 Subject: [Cluster-devel] [PATCH] gfs2_grow: write one rindex entry and then the rest In-Reply-To: <1306443293-25821-1-git-send-email-bmarzins@redhat.com> References: <1306443293-25821-1-git-send-email-bmarzins@redhat.com> Message-ID: <1306488207.2857.5.camel@menhir> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Looks good to me, Steve. On Thu, 2011-05-26 at 15:54 -0500, Benjamin Marzinski wrote: > There is a problem with gfs2_grow when the rindex file is stuffed, or the > filesystem blocksize is smaller than the pagesize. When gfs2_grow writes > out all the rindex entries at once, there needs to be enough space left for > it to be able to write the first page of data without doing any allocations. > If there isn't gfs2_grow will fail, even though there is space for > additional resrouce groups in the last block of the rindex file. This patch > makes gfs2_grow write one rindex entry frist, to grow the filesystem by > one resource group's worth of space. Then it writes the rest. Since > the code guarantees that there will always be enough space in the rindex > file for one more rindex entry, the first write will never require an > allocation. > > Signed-off-by: Benjamin Marzinski > --- > gfs2/mkfs/main_grow.c | 14 ++++++++++++-- > 1 files changed, 12 insertions(+), 2 deletions(-) > > diff --git a/gfs2/mkfs/main_grow.c b/gfs2/mkfs/main_grow.c > index 03eb57b..81f492b 100644 > --- a/gfs2/mkfs/main_grow.c > +++ b/gfs2/mkfs/main_grow.c > @@ -244,8 +244,18 @@ static void fix_rindex(struct gfs2_sbd *sdp, int rindex_fd, int old_rg_count) > } > /* Now write the new RGs to the end of the rindex */ > lseek(rindex_fd, 0, SEEK_END); > - count = write(rindex_fd, buf, writelen); > - if (count != writelen) { > + count = write(rindex_fd, buf, sizeof(struct gfs2_rindex)); > + if (count != sizeof(struct gfs2_rindex)) { > + log_crit("Error writing first new rindex entry;" > + "aborted.\n"); > + if (count > 0) > + goto trunc; > + else > + goto out; > + } > + count = write(rindex_fd, buf + sizeof(struct gfs2_rindex), > + writelen - sizeof(struct gfs2_rindex)); > + if (count != writelen - sizeof(struct gfs2_rindex)) { > log_crit("Error writing new rindex entries;" > "aborted.\n"); > if (count > 0)