diff -Naurw e2fsprogs-1.41.14/lib/ext2fs/Makefile.in e2fsprogs-1.41.14.mjn/lib/ext2fs/Makefile.in
--- e2fsprogs-1.41.14/lib/ext2fs/Makefile.in	2010-12-22 07:49:20.000000000 -0800
+++ e2fsprogs-1.41.14.mjn/lib/ext2fs/Makefile.in	2011-05-25 11:47:15.000000000 -0700
@@ -65,6 +65,7 @@
 	native.o \
 	newdir.o \
 	openfs.o \
+	progress.o \
 	read_bb.o \
 	read_bb_file.o \
 	res_gdt.o \
@@ -129,6 +130,7 @@
 	$(srcdir)/native.c \
 	$(srcdir)/newdir.c \
 	$(srcdir)/openfs.c \
+	$(srcdir)/progress.c \
 	$(srcdir)/read_bb.c \
 	$(srcdir)/read_bb_file.c \
 	$(srcdir)/res_gdt.c \
@@ -650,6 +652,7 @@
  $(srcdir)/ext2_fs.h $(srcdir)/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \
  $(srcdir)/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
  $(srcdir)/ext2_ext_attr.h $(srcdir)/bitops.h $(srcdir)/e2image.h
+progress.o: $(srcdir)/progress.c 
 read_bb.o: $(srcdir)/read_bb.c $(srcdir)/ext2_fs.h \
  $(top_builddir)/lib/ext2fs/ext2_types.h $(srcdir)/ext2fs.h \
  $(srcdir)/ext2_fs.h $(srcdir)/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \
diff -Naurw e2fsprogs-1.41.14/lib/ext2fs/closefs.c e2fsprogs-1.41.14.mjn/lib/ext2fs/closefs.c
--- e2fsprogs-1.41.14/lib/ext2fs/closefs.c	2010-12-22 07:49:20.000000000 -0800
+++ e2fsprogs-1.41.14.mjn/lib/ext2fs/closefs.c	2011-05-25 11:47:15.000000000 -0700
@@ -18,6 +18,7 @@
 
 #include "ext2_fs.h"
 #include "ext2fsP.h"
