diff -u --recursive dosfstools-2.8/CHANGES dosfstools-2.8vb2/CHANGES
--- dosfstools-2.8/CHANGES	Wed Feb 28 08:04:19 2001
+++ dosfstools-2.8vb2/CHANGES	Mon Feb 24 21:22:27 2003
@@ -1,3 +1,15 @@
+version 2.8vb1
+==============
+
+ - mkdosfs: Print usage message if no device specified, fix s390
+   from RedHat.
+ - mkdosfs: Automatically select FAT32 and cluster size based on
+   Microsoft criteria.
+ - modosfs: Added low memory mode (-M).
+ - dosfsck: Fix for FAT32 on 64 bit platforms, check end of filesystem 
+   from Richard Hirst <rhirst@linuxcare.com>.
+ - dosfsck: Clean up exit values.
+ - dosfsck: Add low memory mode (-m).
 
 version 2.8
 ===========
diff -u --recursive dosfstools-2.8/dosfsck/boot.c dosfstools-2.8vb2/dosfsck/boot.c
--- dosfstools-2.8/dosfsck/boot.c	Tue Nov 28 08:20:02 2000
+++ dosfstools-2.8vb2/dosfsck/boot.c	Sat Feb 22 17:47:29 2003
@@ -281,6 +281,9 @@
 	die("Currently, only 2 FATs are supported, not %d.\n",b.fats);
     sectors = GET_UNALIGNED_W(b.sectors);
     total_sectors = sectors ? sectors : CF_LE_L(b.total_sect);
+    if (verbose) printf("Checking we can access the last sector of the filesystem\n");
+    /* Can't access last odd sector anyway, so round down */
+    fs_test((loff_t)((total_sectors & ~1)-1)*(loff_t)logical_sector_size, logical_sector_size);
     fat_length = CF_LE_W(b.fat_length) ?
 		 CF_LE_W(b.fat_length) : CF_LE_L(b.fat32_length);
     fs->fat_start = (loff_t)CF_LE_W(b.reserved)*logical_sector_size;
diff -u --recursive dosfstools-2.8/dosfsck/common.c dosfstools-2.8vb2/dosfsck/common.c
--- dosfstools-2.8/dosfsck/common.c	Fri Apr 30 06:49:24 1999
+++ dosfstools-2.8vb2/dosfsck/common.c	Mon Feb 24 20:54:33 2003
@@ -29,7 +29,7 @@
     vfprintf(stderr,msg,args);
     va_end(args);
     fprintf(stderr,"\n");
-    exit(1);
+    exit(2);
 }
 
 
@@ -41,7 +41,7 @@
     vfprintf(stderr,msg,args);
     va_end(args);
     fprintf(stderr,":%s\n",strerror(errno));
-    exit(1);
+    exit(2);
 }
 
 
Binary files dosfstools-2.8/dosfsck/dosfsck and dosfstools-2.8vb2/dosfsck/dosfsck differ
diff -u --recursive dosfstools-2.8/dosfsck/dosfsck.8 dosfstools-2.8vb2/dosfsck/dosfsck.8
--- dosfstools-2.8/dosfsck/dosfsck.8	Mon Feb 28 00:55:17 2000
+++ dosfstools-2.8vb2/dosfsck/dosfsck.8	Mon Feb 24 21:19:16 2003
@@ -4,7 +4,7 @@
 .SH SYNOPSIS
 .ad l
 .B dosfsck
-.RB [ \-aAflrtvVwy ]
+.RB [ \-aAflmprtvVwy ]
 .RB [ \-d\ \fIpath\fB\ \-d\ \fI...\fB ]
 .RB [ \-u\ \fIpath\fB\ \-u\ \fI...\fB ]
 .I device
@@ -95,6 +95,10 @@
 added to the free disk space except in auto mode (\fB-a\fP).
 .IP \fB\-l\fP
 List path names of files being processed.
