[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