[Ocfs2-tools-commits] manish commits r238 - trunk/mkfs.ocfs2

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Wed Sep 15 21:07:18 CDT 2004


Author: manish
Date: 2004-09-15 21:07:16 -0500 (Wed, 15 Sep 2004)
New Revision: 238

Modified:
   trunk/mkfs.ocfs2/mkfs.c
Log:
heuristics for mkfs. also print a warning for very large bitmaps


Modified: trunk/mkfs.ocfs2/mkfs.c
===================================================================
--- trunk/mkfs.ocfs2/mkfs.c	2004-09-16 00:13:43 UTC (rev 237)
+++ trunk/mkfs.ocfs2/mkfs.c	2004-09-16 02:07:16 UTC (rev 238)
@@ -94,7 +94,14 @@
 
 #define ONE_GB_SHIFT           30
 
+#define BITMAP_WARNING_LEN     1572864
+#define BITMAP_AUTO_MAX        786432
 
+#define MAX_CLUSTER_SIZE       1048576
+#define MIN_CLUSTER_SIZE       4096
+#define AUTO_CLUSTER_SIZE      65536
+
+
 enum {
 	SFI_JOURNAL,
 	SFI_BITMAP,
@@ -321,12 +328,17 @@
 	system_dir = alloc_directory(s);
 	orphan_dir = alloc_directory(s);
 
+	need = (s->volume_size_in_clusters + 7) >> 3;
+	need = ((need + s->cluster_size - 1) >> s->cluster_size_bits) << s->cluster_size_bits;
+
+	if (need > BITMAP_WARNING_LEN)
+		fprintf(stderr, "WARNING: bitmap is very large, consider using "
+				"a larger cluster size and/or\na smaller "
+				"volume\n");
+
 	if (!s->quiet)
 		printf("Creating bitmaps: ");
 
-	need = (s->volume_size_in_clusters + 7) >> 3;
-	need = ((need + s->cluster_size - 1) >> s->cluster_size_bits) << s->cluster_size_bits;
-
 	tmprec = &(record[GLOBAL_BITMAP_SYSTEM_INODE][0]);
 	tmprec->extent_off = 0;
 	tmprec->extent_len = need;
@@ -526,7 +538,7 @@
 			    val > OCFS2_MAX_BLOCKSIZE) {
 				com_err(progname, 0,
 					"Invalid blocksize %s: "
-					"must be between %d and %d",
+					"must be between %d and %d bytes",
 					optarg,
 					OCFS2_MIN_BLOCKSIZE,
 					OCFS2_MAX_BLOCKSIZE);
@@ -539,9 +551,15 @@
 		case 'c':
 			ret = get_number(optarg, &val);
 
-			if (ret) {
+			if (ret ||
+			    val < MIN_CLUSTER_SIZE ||
+			    val > MAX_CLUSTER_SIZE) {
 				com_err(progname, 0,
-					"Invalid cluster size %s", optarg);
+					"Invalid cluster size %s: "
+					"must be between %d and %d bytes",
+					optarg,
+					MIN_CLUSTER_SIZE,
+					MAX_CLUSTER_SIZE);
 				exit(1);
 			}
 
@@ -708,8 +726,6 @@
 static void
 fill_defaults(State *s)
 {
-	/* XXX: Basics, needs to be redone */
-
 	size_t pagesize;
 	errcode_t err;
 	uint32_t ret;
@@ -718,24 +734,63 @@
 
 	s->pagesize_bits = get_bits(s, pagesize);
 
-	if (!s->blocksize) {
+	if (!s->blocksize)
 		s->blocksize = 4096;
+
+	if (!s->volume_size_in_blocks) {
+		err = ocfs2_get_device_size(s->device_name, s->blocksize, &ret);
+		s->volume_size_in_blocks = ret;
 	}
 
+	s->volume_size_in_bytes = s->volume_size_in_blocks * s->blocksize;
+
+	if (!s->blocksize) {
+		if (s->volume_size_in_bytes <= 1024 * 1024 * 3) {
+			s->blocksize = 512;
+		} else {
+			int shift = 30;
+
+			while (s->blocksize > 1024) {
+				if (s->volume_size_in_bytes >= 1U << shift)
+					break;
+				s->blocksize >>= 1;
+				shift--;
+			}
+		}
+
+		err = ocfs2_get_device_size(s->device_name, s->blocksize, &ret);
+		s->volume_size_in_blocks = ret;
+
+		s->volume_size_in_bytes =
+			s->volume_size_in_blocks * s->blocksize;
+	}
+
 	s->blocksize_bits = get_bits(s, s->blocksize);
 
 	if (!s->cluster_size) {
-		s->cluster_size = 4096;
+		uint32_t volume_size, cluster_size, cluster_size_bits, need;
+
+		for (cluster_size = MIN_CLUSTER_SIZE;
+		     cluster_size < AUTO_CLUSTER_SIZE;
+		     cluster_size <<= 1) {
+			cluster_size_bits = get_bits(s, cluster_size);
+
+			volume_size =
+				s->volume_size_in_bytes >> cluster_size_bits;
+
+			need = (volume_size + 7) >> 3;
+			need = ((need + cluster_size - 1) >>
+				cluster_size_bits) << cluster_size_bits;
+
+			if (need <= BITMAP_AUTO_MAX) 
+				break;
+		}
+
+		s->cluster_size = cluster_size;
 	}
 
 	s->cluster_size_bits = get_bits(s, s->cluster_size);
 
-	if (!s->volume_size_in_blocks) {
-		err = ocfs2_get_device_size(s->device_name, s->blocksize, &ret);
-		s->volume_size_in_blocks = ret;
-	}
-
-	s->volume_size_in_bytes = s->volume_size_in_blocks * s->blocksize;
 	s->volume_size_in_clusters = s->volume_size_in_bytes >> s->cluster_size_bits;
 	s->volume_size_in_blocks = (s->volume_size_in_clusters << s->cluster_size_bits) >> s->blocksize_bits;
 	



More information about the Ocfs2-tools-commits mailing list