summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-fs/dosfstools/files/dosfstools-2.11-fat32size.patch')
-rw-r--r--sys-fs/dosfstools/files/dosfstools-2.11-fat32size.patch46
1 files changed, 46 insertions, 0 deletions
diff --git a/sys-fs/dosfstools/files/dosfstools-2.11-fat32size.patch b/sys-fs/dosfstools/files/dosfstools-2.11-fat32size.patch
new file mode 100644
index 000000000000..5047155dd841
--- /dev/null
+++ b/sys-fs/dosfstools/files/dosfstools-2.11-fat32size.patch
@@ -0,0 +1,46 @@
+Fix generation of FAT filesystems on devices that are 256meg in size
+
+Patch by Ulrich Mueller and accepted upstream
+
+http://bugs.gentoo.org/112504
+
+--- mkdosfs/mkdosfs.c
++++ mkdosfs/mkdosfs.c
+@@ -769,18 +769,19 @@
+ size_fat = 32;
+ }
+ if (size_fat == 32) {
+- /* For FAT32, try to do the same as M$'s format command:
+- * fs size < 256M: 0.5k clusters
+- * fs size < 8G: 4k clusters
+- * fs size < 16G: 8k clusters
+- * fs size >= 16G: 16k clusters
++ /* For FAT32, try to do the same as M$'s format command
++ * (see http://www.win.tue.nl/~aeb/linux/fs/fat/fatgen103.pdf p. 20):
++ * fs size <= 260M: 0.5k clusters
++ * fs size <= 8G: 4k clusters
++ * fs size <= 16G: 8k clusters
++ * fs size > 16G: 16k clusters
+ */
+ unsigned long sz_mb =
+ (blocks+(1<<(20-BLOCK_SIZE_BITS))-1) >> (20-BLOCK_SIZE_BITS);
+- bs.cluster_size = sz_mb >= 16*1024 ? 32 :
+- sz_mb >= 8*1024 ? 16 :
+- sz_mb >= 256 ? 8 :
+- 1;
++ bs.cluster_size = sz_mb > 16*1024 ? 32 :
++ sz_mb > 8*1024 ? 16 :
++ sz_mb > 260 ? 8 :
++ 1;
+ }
+ else {
+ /* FAT12 and FAT16: start at 4 sectors per cluster */
+@@ -1036,6 +1037,8 @@
+ break;
+
+ case 32:
++ if (clust32 < MIN_CLUST_32)
++ fprintf(stderr, "WARNING: Not enough clusters for a 32 bit FAT!\n");
+ cluster_count = clust32;
+ fat_length = fatlength32;
+ bs.fat_length = CT_LE_W(0);