+.IP \fB\-m\fP
+Use less memory during check.  Only works on FAT32.
+.IP \fB\-p\fP
+Print volume name and exit.
 .IP \fB\-r\fP
 Interactively repair the file system. The user is asked for advice whenever
 there is more than one approach to fix an inconsistency.  This is the default
@@ -125,10 +129,11 @@
 .IP 0
 No recoverable errors have been detected.
 .IP 1
-Recoverable errors have been detected or \fBdosfsck\fP has discovered an
-internal inconsistency.
+Recoverable errors have been detected.
 .IP 2
-Usage error. \fBdosfsck\fP did not access the file system.
+Usage error. \fBdosfsck\fP did not access the file system.  \fBdosfsck\fP
+has discovered an internal inconsistency.
+
 .SH BUGS
 Does not create . and .. files where necessary. Does not remove entirely
 empty directories. Should give more diagnostic messages. Undeleting files
@@ -136,6 +141,7 @@
 .\".SH "SEE ALSO"
 .\"fs(5)
 .SH AUTHORS
-Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
+Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>,
+Vince Busam <vince@sixpak.org>
 Extensions (FAT32, VFAT) by and current maintainer:
 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
diff -u --recursive dosfstools-2.8/dosfsck/dosfsck.c dosfstools-2.8vb2/dosfsck/dosfsck.c
--- dosfstools-2.8/dosfsck/dosfsck.c	Tue Feb 25 15:24:59 2003
+++ dosfstools-2.8vb2/dosfsck/dosfsck.c	Mon Feb 24 21:13:10 2003
@@ -9,6 +9,7 @@
 #include "../version.h"
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <getopt.h>
@@ -22,7 +23,7 @@
 #include "check.h"
 
 
-int interactive = 0,list = 0,test = 0,verbose = 0,write_immed = 0;
+int interactive = 0,list = 0,test = 0,verbose = 0,write_immed = 0,low_mem = 0;
 int atari_format = 0;
 unsigned n_files = 0;
 void *mem_queue = NULL;
@@ -37,6 +38,8 @@
     fprintf(stderr,"  -d path  drop that file\n");
     fprintf(stderr,"  -f       salvage unused chains to files\n");
     fprintf(stderr,"  -l       list path names\n");
+    fprintf(stderr,"  -m       reduce memory usage\n");
+    fprintf(stderr,"  -p       print volume name and exit\n");
     fprintf(stderr,"  -r       interactively repair the file system\n");
     fprintf(stderr,"  -t       test for bad clusters\n");
     fprintf(stderr,"  -u path  try to undelete that (non-directory) file\n");
@@ -82,12 +85,14 @@
     DOS_FS fs;
     int rw,salvage_files,verify,c;
     unsigned long free_clusters;
+    int print_volume_name = 0;
+    char volume_name[12];
     
     rw = salvage_files = verify = 0;
     interactive = 1;
     check_atari();
 
