Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 523abe7c546805181ea3969b61d01aa23402335e
Parent: 0ef78df8e40c238e3b5734bfc45c43c77bb5252a
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Fri Sep 30 11:01:54 2011 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Fri Sep 30 11:01:54 2011 -0500
gfs2-utils: gfs2_grow fails to grow a filesystem with less than 3 RGs
This patch fixes a problem with gfs2-utils whereby some of the utils
couldn't handle a small file system with one or two rgrps.
The biggest offender was gfs2_grow: you couldn't successfully
gfs2_grow a file system that was so small that it had only one
resource group. Also, "gfs2_edit savemeta" couldn't save it.
This patch fixes the problem by creating a generic rgrp_size function
in libgfs2 that calculates the size rather than judging its
distance from the previous rgrp.
rhbz#730091
---
gfs2/edit/savemeta.c | 7 ++-----
gfs2/libgfs2/fs_geometry.c | 5 ++---
gfs2/libgfs2/libgfs2.h | 5 +++++
gfs2/libgfs2/super.c | 4 ++--
gfs2/mkfs/main_grow.c | 25 +++++++++----------------
5 files changed, 20 insertions(+), 26 deletions(-)
diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
index c868edd..fd0e1e4 100644
--- a/gfs2/edit/savemeta.c
+++ b/gfs2/edit/savemeta.c
@@ -646,7 +646,7 @@ void savemeta(char *out_fn, int saveoption, int gziplevel)
int rgcount;
uint64_t jindex_block;
struct gfs2_buffer_head *lbh;
- struct rgrp_list *last_rgd, *prev_rgd;
+ struct rgrp_list *last_rgd;
struct metafd mfd;
slow = (saveoption == 1);
@@ -725,10 +725,7 @@ void savemeta(char *out_fn, int saveoption, int gziplevel)
slow = ri_update(&sbd, 0, &rgcount, &sane);
last_rgd = osi_list_entry(sbd.rglist.prev,
struct rgrp_list, list);
- prev_rgd = osi_list_entry(last_rgd->list.prev,
- struct rgrp_list, list);
- fssize = last_rgd->ri.ri_addr +
- (last_rgd->ri.ri_addr - prev_rgd->ri.ri_addr);
+ fssize = last_rgd->ri.ri_addr + rgrp_size(last_rgd);
last_fs_block = fssize;
fssize *= sbd.bsize;
printf("Done. File system size: %s\n\n",
diff --git a/gfs2/libgfs2/fs_geometry.c b/gfs2/libgfs2/fs_geometry.c
index 105ce7b..9969577 100644
--- a/gfs2/libgfs2/fs_geometry.c
+++ b/gfs2/libgfs2/fs_geometry.c
@@ -67,8 +67,7 @@ void compute_rgrp_layout(struct gfs2_sbd *sdp, int rgsize_specified)
struct device *dev;
struct rgrp_list *rl, *rlast = NULL, *rlast2 = NULL;
osi_list_t *tmp, *head = &sdp->rglist;
- unsigned int rgrp = 0, nrgrp;
- uint64_t rglength;
+ unsigned int rgrp = 0, nrgrp, rglength;
sdp->new_rgrps = 0;
dev = &sdp->device;
@@ -100,7 +99,7 @@ void compute_rgrp_layout(struct gfs2_sbd *sdp, int rgsize_specified)
rlast = rl;
}
rlast->start = rlast->ri.ri_addr;
- rglength = rlast->ri.ri_addr - rlast2->ri.ri_addr;
+ rglength = rgrp_size(rlast);
rlast->length = rglength;
old_length = rlast->ri.ri_addr + rglength;
new_chunk = dev->length - old_length;
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index 3e1b11d..2231399 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -669,6 +669,11 @@ extern struct rgrp_list *gfs2_blk2rgrpd(struct gfs2_sbd *sdp,
uint64_t blk);
extern uint64_t gfs2_rgrp_read(struct gfs2_sbd *sdp, struct rgrp_list *rgd);
extern void gfs2_rgrp_relse(struct rgrp_list *rgd);
extern void gfs2_rgrp_free(osi_list_t *rglist);
+/* figure out the size of the given resource group, in blocks */
+static inline unsigned int rgrp_size(struct rgrp_list *rgrp)
+{
+ return rgrp->ri.ri_data + rgrp->ri.ri_length;
+}
/* structures.c */
extern int build_master(struct gfs2_sbd *sdp);
diff --git a/gfs2/libgfs2/super.c b/gfs2/libgfs2/super.c
index 1d93e4c..51a8047 100644
--- a/gfs2/libgfs2/super.c
+++ b/gfs2/libgfs2/super.c
@@ -190,7 +190,7 @@ int rindex_read(struct gfs2_sbd *sdp, int fd, int *count1, int *sane)
prev_length != rgd->start - prev_rgd->start)
*sane = 0;
prev_length = rgd->start - prev_rgd->start;
- prev_rgd->length = prev_length;
+ prev_rgd->length = rgrp_size(prev_rgd);
}
if(gfs2_compute_bitstructs(sdp, rgd)) {
@@ -202,7 +202,7 @@ int rindex_read(struct gfs2_sbd *sdp, int fd, int *count1, int *sane)
prev_rgd = rgd;
}
if (prev_rgd)
- prev_rgd->length = prev_length;
+ prev_rgd->length = rgrp_size(prev_rgd);
return 0;
}
diff --git a/gfs2/mkfs/main_grow.c b/gfs2/mkfs/main_grow.c
index e5c0466..252bcb2 100644
--- a/gfs2/mkfs/main_grow.c
+++ b/gfs2/mkfs/main_grow.c
@@ -119,21 +119,6 @@ static void decode_arguments(int argc, char *argv[], struct gfs2_sbd
*sdp)
}
/**
- * figure_out_rgsize
- */
-static void figure_out_rgsize(struct gfs2_sbd *sdp, unsigned int *orgsize)
-{
- osi_list_t *head = &sdp->rglist;
- struct rgrp_list *r1, *r2;
-
- sdp->rgsize = GFS2_DEFAULT_RGSIZE;
- r1 = osi_list_entry(head->next->next, struct rgrp_list, list);
- r2 = osi_list_entry(head->next->next->next, struct rgrp_list, list);
-
- *orgsize = r2->ri.ri_addr - r1->ri.ri_addr;
-}
-
-/**
* filesystem_size - Calculate the size of the filesystem
*
* Reads the lists of resource groups in order to
@@ -311,6 +296,7 @@ main_grow(int argc, char *argv[])
while ((argc - optind) > 0) {
int sane;
+ struct rgrp_list *last_rgrp;
sdp->path_name = argv[optind++];
sdp->path_fd = open(sdp->path_name, O_RDONLY);
@@ -354,7 +340,13 @@ main_grow(int argc, char *argv[])
/* the existing RGs, and only write to the index at EOF. */
ri_update(sdp, rindex_fd, &rgcount, &sane);
fssize = filesystem_size(sdp);
- figure_out_rgsize(sdp, &rgsize);
+ if (osi_list_empty(head)) {
+ log_err(_("Error: No resource groups found.\n"));
+ goto out;
+ }
+ last_rgrp = osi_list_entry(head->prev, struct rgrp_list, list);
+ sdp->rgsize = GFS2_DEFAULT_RGSIZE;
+ rgsize = rgrp_size(last_rgrp);
fsgrowth = ((sdp->device.length - fssize) * sdp->bsize);
if (fsgrowth < rgsize * sdp->bsize) {
log_err( _("Error: The device has grown by less than "
@@ -372,6 +364,7 @@ main_grow(int argc, char *argv[])
initialize_new_portion(sdp, &old_rg_count);
fix_rindex(sdp, rindex_fd, old_rg_count);
}
+ out:
/* Delete the remaining RGs from the rglist */
while (!osi_list_empty(head))
osi_list_del(head->next);