+#include "ext2fs/progress.h"
 
 static int test_root(int a, int b)
 {
@@ -292,10 +293,12 @@
 	else
 		old_desc_blocks = fs->desc_blocks;
 
+	progress_num_steps(fs->group_desc_count);
 	for (i = 0; i < fs->group_desc_count; i++) {
 		blk_t	super_blk, old_desc_blk, new_desc_blk;
 		int	meta_bg;
 
+		progress_step(1);
 		ext2fs_super_and_bgd_loc(fs, i, &super_blk, &old_desc_blk,
 					 &new_desc_blk, &meta_bg);
 
diff -Naurw e2fsprogs-1.41.14/lib/ext2fs/ext2fs.h e2fsprogs-1.41.14.mjn/lib/ext2fs/ext2fs.h
--- e2fsprogs-1.41.14/lib/ext2fs/ext2fs.h	2010-12-22 07:49:20.000000000 -0800
+++ e2fsprogs-1.41.14.mjn/lib/ext2fs/ext2fs.h	2011-05-25 11:47:15.000000000 -0700
@@ -282,6 +282,7 @@
 #define BLOCK_FLAG_DEPTH_TRAVERSE	2
 #define BLOCK_FLAG_DATA_ONLY	4
 #define BLOCK_FLAG_READ_ONLY	8
+#define BLOCK_FLAG_PROGRESS	16
 
 #define BLOCK_FLAG_NO_LARGE	0x1000
 
diff -Naurw e2fsprogs-1.41.14/lib/ext2fs/mkjournal.c e2fsprogs-1.41.14.mjn/lib/ext2fs/mkjournal.c
--- e2fsprogs-1.41.14/lib/ext2fs/mkjournal.c	2010-12-22 07:49:20.000000000 -0800
+++ e2fsprogs-1.41.14.mjn/lib/ext2fs/mkjournal.c	2011-05-25 11:47:15.000000000 -0700
@@ -36,6 +36,7 @@
 #include "e2p/e2p.h"
 #include "ext2fs.h"
 #include "jfs_user.h"
+#include "progress.h"
 
 /*
  * This function automatically sets up the journal superblock and
@@ -261,6 +262,7 @@
 	*blocknr = es->goal = new_blk;
 	ext2fs_block_alloc_stats(fs, new_blk, +1);
 
+	progress_step(1);
 	if (es->num_blocks == 0)
 		return (BLOCK_CHANGED | BLOCK_ABORT);
 	else
@@ -332,7 +334,8 @@
 	es.goal = (fs->super->s_blocks_per_group * group) +
 		fs->super->s_first_data_block;
 
-	retval = ext2fs_block_iterate2(fs, journal_ino, BLOCK_FLAG_APPEND,
+	progress_num_steps(es.num_blocks);
+	retval = ext2fs_block_iterate2(fs, journal_ino, BLOCK_FLAG_APPEND | BLOCK_FLAG_PROGRESS,
 				       0, mkjournal_proc, &es);
 	if (es.err) {
 		retval = es.err;
diff -Naurw e2fsprogs-1.41.14/lib/ext2fs/progress.c e2fsprogs-1.41.14.mjn/lib/ext2fs/progress.c
--- e2fsprogs-1.41.14/lib/ext2fs/progress.c	1969-12-31 16:00:00.000000000 -0800
+++ e2fsprogs-1.41.14.mjn/lib/ext2fs/progress.c	2011-05-25 11:47:15.000000000 -0700
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include "progress.h"
+
+struct progress {
+    int prog_fd;          /* file descriptor on which to print progress messages */
+    int prog_seg_start;   /* start value of current segment */
+    int prog_seg_end;     /* end value of current segment */
+    int prog_num_steps;   /* number of steps in current segment */
+    int prog_curr_step;   /* current step in the segment */
+    int prog_printed;     /* last value printed */
+};
+
+static struct progress g_progress = {-1,0,0,0,0,0};
+
+void progress_init(int fd)
+{
+    memset(&g_progress, 0, sizeof(g_progress));
+    g_progress.prog_fd = fd;
+    g_progress.prog_printed = -1;
+}
+
+void progress_segment(int start, int end)
+{
+    if (g_progress.prog_fd < 0) return;
+    g_progress.prog_seg_start = start;
+    g_progress.prog_seg_end = end;
+    g_progress.prog_num_steps = g_progress.prog_curr_step = 0;
+}
+
+int progress_segment_start(void)
+{
+    return g_progress.prog_seg_start;
+}
+
+int progress_segment_end(void)
+{
+    return g_progress.prog_seg_end;
+}
+
+void progress_num_steps(int steps)
+{
+    if (g_progress.prog_fd < 0) return;
+    g_progress.prog_num_steps = steps;
+    g_progress.prog_curr_step = 0;
+}
+
+void progress_step(int step)
+{
+    int seg_size;
+    int curr_step;
+    int value;
+    int len;
+    char buf[20];
+
+    if (g_progress.prog_fd < 0) return;
+    seg_size = g_progress.prog_seg_end - g_progress.prog_seg_start;
+    curr_step = g_progress.prog_curr_step;
+    if (curr_step >= g_progress.prog_num_steps)
+        curr_step = g_progress.prog_num_steps - 1;
+    g_progress.prog_curr_step += step;
+    value = (g_progress.prog_num_steps == 0) ? 0 :
+            (seg_size * curr_step) / g_progress.prog_num_steps;
+    value += g_progress.prog_seg_start;
+    if (value == g_progress.prog_printed)
+        return;
+    len = snprintf(buf, sizeof(buf), "%%%d\n", value);
+    write(g_progress.prog_fd, buf, len);
+    g_progress.prog_printed = value;
+}
diff -Naurw e2fsprogs-1.41.14/lib/ext2fs/progress.h e2fsprogs-1.41.14.mjn/lib/ext2fs/progress.h
--- e2fsprogs-1.41.14/lib/ext2fs/progress.h	1969-12-31 16:00:00.000000000 -0800
+++ e2fsprogs-1.41.14.mjn/lib/ext2fs/progress.h	2011-05-25 11:47:15.000000000 -0700
@@ -0,0 +1,43 @@
+
+#define MPROGRESS 1
+
+/*
+ * Progress is reported as an integer within a segment.
+ * The segment is a range within the full percentage range (0..100).
+ * The segment is divided into a number of steps.
+ * A client first calls progress_segment to define the segment start and end, 
+ * then calls progress_num_steps to specify the number of steps in the segment.
+ * Finally progress_step is called repeatedly to increment the step count.
+ */
+
+/*
+ * Initialize; called once per process.
+ * Print progress messages on file descriptor fd.
+ */
+extern void progress_init(int fd);
+
+/*
+ * Define current segment.
+ */
+extern void progress_segment(int start, int end);
+
+/*
+ * Return start of current segment.
+ */
+extern int progress_segment_start(void);
+
+/*
+ * Return end of current segment.
+ */
+extern int progress_segment_end(void);
+
+/*
+ * Set number of steps in current segment.
+ */
+extern void progress_num_steps(int steps);
+
+/*
+ * Advance progress in current segment by count steps.
+ */
+extern void progress_step(int count);
+
diff -Naurw e2fsprogs-1.41.14/lib/ext2fs/unix_io.c e2fsprogs-1.41.14.mjn/lib/ext2fs/unix_io.c
--- e2fsprogs-1.41.14/lib/ext2fs/unix_io.c	2010-12-22 07:49:20.000000000 -0800
+++ e2fsprogs-1.41.14.mjn/lib/ext2fs/unix_io.c	2011-05-25 11:49:54.000000000 -0700
@@ -461,6 +461,7 @@
 	data->io_stats.num_fields = 2;
 
 	open_flags = (flags & IO_FLAG_RW) ? O_RDWR : O_RDONLY;
+	open_flags |= O_SYNC; /* improves progress reporting */
 	if (flags & IO_FLAG_EXCLUSIVE)
 		open_flags |= O_EXCL;
 	if (flags & IO_FLAG_DIRECT_IO)
diff -Naurw e2fsprogs-1.41.14/lib/uuid/gen_uuid.c e2fsprogs-1.41.14.mjn/lib/uuid/gen_uuid.c
--- e2fsprogs-1.41.14/lib/uuid/gen_uuid.c	2009-08-12 18:39:57.000000000 -0700
+++ e2fsprogs-1.41.14.mjn/lib/uuid/gen_uuid.c	2011-05-25 11:47:15.000000000 -0700
@@ -104,10 +104,12 @@
 #define THREAD_LOCAL static
 #endif
 
+#if 0 // This segfaults on giga
 #if defined(__linux__) && defined(__NR_gettid) && defined(HAVE_JRAND48)
 #define DO_JRAND_MIX
 THREAD_LOCAL unsigned short jrand_seed[3];
 #endif
+#endif
 
 #ifdef _WIN32
 static void gettimeofday (struct timeval *tv, void *dummy)
diff -Naurw e2fsprogs-1.41.14/misc/mke2fs.c e2fsprogs-1.41.14.mjn/misc/mke2fs.c
--- e2fsprogs-1.41.14/misc/mke2fs.c	2010-12-22 15:29:04.000000000 -0800
+++ e2fsprogs-1.41.14.mjn/misc/mke2fs.c	2011-05-25 11:47:15.000000000 -0700
@@ -62,6 +62,7 @@
 #include "prof_err.h"
 #include "../version.h"
 #include "nls-enable.h"
+#include "ext2fs/progress.h"
 
 #define STRIDE_LENGTH 8
 
@@ -69,6 +70,12 @@
 #define ZAP_BOOTBLOCK
 #endif
 
+#ifdef MPROGRESS
+#define progress_segment_inode     40
+#define progress_segment_journal   98  /* don't really need this segment */
+#define progress_segment_end       100
+#endif
+
 extern int isatty(int);
 extern FILE *fpopen(const char *cmd, const char *mode);
 
@@ -297,6 +304,7 @@
 	ext2fs_badblocks_list_iterate_end(bb_iter);
 }
 