-    while ((c = getopt(argc,argv,"Aad:flrtu:vVwy")) != EOF)
+    while ((c = getopt(argc,argv,"Aad:flmprtu:vVwy")) != EOF)
 	switch (c) {
 	    case 'A': /* toggle Atari format */
 	  	atari_format = !atari_format;
@@ -107,6 +112,12 @@
 	    case 'l':
 		list = 1;
 		break;
+	    case 'm':
+	    	low_mem = 1;
+	    	break;
+	    case 'p':
+	    	print_volume_name = 1;
+	    	break;
 	    case 'r':
 		rw = 1;
 		interactive = 1;
@@ -138,6 +149,13 @@
 
     printf( "dosfsck " VERSION ", " VERSION_DATE ", FAT32, LFN\n" );
     fs_open(argv[optind],rw);
+    if (print_volume_name) { /* read volume name, print, exit */
+      memset(volume_name,0,12);
+      fs_read(0x47,11,volume_name);
+      printf("%s\n",volume_name);
+      fs_close(0);
+      exit(0);
+    }
     read_boot(&fs);
     if (verify) printf("Starting check/repair pass.\n");
     while (read_fat(&fs), scan_root(&fs)) qfree(&mem_queue);
diff -u --recursive dosfstools-2.8/dosfsck/dosfsck.h dosfstools-2.8vb2/dosfsck/dosfsck.h
--- dosfstools-2.8/dosfsck/dosfsck.h	Tue Nov 28 08:22:18 2000
+++ dosfstools-2.8vb2/dosfsck/dosfsck.h	Mon Feb 24 21:32:50 2003
@@ -119,7 +119,7 @@
 #define offsetof(t,e)	((int)&(((t *)0)->e))
 #endif
 
-extern int interactive,list,verbose,test,write_immed;
+extern int interactive,list,verbose,test,write_immed,low_mem;
 extern int atari_format;
 extern unsigned n_files;
 extern void *mem_queue;
diff -u --recursive dosfstools-2.8/dosfsck/fat.c dosfstools-2.8vb2/dosfsck/fat.c
--- dosfstools-2.8/dosfsck/fat.c	Tue Nov 28 08:20:46 2000
+++ dosfstools-2.8vb2/dosfsck/fat.c	Mon Feb 24 21:32:39 2003
@@ -20,11 +20,20 @@
 #include "check.h"
 #include "fat.h"
 
+static unsigned long get_cluster(DOS_FS *fs, unsigned long cluster)
+{
+  unsigned long e;
+  fs_read(fs->fat_start+(cluster*sizeof(unsigned long)),sizeof(unsigned long),&e);
+  return e;
+}
 
 static void get_fat(FAT_ENTRY *entry,void *fat,unsigned long cluster,DOS_FS *fs)
 {
     unsigned char *ptr;
 
+    if (low_mem && (fs->fat_bits != 32))
+      die("-m only works with FAT32 partitions\n");
+
     switch(fs->fat_bits) {
       case 12:
 	ptr = &((unsigned char *) fat)[cluster*3/2];
@@ -38,7 +47,13 @@
 	/* According to M$, the high 4 bits of a FAT32 entry are reserved and
 	 * are not part of the cluster number. So we cut them off. */
 	{
-	    unsigned long e = CF_LE_L(((unsigned long *) fat)[cluster]);
+	    unsigned long e;
+	    if (low_mem)
+	      e = get_cluster(fs,cluster);
+	    else
+	      e = CF_LE_L(((unsigned long *) fat)[cluster]);
+	    if (e != get_cluster(fs,cluster))
+	      printf("get_cluster goofed %li %li\n",e,get_cluster(fs,cluster));
 	    entry->value = e & 0xfffffff;
 	    entry->reserved = e >> 28;
 	}
@@ -49,21 +64,52 @@
     entry->owner = NULL;
 }
 
+#define CMP_BUF_SIZE 1024
+
+static int fat_cmp(DOS_FS *fs)
+{
+  int eff_size, i, ret, rsize;
+  char buf1[CMP_BUF_SIZE], buf2[CMP_BUF_SIZE];
+
+  eff_size = ((fs->clusters+2)*fs->fat_bits+7)/8;
+  for (i=0; i<eff_size; i+=CMP_BUF_SIZE) {
+    rsize = CMP_BUF_SIZE;
+    if ((i+rsize)>eff_size)
+      rsize = eff_size-i;
+    fs_read(fs->fat_start,rsize,buf1);
+    fs_read(fs->fat_start+fs->fat_size,rsize,buf2);
+    ret = memcmp(buf1,buf1,rsize);
+    if (ret) return ret;
+  }
+  return 0;
+}
+
 
 void read_fat(DOS_FS *fs)
 {
     int eff_size;
     unsigned long i;
-    void *first,*second,*use;
-    int first_ok,second_ok;
+    void *first=NULL,*second=NULL,*use=NULL;
+    int first_ok,second_ok,ret;
 
     eff_size = ((fs->clusters+2)*fs->fat_bits+7)/8;
-    first = alloc(eff_size);
-    second = alloc(eff_size);
-    fs_read(fs->fat_start,eff_size,first);
-    fs_read(fs->fat_start+fs->fat_size,eff_size,second);
-    use = first;
-    if (memcmp(first,second,eff_size) != 0) {
+    
+    if (low_mem) {
+      ret = fat_cmp(fs);
+      if (ret != 0) {
+        fprintf(stderr,"FATs differ, bailing out of low memory mode\n");
+        low_mem = 0;
+        return read_fat(fs);
+      }
+    } else {
+      first = alloc(eff_size);
+      second = alloc(eff_size);
+      fs_read(fs->fat_start,eff_size,first);
+      fs_read(fs->fat_start+fs->fat_size,eff_size,second);
+      use = first;
+      ret = memcmp(first,second,eff_size);
+    }
+    if (ret != 0) {
 	FAT_ENTRY first_media, second_media;
 	get_fat(&first_media,first,0,fs);
 	get_fat(&second_media,second,0,fs);
@@ -93,7 +139,7 @@
 	}
 	if (!first_ok && !second_ok) {
 	    printf("Both FATs appear to be corrupt. Giving up.\n");
-	    exit(1);
+	    exit(2);
 	}
     }
     fs->fat = qalloc(&mem_queue,sizeof(FAT_ENTRY)*(fs->clusters+2));
@@ -105,8 +151,10 @@
 		   i-2,fs->fat[i].value,fs->clusters+2-1);
 	    set_fat(fs,i,-1);
 	}
-    free(first);
-    free(second);
+    if (!low_mem) {
+      free(first);
+      free(second);
+    }
 }
 
 
