This is the mail archive of the cluster-cvs@sourceware.org mailing list for the cluster.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

cluster: STABLE3 - libgfs2: Remove die from fix_device_geometry


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=ad295e1cc89bc14ab8d41105f4570b99f931eb8d
Commit:        ad295e1cc89bc14ab8d41105f4570b99f931eb8d
Parent:        e625d0e4bb26cb03b05df5272e1a6c1c75cee999
Author:        Andrew Price <andy@andrewprice.me.uk>
AuthorDate:    Tue Apr 14 11:12:31 2009 +0100
Committer:     Andrew Price <andy@andrewprice.me.uk>
CommitterDate: Tue Apr 14 11:12:31 2009 +0100

libgfs2: Remove die from fix_device_geometry

This patch removes the die call from fix_device_geometry and adds error
reporting. All callers are updated to provide the same behaviour as before.

Signed-off-by: Andrew Price <andy@andrewprice.me.uk>
---
 gfs2/edit/hexedit.c            |    6 +++++-
 gfs2/edit/savemeta.c           |    6 +++++-
 gfs2/fsck/rgrepair.c           |    7 ++++++-
 gfs2/libgfs2/device_geometry.c |   10 ++++++----
 gfs2/libgfs2/libgfs2.h         |    2 +-
 gfs2/mkfs/main_grow.c          |    7 ++++++-
 gfs2/mkfs/main_mkfs.c          |    6 +++++-
 7 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
index ac21ebd..8a5f3bb 100644
--- a/gfs2/edit/hexedit.c
+++ b/gfs2/edit/hexedit.c
@@ -1752,7 +1752,11 @@ void read_superblock(int fd)
 	}
 	block = 0x10 * (GFS2_DEFAULT_BSIZE / sbd.bsize);
 	device_geometry(&sbd);
-	fix_device_geometry(&sbd);
+	if (fix_device_geometry(&sbd)) {
+		fprintf(stderr, "Device is too small (%"PRIu64" bytes)\n",
+				sbd.device.length << GFS2_BASIC_BLOCK_SHIFT);
+		exit(-1);
+	}
 	if(gfs1) {
 		sbd.sd_inptrs = (sbd.bsize - sizeof(struct gfs_indirect)) /
 			sizeof(uint64_t);
diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
index 7c2ba04..2f70a24 100644
--- a/gfs2/edit/savemeta.c
+++ b/gfs2/edit/savemeta.c
@@ -477,7 +477,11 @@ void savemeta(char *out_fn, int saveoption)
 			fprintf(stderr, "Geometery error\n");
 			exit(-1);
 		}
-		fix_device_geometry(&sbd);
+		if (fix_device_geometry(&sbd)) {
+			fprintf(stderr, "Device is too small (%"PRIu64" bytes)\n",
+				sbd.device.length << GFS2_BASIC_BLOCK_SHIFT);
+			exit(-1);
+		}
 		osi_list_init(&sbd.rglist);
 		init_buf_list(&sbd, &sbd.buf_list, 128 << 20);
 		init_buf_list(&sbd, &sbd.nvbuf_list, 0xffffffff);
diff --git a/gfs2/fsck/rgrepair.c b/gfs2/fsck/rgrepair.c
index 4ddd740..948d041 100644
--- a/gfs2/fsck/rgrepair.c
+++ b/gfs2/fsck/rgrepair.c
@@ -346,7 +346,12 @@ int gfs2_rindex_calculate(struct gfs2_sbd *sdp, osi_list_t *ret_list,
 		fprintf(stderr, "Geometry error\n");
 		exit(-1);
 	}
-	fix_device_geometry(sdp);
+	if (fix_device_geometry(sdp)) {
+		fprintf(stderr, "Device is too small (%"PRIu64" bytes)\n",
+				sdp->device.length << GFS2_BASIC_BLOCK_SHIFT);
+		exit(-1);
+	}
+
 	/* Compute the default resource group layout as mkfs would have done */
 	compute_rgrp_layout(sdp, FALSE);
 	build_rgrps(sdp, FALSE); /* FALSE = calc but don't write to disk. */
diff --git a/gfs2/libgfs2/device_geometry.c b/gfs2/libgfs2/device_geometry.c
index f37defa..b2d5861 100644
--- a/gfs2/libgfs2/device_geometry.c
+++ b/gfs2/libgfs2/device_geometry.c
@@ -43,7 +43,7 @@ int device_geometry(struct gfs2_sbd *sdp)
  *
  */
 
-void fix_device_geometry(struct gfs2_sbd *sdp)
+int fix_device_geometry(struct gfs2_sbd *sdp)
 {
 	struct device *device = &sdp->device;
 	unsigned int bbsize = sdp->bsize >> GFS2_BASIC_BLOCK_SHIFT;
@@ -61,9 +61,10 @@ void fix_device_geometry(struct gfs2_sbd *sdp)
 	start = device->start;
 	length = device->length;
 
-	if (length < 1 << (20 - GFS2_BASIC_BLOCK_SHIFT))
-		die("device is way too small (%"PRIu64" bytes)\n",
-		    length << GFS2_BASIC_BLOCK_SHIFT);
+	if (length < 1 << (20 - GFS2_BASIC_BLOCK_SHIFT)) {
+		errno = ENOSPC;
+		return -1;
+	}
 
 	remainder = start % bbsize;
 	if (remainder) {
@@ -85,4 +86,5 @@ void fix_device_geometry(struct gfs2_sbd *sdp)
 		       device->start, device->length, device->rgf_flags);
 		printf("\nDevice Size: %"PRIu64"\n", sdp->device_size);
 	}
+	return 0;
 }
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index 0742f9e..633aff3 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -398,7 +398,7 @@ extern void __bcommit(struct buf_list *bl, int line, const char *caller);
 
 /* device_geometry.c */
 extern int device_geometry(struct gfs2_sbd *sdp);
-extern void fix_device_geometry(struct gfs2_sbd *sdp);
+extern int fix_device_geometry(struct gfs2_sbd *sdp);
 
 /* fs_bits.c */
 #define BFITNOENT (0xFFFFFFFF)
diff --git a/gfs2/mkfs/main_grow.c b/gfs2/mkfs/main_grow.c
index 3593629..b686bd7 100644
--- a/gfs2/mkfs/main_grow.c
+++ b/gfs2/mkfs/main_grow.c
@@ -297,7 +297,12 @@ main_grow(int argc, char *argv[])
 		if(read_sb(sdp) < 0)
 			die("gfs: Error reading superblock.\n");
 
-		fix_device_geometry(sdp);
+		if (fix_device_geometry(sdp)) {
+			fprintf(stderr, "Device is too small (%"PRIu64" bytes)\n",
+				sdp->device.length << GFS2_BASIC_BLOCK_SHIFT);
+			exit(-1);
+		}
+
 		if (mount_gfs2_meta(sdp)) {
 			fprintf(stderr, "Error mounting GFS2 metafs: %s\n",
 					strerror(errno));
diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
index c1b6795..fc53ae3 100644
--- a/gfs2/mkfs/main_mkfs.c
+++ b/gfs2/mkfs/main_mkfs.c
@@ -533,7 +533,11 @@ main_mkfs(int argc, char *argv[])
 		}
 		sdp->device.length = sdp->orig_fssize;
 	}
-	fix_device_geometry(sdp);
+	if (fix_device_geometry(sdp)) {
+		fprintf(stderr, "Device is too small (%"PRIu64" bytes)\n",
+				sdp->device.length << GFS2_BASIC_BLOCK_SHIFT);
+		exit(-1);
+	}
 
 	/* Compute the resource group layouts */
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]