+#ifndef MPROGRESS
 /*
  * These functions implement a generalized progress meter.
  */
@@ -349,6 +357,7 @@
 		return;
 	fputs(_("done                            \n"), stdout);
 }
+#endif
 
 static void write_inode_tables(ext2_filsys fs, int lazy_flag, int itable_zeroed)
 {
@@ -356,6 +365,7 @@
 	blk_t		blk;
 	dgrp_t		i;
 	int		num, ipb;
+#ifndef MPROGRESS
 	struct progress_struct progress;
 
 	if (quiet)
@@ -363,9 +373,17 @@
 	else
 		progress_init(&progress, _("Writing inode tables: "),
 			      fs->group_desc_count);
+#endif
 
+#ifdef MPROGRESS
+	progress_num_steps(fs->group_desc_count);
+#endif
 	for (i = 0; i < fs->group_desc_count; i++) {
+#ifdef MPROGRESS
+		progress_step(1);
+#else
 		progress_update(&progress, i);
+#endif
 
 		blk = fs->group_desc[i].bg_inode_table;
 		num = fs->inode_blocks_per_group;
@@ -398,7 +416,9 @@
 		}
 	}
 	ext2fs_zero_blocks(0, 0, 0, 0, 0);
+#ifndef MPROGRESS
 	progress_close(&progress);