diff -u --recursive dosfstools-2.8/dosfsck/io.c dosfstools-2.8vb2/dosfsck/io.c
--- dosfstools-2.8/dosfsck/io.c	Tue Nov 28 08:22:42 2000
+++ dosfstools-2.8vb2/dosfsck/io.c	Sat Feb 22 17:44:27 2003
@@ -42,7 +42,7 @@
 /* Use the _llseek system call directly, because there (once?) was a bug in
  * the glibc implementation of it. */
 #include <linux/unistd.h>
-#if defined(__alpha) || defined (__ia64__)
+#if defined(__alpha) || defined (__ia64__) || defined(__s390__) || defined(__s390x__)
 /* On alpha, the syscall is simply lseek, because it's a 64 bit system. */
 static loff_t llseek( int fd, loff_t offset, int whence )
 {
diff -u --recursive dosfstools-2.8/mkdosfs/Makefile dosfstools-2.8vb2/mkdosfs/Makefile
--- dosfstools-2.8/mkdosfs/Makefile	Tue Jul  6 07:23:23 1999
+++ dosfstools-2.8vb2/mkdosfs/Makefile	Tue Feb 25 16:38:39 2003
@@ -1,4 +1,3 @@
-
 OBJECTS = mkdosfs.o
 
 all: mkdosfs
Binary files dosfstools-2.8/mkdosfs/mkdosfs and dosfstools-2.8vb2/mkdosfs/mkdosfs differ
diff -u --recursive dosfstools-2.8/mkdosfs/mkdosfs.8 dosfstools-2.8vb2/mkdosfs/mkdosfs.8
--- dosfstools-2.8/mkdosfs/mkdosfs.8	Thu Aug 12 05:40:20 1999
+++ dosfstools-2.8vb2/mkdosfs/mkdosfs.8	Wed Feb 26 10:45:08 2003
@@ -35,6 +35,7 @@
 .I volume-id
 ]
 .RB [ " \-I " ]
+.RB [ " \-M " ]
 [
 .B \-m
 .I message-file
@@ -122,9 +123,7 @@
 .BI \-F " FAT-size"
 Specifies the type of file allocation tables used (12, 16 or 32 bit).
 If nothing is specified, \fBmkdosfs\fR will automatically select
-between 12 and 16 bit, whatever fits better for the filesystem size.
-32 bit FAT (FAT32 format) must (still) be selected explicitly if you
-want it.
+between 12, 16, and 32 bit, whatever fits better for the filesystem size.
 .TP
 .BI \-i " volume-id"
 Sets the volume ID of the newly created filesystem;
@@ -148,6 +147,10 @@
 Read the bad blocks list from
 .IR filename .
 .TP
+.B \-M
+Use less memory during format.  Useful for low memory computers.
+Will slow down format time.  Does not work with -c.
+.TP
 .BI \-m " message-file"
 Sets the message the user receives on attempts to boot this filesystem
 without having properly installed an operating system.  The message
@@ -161,7 +164,8 @@
 .TP
 .BI \-r " root-dir-entries"
 Select the number of entries available in the root directory.  The
-default is 112 or 224 for floppies and 512 for hard disks.
+default is 112 or 224 for floppies and 512 for hard disks.  This does
+not apply to FAT32.
 .TP
 .BI \-R " number-of-reserved-sectors "
 Select the number of reserved sectos. With FAT32 format at least 2
@@ -170,12 +174,18 @@
 .TP
 .BI \-s " sectors-per-cluster"
 Specify the number of disk sectors per cluster.  Must be a power of 2,
-i.e. 1, 2, 4, 8, ... 128.
+i.e. 1, 2, 4, 8, ... 128.  The cluster size (sectors-per-cluster multiplied
+by the logical-sector-size, below) should not exceed 32768.
+If nothing is specified, \fBmkdosfs\fR will automatically select the optimal
+number based on filesystem size.
+
 .TP
 .BI \-S " logical-sector-size"
 Specify the number of bytes per logical sector.  Must be a power of 2
 and greater than or equal to 512, i.e. 512, 1024, 2048, 4096, 8192,
-16384, or 32768.
+16384, or 32768.  Values over 4096 will not work on many systems and
+should be avoided.  Changing this value on drives with fixed geometry
+like hard drives will not work on many systems, and should be avoided.
 .TP
 .B \-v
 Verbose execution.
@@ -186,6 +196,7 @@
 Dave Hudson - <dave@humbug.demon.co.uk>; modified by Peter Anvin
 <hpa@yggdrasil.com>. Fixes and additions by Roman Hodek
 <Roman.Hodek@informatik.uni-erlangen.de> for Debian/GNU Linux.
+Additional modifications by Vince Busam <vince@sixpak.org>.
 .SH ACKNOWLEDGEMENTS
 .B mkdosfs
 is based on code from
diff -u --recursive dosfstools-2.8/mkdosfs/mkdosfs.c dosfstools-2.8vb2/mkdosfs/mkdosfs.c
--- dosfstools-2.8/mkdosfs/mkdosfs.c	Tue Feb 25 15:25:08 2003
+++ dosfstools-2.8vb2/mkdosfs/mkdosfs.c	Wed Feb 26 15:51:56 2003
@@ -95,7 +95,7 @@
 /* Use the _llseek system call directly, because there (once?) was a bug in
  * the glibc implementation of it. */
 #include <linux/unistd.h>
-#if defined(__alpha) || defined(__ia64__)
+#if defined(__alpha) || defined(__ia64__) || defined(__s390__) || defined(__s390x__)
 /* On alpha, the syscall is simply lseek, because it's a 64 bit system. */
 static loff_t llseek( int fd, loff_t offset, int whence )
 {
@@ -320,12 +320,14 @@
 static int start_data_sector;	/* Sector number for the start of the data area */
 static int start_data_block;	/* Block number for the start of the data area */
 static unsigned char *fat;	/* File allocation table */
+static unsigned char *zero_fat; /* Most of the FAT is initialized to 0 */
 static unsigned char *info_sector;	/* FAT32 info sector */
 static struct msdos_dir_entry *root_dir;	/* Root directory */
 static int size_root_dir;	/* Size of the root directory in bytes */
 static int sectors_per_cluster = 0;	/* Number of sectors per disk cluster */
 static int root_dir_entries = 0;	/* Number of root directory entries */
 static char *blank_sector;		/* Blank sector - all zeros */
+static int low_mem = 0;                 /* Toggle lower memory usage mode */
 
 
 /* Function prototype definitions */
@@ -770,13 +772,33 @@
       bs.media = (char) 0xf8; /* Set up the media descriptor for a hard drive */
       bs.dir_entries[0] = (char) 0;	/* Default to 512 entries */
       bs.dir_entries[1] = (char) 2;
-      /* For FAT32, use 4k clusters on sufficiently large file systems,
-       * otherwise 1 sector per cluster. This is also what M$'s format
-       * command does for FAT32. */
-      bs.cluster_size = (char)
-	    (size_fat == 32 ?
-	     ((long long)blocks*SECTORS_PER_BLOCK >= 512*1024 ? 8 : 1) :
-	     4); /* FAT12 and FAT16: start at 4 sectors per cluster */
+      /* Check if we should use FAT32 */
+      if (!size_fat) {
+	if ((blocks*SECTORS_PER_BLOCK) > 1064960) {
+	  if (verbose) printf("Selecting FAT32 on large drive\n");
+	  size_fat = 32;
+	}
+      }
+      if (size_fat == 32) {
+	/* Use this table to find FAT32 default cluster size */
+	int volsize = blocks*SECTORS_PER_BLOCK;
+	if (volsize <= 66600)
+	  die("Volume too small for FAT32\n");
+	else if (volsize <= 532480)
+	  bs.cluster_size = 1;
+	else if (volsize <= 16777216)
+	  bs.cluster_size = 8;
+	else if (volsize <= 33554432)
+	  bs.cluster_size = 16;
+	else if (volsize <= 67108864)
+	  bs.cluster_size = 32;
+	else
+	  bs.cluster_size = 64;
+	if (verbose) printf("Selecting %i sectors per cluster\n",bs.cluster_size);
+      } else { 
+	/* FAT12 and FAT16: start at 4 sectors per cluster */
+	bs.cluster_size = 4;
+      }
     }
 }
 