+#endif
 }
 
 static void create_root_dir(ext2_filsys fs)
@@ -542,7 +562,9 @@
 
 static void create_journal_dev(ext2_filsys fs)
 {
+#ifndef MPROGRESS
 	struct progress_struct progress;
+#endif
 	errcode_t		retval;
 	char			*buf;
 	blk_t			blk, err_blk;
@@ -555,14 +577,19 @@
 			_("while initializing journal superblock"));
 		exit(1);
 	}
+#ifndef MPROGRESS
 	if (quiet)
 		memset(&progress, 0, sizeof(progress));
 	else
 		progress_init(&progress, _("Zeroing journal device: "),
 			      fs->super->s_blocks_count);
+#endif
 
 	blk = 0;
 	count = fs->super->s_blocks_count;
+#ifdef MPROGRESS
+	progress_num_steps(count);
+#endif
 	while (count > 0) {
 		if (count > 1024)
 			c = 1024;
@@ -578,7 +605,11 @@
 		}
 		blk += c;
 		count -= c;
+#ifdef MPROGRESS
+		progress_step(c);
+#else
 		progress_update(&progress, blk);
+#endif
 	}
 	ext2fs_zero_blocks(0, 0, 0, 0, 0);
 
@@ -590,7 +621,9 @@
 			_("while writing journal superblock"));
 		exit(1);
 	}
+#ifndef MPROGRESS
 	progress_close(&progress);
+#endif
 }
 
 static void show_stats(ext2_filsys fs)
@@ -1265,7 +1298,7 @@
 	}
 
 	while ((c = getopt (argc, argv,
-		    "b:cf:g:G:i:jl:m:no:qr:s:t:vE:FI:J:KL:M:N:O:R:ST:U:V")) != EOF) {
+		    "b:cf:g:G:i:jl:m:no:p:qr:s:t:vE:FI:J:KL:M:N:O:R:ST:U:V")) != EOF) {
 		switch (c) {
 		case 'b':
 			blocksize = strtol(optarg, &tmp, 0);
@@ -1380,6 +1413,9 @@
 		case 'o':
 			creator_os = optarg;
 			break;
+		case 'p':
+			progress_init(atoi(optarg));
+			break;
 		case 'q':
 			quiet = 1;
 			break;
@@ -2085,6 +2121,9 @@
 	textdomain(NLS_CAT_NAME);
 #endif
 	PRS(argc, argv);
+#ifdef MPROGRESS
+	progress_segment(0, progress_segment_inode);
+#endif
 
 #ifdef CONFIG_TESTIO_DEBUG
 	if (getenv("TEST_IO_FLAGS") || getenv("TEST_IO_BLOCK")) {
@@ -2283,6 +2322,9 @@
 			}
 		}
 	}
+#ifdef MPROGRESS
+	progress_segment(progress_segment_inode, progress_segment_journal);
+#endif
 
 	if (journal_device) {
 		ext2_filsys	jfs;
@@ -2349,6 +2391,9 @@
 	}
 no_journal:
 
+#ifdef MPROGRESS
+	progress_segment(progress_segment_journal, progress_segment_end);
+#endif
 	if (!quiet)
 		printf(_("Writing superblocks and "
 		       "filesystem accounting information: "));