@@ -914,7 +936,7 @@
       if (clust12 > maxclust12-2) {
 	clust12 = 0;
 	if (verbose >= 2)
-	  printf( "FAT12: too much clusters\n" );
+	  printf( "FAT12: too many clusters\n" );
       }
 
       clust16 = ((long long) fatdata *sector_size + nr_fats*4) /
@@ -941,7 +963,7 @@
 	if (verbose >= 2)
 	  printf( clust16 < FAT12_THRESHOLD ?
 		  "FAT16: would be misdetected as FAT12\n" :
-		  "FAT16: too much clusters\n" );
+		  "FAT16: too many clusters\n" );
 	clust16 = 0;
       }
 
@@ -961,7 +983,7 @@
       if (clust32 > maxclust32) {
 	clust32 = 0;
 	if (verbose >= 2)
-	  printf( "FAT32: too much clusters\n" );
+	  printf( "FAT32: too many clusters\n" );
       }
 
       if ((clust12 && (size_fat == 0 || size_fat == 12)) ||
@@ -1201,10 +1223,22 @@
 
   /* Make the file allocation tables! */
 
-  if ((fat = (unsigned char *) malloc (fat_length * sector_size)) == NULL)
-    die ("unable to allocate space for FAT image in memory");
+  if (low_mem) {
+    if ((fat = (unsigned char *) malloc (sector_size)) == NULL)
+      die ("unable to allocate space for FAT image in memory");
 
-  memset( fat, 0, fat_length * sector_size );
+    memset( fat, 0, sector_size );
+
+    if ((zero_fat = (unsigned char *) malloc (sector_size)) == NULL)
+      die ("unable to allocate space for FAT image in memory");
+
+    memset( zero_fat, 0, sector_size );
+  } else {
+    if ((fat = (unsigned char *) malloc (fat_length * sector_size)) == NULL)
+      die ("unable to allocate space for FAT image in memory");
+
+    memset( fat, 0, fat_length * sector_size );
+  }
 
   mark_FAT_cluster (0, 0xffffffff);	/* Initial fat entries */
   mark_FAT_cluster (1, 0xffffffff);
@@ -1307,7 +1341,7 @@
 static void
 write_tables (void)
 {
-  int x;
+  int x, fatno;
   int fat_length;
 
   fat_length = (size_fat == 32) ?
@@ -1334,8 +1368,16 @@
     }
   /* seek to start of FATS and write them all */
   seekto( reserved_sectors*sector_size, "first FAT" );
-  for (x = 1; x <= nr_fats; x++)
-    writebuf( fat, fat_length * sector_size, "FAT" );
+  if (low_mem) {
+    for (x = 1; x <= nr_fats; x++) {
+      writebuf( fat, sector_size, "FAT" );
+      for (fatno = 1; fatno < fat_length; fatno++)
+        writebuf( zero_fat, sector_size, "FAT" );
+    }
+  } else {
+    for (x = 1; x <= nr_fats; x++)
+      writebuf( fat, fat_length * sector_size, "FAT" );
+  }
   /* Write the root directory directly after the last FAT. This is the root
    * dir area on FAT12/16, and the first cluster on FAT32. */
   writebuf( (char *) root_dir, size_root_dir, "root directory" );
@@ -1352,7 +1394,8 @@
 usage (void)
 {
   fatal_error("\
-Usage: mkdosfs [-A] [-c] [-C] [-v] [-I] [-l bad-block-file] [-b backup-boot-sector]\n\
+Usage: mkdosfs [-A] [-c] [-C] [-v] [-I] [-M]\n\
+       [-l bad-block-file] [-b backup-boot-sector]\n\
        [-m boot-msg-file] [-n volume-name] [-i volume-id]\n\
        [-s sectors-per-cluster] [-S logical-sector-size] [-f number-of-FATs]\n\
        [-F fat-size] [-r root-dir-entries] [-R reserved-sectors]\n\
@@ -1415,7 +1458,7 @@
   printf ("%s " VERSION " (" VERSION_DATE ")\n",
 	   program_name);
 
-  while ((c = getopt (argc, argv, "AcCf:F:Ii:l:m:n:r:R:s:S:v")) != EOF)
+  while ((c = getopt (argc, argv, "AcCf:F:Ii:l:Mm:n:r:R:s:S:v")) != EOF)
     /* Scan the command line for options */
     switch (c)
       {
@@ -1476,6 +1519,10 @@
 	listfile = optarg;
 	break;
 
+      case 'M':         /* M : Use less memory */
+        low_mem = 1;
+        break;
+
       case 'm':		/* m : Set boot message */
 	if ( strcmp(optarg, "-") )
 	  {
@@ -1599,7 +1646,17 @@
 	usage ();
       }
 
+  if ((sector_size * sectors_per_cluster) > 32768) {
+    fprintf(stderr,"WARNING!  Cluster size > 32k will cause compatibility problems!\n");
+  }
+
   device_name = argv[optind];	/* Determine the number of blocks in the FS */
+
+  if (!device_name) {
+      printf("No device specified.\n");
+      usage();
+  }
+      
   if (!create)
     i = count_blocks (device_name); /*  Have a look and see! */
   if (optind == argc - 2)	/*  Either check the user specified number */
@@ -1628,6 +1685,9 @@
 
   if (check && listfile)	/* Auto and specified bad block handling are mutually */
     die ("-c and -l are incompatible");		/* exclusive of each other! */
+  
+  if (check && low_mem)
+    die ("-c and -M are incomaptible");
 
   if (!create) {
     check_mount (device_name);	/* Is the device already mounted? */
diff -u --recursive dosfstools-2.8/version.h dosfstools-2.8vb2/version.h
--- dosfstools-2.8/version.h	Wed Feb 28 08:04:19 2001
+++ dosfstools-2.8vb2/version.h	Wed Feb 26 16:10:11 2003
@@ -1,8 +1,8 @@
 #ifndef _version_h
 #define _version_h
 
-#define	VERSION			"2.8"
-#define VERSION_DATE	"28 Feb 2001"
+#define	VERSION			"2.8vb2"
+#define VERSION_DATE	"26 Feb 2003"
 
 #endif  /* _version_h */
 
