Initialize for dosfstools

This commit is contained in:
zyppe 2024-02-07 22:45:12 +08:00
commit b1d5b82835
8 changed files with 1371 additions and 0 deletions

1
.dosfstools.metadata Normal file
View file

@ -0,0 +1 @@
3e8602960b8ec95de62f0e48c57464815d29af2a5d9d7bb7444eb9e544c6aa10 dosfstools-4.1.tar.gz

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
dosfstools-4.1.tar.gz

BIN
dosfstools-4.1.tar.gz.sig Normal file

Binary file not shown.

101
dosfstools-add-g.patch Normal file
View file

@ -0,0 +1,101 @@
From e579a7df89bb3a6df08847d45c70c8ebfabca7d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali.rohar@gmail.com>
Date: Sat, 17 Nov 2018 01:12:52 +0100
Subject: [PATCH] mkfs.fat: Allow to specify disk geometry via new -g option
Backported.
---
manpages/mkfs.fat.8.in | 8 ++++++++
src/mkfs.fat.c | 25 ++++++++++++++++++++++---
2 files changed, 30 insertions(+), 3 deletions(-)
Index: dosfstools-4.1/manpages/mkfs.fat.8.in
===================================================================
--- dosfstools-4.1.orig/manpages/mkfs.fat.8.in
+++ dosfstools-4.1/manpages/mkfs.fat.8.in
@@ -89,6 +89,14 @@ The default is 2.
Specifies the type of file allocation tables used (12, 16 or 32 bit).
If nothing is specified, \fBmkfs.fat\fR will automatically select between 12, 16
and 32 bit, whatever fits better for the filesystem size.
+.IP "\fB\-g\fR \fIHEADS\fR/\fISECTORS-PER-TRACK\fR" 4
+Specify \fIHEADS\fR and \fISECTORS-PER-TRACK\fR numbers which represents
+disk geometry of \fIDEVICE\fR. Both numbers are stored into the FAT boot sector.
+Number \fISECTORS-PER-TRACK\fR is used also for aligning the total count of FAT
+sectors. By default disk geometry is read from \fIDEVICE\fR itself. If it is not
+available then \fILBA-Assist Translation\fR and translation table from the
+\fISD Card Part 2 File System Specification\fR based on total number of disk
+sectors is used.
.IP "\fB\-h\fR \fINUMBER-OF-HIDDEN-SECTORS\fR" 4
Select the number of hidden sectors in the volume.
Apparently some digital cameras get indigestion if you feed them a CF card
Index: dosfstools-4.1/src/mkfs.fat.c
===================================================================
--- dosfstools-4.1.orig/src/mkfs.fat.c
+++ dosfstools-4.1/src/mkfs.fat.c
@@ -620,8 +620,10 @@ static void establish_params(struct devi
if (!root_dir_entries)
root_dir_entries = def_root_dir_entries;
- bs.secs_track = htole16(sec_per_track);
- bs.heads = htole16(heads);
+ if (!bs.secs_track)
+ bs.secs_track = htole16(sec_per_track);
+ if (!bs.heads)
+ bs.heads = htole16(heads);
bs.media = media;
bs.cluster_size = cluster_size;
}
@@ -1268,9 +1270,9 @@ static void usage(int exitval)
Usage: mkfs.fat [-a][-A][-c][-C][-v][-I][-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\
- [-h hidden-sectors][-F fat-size][-r root-dir-entries][-R reserved-sectors]\n\
- [-M FAT-media-byte][-D drive_number]\n\
- [--invariant]\n\
+ [-h hidden-sectors][-F fat-size][-g heads/sector_per_track]\n\
+ [-r root-dir-entries][-R reserved-sectors][-M FAT-media-byte]\n\
+ [-D drive_number][--invariant]\n\
[--help]\n\
/dev/name [blocks]\n");
exit(exitval);
@@ -1319,6 +1321,7 @@ int main(int argc, char **argv)
uint64_t cblocks = 0;
int blocks_specified = 0;
struct timeval create_timeval;
+ long long conversion;
enum {OPT_HELP=1000, OPT_INVARIANT,};
const struct option long_options[] = {
@@ -1341,7 +1344,7 @@ int main(int argc, char **argv)
printf("mkfs.fat " VERSION " (" VERSION_DATE ")\n");
- while ((c = getopt_long(argc, argv, "aAb:cCf:D:F:Ii:l:m:M:n:r:R:s:S:h:v",
+ while ((c = getopt_long(argc, argv, "aAb:cCf:D:F:g:Ii:l:m:M:n:r:R:s:S:h:v",
long_options, NULL)) != -1)
/* Scan the command line for options */
switch (c) {
@@ -1396,6 +1399,22 @@ int main(int argc, char **argv)
size_fat_by_user = 1;
break;
+ case 'g': /* g : geometry: heads and sectors per track */
+ errno = 0;
+ conversion = strtol(optarg, &tmp, 0);
+ if (!*optarg || isspace(*optarg) || tmp[0] != '/' || !tmp[1] || isspace(tmp[1]) || errno || conversion <= 0 || conversion > UINT16_MAX) {
+ printf("Bad format of geometry : %s\n", optarg);
+ usage(1);
+ }
+ bs.heads = htole16(conversion);
+ conversion = strtol(tmp+1, &tmp, 0);
+ if (*tmp || errno || conversion <= 0 || conversion > UINT16_MAX) {
+ printf("Bad format of geometry : %s\n", optarg);
+ usage(1);
+ }
+ bs.secs_track = htole16(conversion);
+ break;
+
case 'h': /* h : number of hidden sectors */
hidden_sectors = (int)strtol(optarg, &tmp, 0);
if (*tmp || hidden_sectors < 0) {

330
dosfstools.changes Normal file
View file

@ -0,0 +1,330 @@
* Tue Dec 21 2021 sbrabec@suse.com
- To be able to create filesystems compatible with previous
version, add -g command line option to mkfs (boo#1188401,
dosfstools-add-g.patch).
- BREAKING CHANGES:
After fixing of bsc#1172863 in the last update, mkfs started to
create different images than before. Applications that depend on
exact FAT file format (e. g. embedded systems) may be broken in
two ways:
* The introduction of the alignment may create smaller images
than before, with a different positions of important image
elements. It can break existing software that expect images in
doststools <= 4.1 style.
To work around these problems, use "-a" command line argument.
* The new image may contain a different geometry values. Geometry
sensitive applications expecting doststools <= 4.1 style images
can fails to accept different geometry values.
There is no direct work around for this problem. But you can
take the old image, use "file -s $IMAGE", check its
"sectors/track" and "heads", and use them in the newly
introduced "-g" command line argument.
* Wed May 26 2021 mcepl@suse.com
- Add fix-calculation.patch (gh#dosfstools/dosfstools#153, bsc#1172863)
to work with different size of clusters.
* Thu Jan 26 2017 mpluskal@suse.com
- Update to version 4.1:
* Now the default for mkfs for filesystems smaller than 512 MB is
64 / 32 sectors
* The parsing of octal character specifications for filenames in
the -u and -d 25 options of fsck now works.
* Fixed a possible fatlabel crash when writing a label to an
unlabelled filesystem
* Testsuite is now available
* Sat May 7 2016 mpluskal@suse.com
- Update to 4.0
* Switch build system to autotools.
* Fixed data corruption errors in fsck.fat Writing to the third
to last cluster on FAT12 with an odd number of clusters would
corrupt the following cluster.
* The automatic alignment of data clusters that was added in
3.0.8 and broken for FAT32 starting with 3.0.20 has been
reinstated.
- Small spec file cleanup
- Drop no longer needed dosfstools-suse-dirs.patch
* Wed Jun 3 2015 mpluskal@suse.com
- Update to 3.0.28
* mkfs.fat now allows choosing 0xF0 as the media byte which was
previously rejected.
* mkfs.fat now supports the --invariant option to facilitate
testing mkfs.fat itself.
* Bugs fixed in fsck.fat are a read one byte beyond the end of
an allocated array when checking some FAT12 filesystems, and
checking that the first cluster of a file as specified in the
directory entry is not 1.
- Cleanup spec file with spec-cleaner
* Mon May 11 2015 pgajdos@suse.com
- fix url
* Fri Jan 16 2015 pgajdos@suse.com
- updated to 3.0.27:
* fsck.fat: Don't print version string every time -v is
encountered
* Fix attempt to rename root dir in fsck due to uninitialized
fields
* Support long file names in volume labeling code
- upstream changed
* Tue Sep 23 2014 jengelh@inai.de
- Drop gpg-offline build-time requirement; this is now handled by
the local source validator
* Thu Jun 26 2014 pgajdos@suse.com
- added fsck.{v,}fat and mkfs.{v,}fat compat symlinks in /sbin
[bnc#884516]
- call spec-cleaner
* Mon Mar 17 2014 pgajdos@suse.com
- updated to 3.0.26:
* Fix "odd" files created by frequent power-loss.
* Thu Mar 6 2014 pgajdos@suse.com
- updated to 3.0.25:
* Prevent corruption of FAT during fsck on 64 bit platforms.
unsigned long is 64 bit on x86-64, which means set_fat was writing two
entries, which corrupts the next entry. This can cause loss of data in
another file.
* Fixed remaining 64 bit build warnings.
* Mon Nov 25 2013 pgajdos@suse.com
- updated to 3.0.24:
* Fixed dosfsck on big endian platforms.
* Wed Oct 16 2013 pgajdos@suse.com
- updated to 3.0.23:
* Corrects clustersize to fix issues with EFI System Partitions.
* Mon Jul 29 2013 pgajdos@suse.com
- updated to 3.0.22:
* Improved boot compatiblity.
* Wed Jul 17 2013 pgajdos@suse.com
- updated to 3.0.21
* Minor miscellaneous cleanups.
* Thu Jun 13 2013 jengelh@inai.de
- Update to new upstream release 3.0.20
* This release updates default sectors per cluster for FAT32.
- Remove ppc-reserved-sectors-fix.patch (implemented upstream)
(use -a switch to disable aligning structures)
- Signature verification; more robust make install call
* Wed Jun 12 2013 pgajdos@suse.com
- update to 3.0.19:
* This release fixes a segfault with fortify.
- removed dosfstools-system_id-overflow.patch
* Tue Jun 11 2013 pgajdos@suse.com
- update to 3.0.18:
* Adding initial i18n support for manpages with po4a.
* Renaming tools to sane namespace and keeping legacy symlinks in place.
| dosfslabel becomes fatlabel,
| dosfsck becomes fsck.fat,
| and mkdosfs becomes mkfs.fat.
* Correcting spelling typo in boot.c.
* dosfslabel: Do not read beyond string length (Closes: #709587).
- refreshed both dosfstools-suse-dirs.patch and
ppc-reserved-sectors-fix.patch
- added dosfstools-system_id-overflow.patch
* Mon Jun 3 2013 pgajdos@suse.com
- update to 3.0.17:
* Fixing segfault in dosfslabel.
* Allow operation on SH4 CPUs.
* Finish cleanup of byteswap code.
* Fix offsetof definition.
* etc., see ChangeLog
- refreshed ppc-reserved-sectors-fix.patch
* Mon Mar 25 2013 mmeister@suse.com
- Added url as source.
Please see http://en.opensuse.org/SourceUrls
* Mon Mar 4 2013 pgajdos@suse.com
- update to 3.0.16: label fixes
* dropped upstreamed
- dosfstools-create-rootdir-label.patch
- dosfstools-dosfslabel-forbid-lowercase.patch
- dosfstools-dosfslabel-from-rootdir.patch
- dosfstools-fsck-file-name.patch
- dosfstools-mkdosfs-no-label.patch
- dosfstools-mkdosfs-uppercase-label.patch
* Mon Feb 25 2013 pgajdos@suse.com
- update to 3.0.15: bugfixes for device detection, root directory
allocation, and messages about unicode filenames.
* dropped dosfstools-filename-buffer-overflow.patch (upstreamed)
* dropped dosfstools-mdraid-partition.patch (upstreamed)
* refreshed dosfstools-suse-dirs.patch
* refreshed ppc-reserved-sectors-fix.patch
(will be dropped if not upstreamed)
* dosfstools-label.patch splitted to:
- dosfstools-create-rootdir-label.patch
- dosfstools-dosfslabel-forbid-lowercase.patch
- dosfstools-dosfslabel-from-rootdir.patch
- dosfstools-fsck-file-name.patch
- dosfstools-mkdosfs-no-label.patch
- dosfstools-mkdosfs-uppercase-label.patch
(will be upstreamed or dropped)
* Fri Oct 26 2012 dvaleev@suse.com
- hack to use just 1 sector for embedded devices. should be made
into a flag, but this shouldn't break normal systems ...
lunchpad bug (746262)
- fixes ppc boot from vfat (in case root on raid,lvm,ext4)
* Fri Sep 28 2012 cfarrell@suse.com
- license update: GPL-3.0+
No indication that the authors restricted the package to GPL-3.0 (i.e.
"only"). Accordingly, GPL-3.0+ seems a better choice and is also the
choice made by Fedora
* Wed Feb 8 2012 rschweikert@suse.com
- place binaries in /usr tree (UsrMerge project)
* Fri Sep 30 2011 uli@suse.com
- cross-build fix: use %%__cc macro
* Sun Sep 18 2011 jengelh@medozas.de
- Remove redundant tags/sections from specfile
(cf. packaging guidelines)
- Use %%_smp_mflags for parallel build
* Tue Mar 8 2011 pgajdos@suse.cz
- fixed fsck.vfat crashing [bnc#677236]
* Mon Dec 20 2010 pgajdos@suse.cz
- fixed dosfslabel crashing and improved label handling in mkdosfs
and dosfslabel [bnc#657011]
* Mon Nov 1 2010 pgajdos@suse.cz
- fixed:
* [bnc#639553] -- mkdosfs now detects md raid partition correctly
* [bnc#649046] -- install dosfslabel
* spec file cleanup
* Mon Sep 13 2010 pgajdos@suse.cz
- updated to 3.0.10:
* LFN handling and false positives with bad filenames were
corrected.
* Mon Feb 1 2010 pgajdos@suse.cz
- updated to 3.0.9:
* A bug in aligning was fixed.
* Mon Jan 25 2010 pgajdos@suse.cz
- new upstream
http://freshmeat.net/projects/dosfstools
- updated to 3.0.8
- removed upstreamed/obsoleted patches
* linuxfs.patch
* buffer.patch
* o_excl.patch
* mkdosfs-geo0.diff
* determine-sector-size.patch
* unsupported-sector-size.patch
* unaligned.patch
- major changes:
* aligning structures to cluster boundaries,
64bit and crosscompile fixes
* bugfix in dosfslabel, cleanups for FORTIFY_SOURCE
* bugfix in dosfsck on big-endian systems,
bugfix in dosfck cluster handling
* bugfix and cleanup for VFAT patent avoidance
kernel patch
* compatible with VFAT patent avoidance kernel
patch, bugfix in dosfsck repair mode
* supporting limited-memory embedded systems
* fixes rare dosfsck corruption
* improves dosfsck cluster handling, fixes timing
issues
* merged patches from various distributions
* Tue Nov 3 2009 coolo@novell.com
- updated patches to apply with fuzz=0
* Tue Jun 24 2008 pgajdos@suse.cz
- added warning for creation msdos on filesystem with sector size
greater than 4096 [fate#303325] (unsupported-sector-size.patch)
* Thu Sep 6 2007 pgajdos@suse.cz
- determine sector size of device automatically or if -S parameter
present, verify, that it's not under physical sector size
(determine-sector-size.patch)
* Thu Aug 9 2007 olh@suse.de
- remove inclusion of asm/unaligned.h, use private copy of
asm-generic/unaligned.h
* Thu Apr 26 2007 lnussel@suse.de
- remove obsolete subfs patch
- fix handling of zero heads and sectors
* Wed Apr 4 2007 pgajdos@suse.cz
- added Supplements: filesystem(vfat) line to spec file
[fate#301966]
* Tue Jan 30 2007 prusnak@suse.cz
- mkdosfs now opens device with O_EXCL [#238687]
* Sat May 27 2006 schwab@suse.de
- Don't strip binaries.
* Wed Jan 25 2006 mls@suse.de
- converted neededforbuild to BuildRequires
* Tue Nov 8 2005 dmueller@suse.de
- don't build as root
* Mon Nov 7 2005 yxu@suse.de
- fixed overflowing buffer problem
* Mon Apr 11 2005 mcihar@suse.cz
- update to 2.11
- use sys/mount.h instead of linux/fs.h, this fixes compilation with current GCC
* Tue Feb 15 2005 mcihar@suse.cz
- deal with subfs (bug #50838)
- use /proc/mounts if available for deciding whether device is
mounted or not
- just issue warning if it is mounted as subfs
* Thu Aug 19 2004 mcihar@suse.cz
- merged some dosfsck fixes from FreeDOS
* Thu Jul 15 2004 schwab@suse.de
- Fix unaligned accesses [#40296].
* Tue Jun 1 2004 ro@suse.de
- avoid inclusion of linux/audit.h
* Thu Mar 18 2004 mcihar@suse.cz
- fix dosfsck man page (pointed out in bug #34757)
* Mon Mar 8 2004 mcihar@suse.cz
- fix broken dosfsck (bug #34757)
* Thu Jan 29 2004 mcihar@suse.cz
- include more documentation
* Thu Jan 15 2004 kukuk@suse.de
- Make compile with kernel 2.6.1 headers
* Thu Oct 23 2003 schwab@suse.de
- Don't define llseek to lseek64, creates infinite recursion.
* Tue Oct 14 2003 mcihar@suse.cz
- install links also for {fsck,mkfs}.vfat + man pages (bug #32284)
* Mon Sep 29 2003 mcihar@suse.cz
- updated to 2.10:
- dosfsck: various 64-bit fixes and removed some warnings by Michal
Cihar <mcihar@suse.cz>
- mkdosfs: better error message if called without parameters (also
suggested by Michal)
* Mon Jun 9 2003 mcihar@suse.cz
- new upstream version 2.9:
* dosfsck: Fix potential for "Internal error: next_cluster on bad cluster".
* dosfsck: When clearing long file names, don't overwrite the dir
entries with all zeros, but put 0xe5 into the first byte.
Otherwise, some OSes stop reading the directory at that point...
* dosfsck: in statistics printed by -v, fix 32bit overflow in number
of data bytes.
* dosfsck: fix an potential overflow in "too many clusters" check
* dosfsck: allow FAT size > 32MB.
* dosfsck: allow for only one FAT
* dosfsck: with -v, also check that last sector of the filesystem can
be read (in case a partition is smaller than the fs thinks)
- realy working large file support
- don't package obsolette documentation
* Wed Dec 4 2002 mcihar@suse.cz
- don't allow -fPIC on i386 in CFLAGS, even on i386-debug, because
this package doesn't build with it
* Sun Dec 1 2002 ro@suse.de
- include errno.h where needed
* Tue Sep 10 2002 mcihar@suse.cz
- added -D_FILE_OFFSET_BITS=64 to CFLAGS to support larger files/partitions
* Mon May 20 2002 ro@suse.de
- extend 64bit ifdefs for new platforms
* Fri Mar 1 2002 jantos@suse.cz
- Fixed missing files in documentation (bug 13973)
* Fri Sep 14 2001 schwab@suse.de
- Fix crash if mkdosfs is called without arguments.
* Tue May 22 2001 pblaha@suse.cz
- fixed include files on ia64
* Sun Apr 8 2001 schwab@suse.de
- Fix to build on ia64.
* Mon Mar 5 2001 pblaha@suse.cz
- update on 2.8
* Mon Feb 12 2001 ro@suse.de
- don't include linux/fs.h
* Thu Jan 18 2001 schwab@suse.de
- Add Obsoletes: dosfstls.
* Wed Jan 17 2001 pblaha@suse.cz
- added message "not enough memory to run dosfsck\n"
- if not free memory for malloc
* Fri Dec 22 2000 pblaha@suse.cz
- upgrade on 2.6 and rename on dosfstools
* Mon Dec 4 2000 sf@suse.de
- corrected patch to compile on Alpha and ia64
* Tue Nov 21 2000 uli@suse.de
- worked around strncasecmp declaration conflict in mkdosfs.c
* Mon Nov 13 2000 ro@suse.de
- hacked to compile on 2.4 includes
* Thu Nov 2 2000 pblaha@suse.cz
- update to version 2.4
* Mon Jun 5 2000 schwab@suse.de
- Fix llseek on ia64.
* Fri Jun 2 2000 bubnikv@suse.cz
- new package in SuSE, version 2.2
- makes packages dosfsck and mkdosfs obsolette

513
dosfstools.keyring Normal file
View file

@ -0,0 +1,513 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
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
Zxz8PQg=
=N3ZS
-----END PGP PUBLIC KEY BLOCK-----

84
dosfstools.spec Normal file
View file

@ -0,0 +1,84 @@
#
# spec file for package dosfstools
#
# Copyright (c) 2022-2023 ZhuningOS
#
Name: dosfstools
Version: 4.1
Release: 3.6.1
Summary: Utilities for Making and Checking MS-DOS FAT File Systems on Linux
License: GPL-3.0+
Group: System/Filesystems
Url: https://github.com/dosfstools/dosfstools
Source: https://github.com/dosfstools/dosfstools/releases/download/v%{version}/dosfstools-%{version}.tar.gz
Source2: https://github.com/dosfstools/dosfstools/releases/download/v%{version}/dosfstools-%{version}.tar.gz.sig
Source3: %{name}.keyring
# PATCH-FIX-UPSTREAM fix-calculation.patch gh#dosfstools/dosfstools#153 mcepl@suse.com
# Fix calculation of sectors and clusters
Patch0: fix-calculation.patch
# PATCH-FEATURE-UPSTREAM dosfstools-add-g.patch boo1188401 sbrabec@suse.com -- To be able to create filesystems compatible with previous version, add -g command line option.
Patch1: dosfstools-add-g.patch
# xxd from vim is required for testsuite
BuildRequires: pkgconfig
BuildRequires: vim
BuildRequires: automake
BuildRequires: pkgconfig(libudev)
Supplements: filesystem(vfat)
Provides: dosfsck
Provides: mkdosfs
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
The dosfstools package includes the mkdosfs and dosfsck utilities, which
respectively make and check MS-DOS FAT file systems on hard drives or on
floppies.
%prep
%autosetup -p1
%build
%configure \
--docdir=%{_docdir}/dosfstools \
--enable-compat-symlinks
make %{?_smp_mflags} CFLAGS="%{optflags} -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
%install
%make_install
#UsrMerge
mkdir %{buildroot}/sbin
ln -sf %{_sbindir}/{dosfsck,dosfslabel,mkdosfs,fsck.msdos,mkfs.msdos,fsck.fat,fsck.vfat,mkfs.fat,mkfs.vfat} %{buildroot}/sbin
#EndUsrMerge
%check
make check
%files
%defattr(-,root,root)
%doc %{_docdir}/dosfstools
#UsrMerge
/sbin/*
#EndUsrMerge
%{_sbindir}/dosfsck
%{_sbindir}/dosfslabel
%{_sbindir}/fatlabel
%{_sbindir}/fsck.fat
%{_sbindir}/fsck.msdos
%{_sbindir}/fsck.vfat
%{_sbindir}/mkdosfs
%{_sbindir}/mkfs.fat
%{_sbindir}/mkfs.msdos
%{_sbindir}/mkfs.vfat
%{_mandir}/man8/dosfsck.8%{ext_man}
%{_mandir}/man8/dosfslabel.8%{ext_man}
%{_mandir}/man8/fatlabel.8%{ext_man}
%{_mandir}/man8/fsck.fat.8%{ext_man}
%{_mandir}/man8/fsck.msdos.8%{ext_man}
%{_mandir}/man8/fsck.vfat.8%{ext_man}
%{_mandir}/man8/mkdosfs.8%{ext_man}
%{_mandir}/man8/mkfs.fat.8%{ext_man}
%{_mandir}/man8/mkfs.msdos.8%{ext_man}
%{_mandir}/man8/mkfs.vfat.8%{ext_man}
%changelog

341
fix-calculation.patch Normal file
View file

@ -0,0 +1,341 @@
From b29eb5be67e9e8a06908ee10f6c205cb609b1021 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali.rohar@gmail.com>
Date: Wed, 15 Aug 2018 15:15:06 +0200
Subject: [PATCH 1/7] mkfs.fat: Align total number of sectors to be multiple of
sectors per track
This requirement is needed by DOS systems and also by Linux mtools project.
Without proper alignment, mtools applications refuse to work on such
filesystem.
---
configure.ac | 2
src/mkfs.fat.c | 119 ++++++++++++++++++++++-------------------------
tests/Makefile.am | 3 -
tests/mkfs-fat32_4K.mkfs | 3 +
tests/mkfs-fat32_4K.xxd | 63 ++++++++++++++++++++++++
tests/referenceFAT32.xxd | 5 +
6 files changed, 132 insertions(+), 63 deletions(-)
--- a/configure.ac
+++ b/configure.ac
@@ -16,7 +16,7 @@
AC_INIT([dosfstools], [4.1])
AC_SUBST([RELEASE_DATE], [2017-01-24])
-AM_INIT_AUTOMAKE([1.11 foreign subdir-objects parallel-tests])
+AM_INIT_AUTOMAKE([1.15.1 foreign subdir-objects parallel-tests])
AC_ARG_ENABLE([compat-symlinks],
[AS_HELP_STRING([--enable-compat-symlinks],
--- a/src/mkfs.fat.c
+++ b/src/mkfs.fat.c
@@ -7,6 +7,7 @@
Copyright (C) 1998-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
Copyright (C) 2015-2016 Andreas Bombe <aeb@debian.org>
+ Copyright (C) 2018 Pali Rohár <pali.rohar@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -107,14 +108,26 @@ static inline int cdiv(int a, int b)
#define BOOT_SIGN 0xAA55 /* Boot sector magic number */
-#define MAX_CLUST_12 ((1 << 12) - 16)
-#define MAX_CLUST_16 ((1 << 16) - 16)
-#define MIN_CLUST_32 65529
+/* According to Microsoft FAT specification (fatgen103.doc) disk with
+ * 4085 clusters (or more) is FAT16, but Microsoft Windows FAT driver
+ * fastfat.sys detects disk with less then 4087 clusters as FAT12.
+ * Linux FAT drivers msdos.ko and vfat.ko detect disk with at least
+ * 4085 clusters as FAT16, therefore for compatibility reasons with
+ * both systems disallow formatting disks to 4085 or 4086 clusters. */
+#define MAX_CLUST_12 4084
+#define MIN_CLUST_16 4087
+
+/* According to Microsoft FAT specification (fatgen103.doc) disk with
+ * 65525 clusters (or more) is FAT32, but Microsoft Windows FAT driver
+ * fastfat.sys, Linux FAT drivers msdos.ko and vfat.ko detect disk as
+ * FAT32 when Sectors Per FAT (fat_length) is set to zero. And not by
+ * number of clusters. Still there is cluster upper limit for FAT16. */
+#define MAX_CLUST_16 65524
+#define MIN_CLUST_32 65525
+
/* M$ says the high 4 bits of a FAT32 FAT entry are reserved and don't belong
* to the cluster number. So the max. cluster# is based on 2^28 */
-#define MAX_CLUST_32 ((1 << 28) - 16)
-
-#define FAT12_THRESHOLD 4085
+#define MAX_CLUST_32 268435446
#define OLDGEMDOS_MAX_SECTORS 32765
#define GEMDOS_MAX_SECTORS 65531
@@ -588,13 +601,12 @@ static void establish_params(struct devi
* fs size <= 16G: 8k clusters
* fs size <= 32G: 16k clusters
* fs size > 32G: 32k clusters
- *
- * This only works correctly for 512 byte sectors!
*/
- uint32_t sz_mb = info->size / (1024 * 1024);
- cluster_size =
- sz_mb > 32 * 1024 ? 64 : sz_mb > 16 * 1024 ? 32 : sz_mb >
- 8 * 1024 ? 16 : sz_mb > 260 ? 8 : 1;
+ unsigned long long int sectors = info->size / sector_size;
+ cluster_size = sectors > 32*1024*1024*2 ? 64 :
+ sectors > 16*1024*1024*2 ? 32 :
+ sectors > 8*1024*1024*2 ? 16 :
+ sectors > 260*1024*2 ? 8 : 1;
}
if (info->geom_heads > 0) {
@@ -733,6 +745,9 @@ static void setup_tables(void)
(long long)(blocks * BLOCK_SIZE / sector_size) + orphaned_sectors;
}
+ /* Align number of sectors to be multiple of sectors per track, needed by DOS and mtools */
+ num_sectors = num_sectors / le16toh(bs.secs_track) * le16toh(bs.secs_track);
+
if (!atari_format) {
unsigned fatdata1216; /* Sectors for FATs + data area (FAT12/16) */
unsigned fatdata32; /* Sectors for FATs + data area (FAT32) */
@@ -781,13 +796,13 @@ static void setup_tables(void)
maxclust12 = (fatlength12 * 2 * sector_size) / 3;
if (maxclust12 > MAX_CLUST_12)
maxclust12 = MAX_CLUST_12;
- if (verbose >= 2)
- printf("FAT12: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n",
+ if (verbose >= 2 && (size_fat == 0 || size_fat == 12))
+ printf("Trying FAT12: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n",
clust12, fatlength12, maxclust12, MAX_CLUST_12);
- if (clust12 > maxclust12 - 2) {
+ if (clust12 > maxclust12) {
clust12 = 0;
- if (verbose >= 2)
- printf("FAT12: too much clusters\n");
+ if (verbose >= 2 && (size_fat == 0 || size_fat == 12))
+ printf("Trying FAT12: too much clusters\n");
}
clust16 = ((long long)fatdata1216 * sector_size + nr_fats * 4) /
@@ -801,20 +816,19 @@ static void setup_tables(void)
maxclust16 = (fatlength16 * sector_size) / 2;
if (maxclust16 > MAX_CLUST_16)
maxclust16 = MAX_CLUST_16;
- if (verbose >= 2)
- printf("FAT16: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n",
- clust16, fatlength16, maxclust16, MAX_CLUST_16);
- if (clust16 > maxclust16 - 2) {
- if (verbose >= 2)
- printf("FAT16: too much clusters\n");
+ if (verbose >= 2 && (size_fat == 0 || size_fat == 16))
+ printf("Trying FAT16: #clu=%u, fatlen=%u, maxclu=%u, limit=%u/%u\n",
+ clust16, fatlength16, maxclust16, MIN_CLUST_16, MAX_CLUST_16);
+ if (clust16 > maxclust16) {
+ if (verbose >= 2 && (size_fat == 0 || size_fat == 16))
+ printf("Trying FAT16: too much clusters\n");
clust16 = 0;
}
- /* The < 4078 avoids that the filesystem will be misdetected as having a
+ /* This avoids that the filesystem will be misdetected as having a
* 12 bit FAT. */
- if (clust16 < FAT12_THRESHOLD
- && !(size_fat_by_user && size_fat == 16)) {
- if (verbose >= 2)
- printf("FAT16: would be misdetected as FAT12\n");
+ if (clust16 && clust16 < MIN_CLUST_16) {
+ if (verbose >= 2 && (size_fat == 0 || size_fat == 16))
+ printf("Trying FAT16: not enough clusters, would be misdetected as FAT12\n");
clust16 = 0;
}
@@ -829,19 +843,20 @@ static void setup_tables(void)
maxclust32 = (fatlength32 * sector_size) / 4;
if (maxclust32 > MAX_CLUST_32)
maxclust32 = MAX_CLUST_32;
- if (clust32 && clust32 < MIN_CLUST_32
- && !(size_fat_by_user && size_fat == 32)) {
+ if (verbose >= 2 && (size_fat == 0 || size_fat == 32))
+ printf("Trying FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u/%u\n",
+ clust32, fatlength32, maxclust32, MIN_CLUST_32, MAX_CLUST_32);
+ if (clust32 > maxclust32) {
+ if (verbose >= 2 && (size_fat == 0 || size_fat == 32))
+ printf("Trying FAT32: too much clusters\n");
clust32 = 0;
- if (verbose >= 2)
- printf("FAT32: not enough clusters (%d)\n", MIN_CLUST_32);
}
- if (verbose >= 2)
- printf("FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n",
- clust32, fatlength32, maxclust32, MAX_CLUST_32);
- if (clust32 > maxclust32) {
+ /* When explicitely asked, allow to create FAT32 with less then MIN_CLUST_32 */
+ if (clust32 && clust32 < MIN_CLUST_32
+ && !(size_fat_by_user && size_fat == 32)) {
+ if (verbose >= 2 && (size_fat == 0 || size_fat == 32))
+ printf("Trying FAT32: not enough clusters\n");
clust32 = 0;
- if (verbose >= 2)
- printf("FAT32: too much clusters\n");
}
if ((clust12 && (size_fat == 0 || size_fat == 12)) ||
@@ -869,23 +884,6 @@ static void setup_tables(void)
break;
case 16:
- if (clust16 < FAT12_THRESHOLD) {
- if (size_fat_by_user) {
- fprintf(stderr, "WARNING: Not enough clusters for a "
- "16 bit FAT! The filesystem will be\n"
- "misinterpreted as having a 12 bit FAT without "
- "mount option \"fat=16\".\n");
- } else {
- fprintf(stderr, "This filesystem has an unfortunate size. "
- "A 12 bit FAT cannot provide\n"
- "enough clusters, but a 16 bit FAT takes up a little "
- "bit more space so that\n"
- "the total number of clusters becomes less than the "
- "threshold value for\n"
- "distinction between 12 and 16 bit FATs.\n");
- die("Make the filesystem a bit smaller manually.");
- }
- }
cluster_count = clust16;
fat_length = fatlength16;
bs.fat_length = htole16(fatlength16);
@@ -894,8 +892,7 @@ static void setup_tables(void)
case 32:
if (clust32 < MIN_CLUST_32)
- fprintf(stderr,
- "WARNING: Not enough clusters for a 32 bit FAT!\n");
+ fprintf(stderr, "WARNING: Number of clusters for 32 bit FAT is less then suggested minimum.\n");
cluster_count = clust32;
fat_length = fatlength32;
bs.fat_length = htole16(0);
@@ -1053,9 +1050,9 @@ static void setup_tables(void)
if (!cluster_count) {
if (sectors_per_cluster) /* If yes, die if we'd spec'd sectors per cluster */
- die("Too many clusters for filesystem - try more sectors per cluster");
+ die("Not enough or too many clusters for filesystem - try less or more sectors per cluster");
else
- die("Attempting to create a too large filesystem");
+ die("Attempting to create a too small or a too large filesystem");
}
fat_entries = cluster_count + 2;
@@ -1076,8 +1073,8 @@ static void setup_tables(void)
(le16toh(bs.secs_track) != 1) ? "s" : "");
printf("hidden sectors 0x%04x;\n", hidden_sectors);
printf("logical sector size is %d,\n", sector_size);
- printf("using 0x%02x media descriptor, with %d sectors;\n",
- (int)(bs.media), num_sectors);
+ printf("using 0x%02x media descriptor, with %u sectors;\n",
+ (int)(bs.media), (unsigned)num_sectors);
printf("drive number 0x%02x;\n", (int) (vi->drive_number));
printf("filesystem has %d %d-bit FAT%s and %d sector%s per cluster.\n",
(int)(bs.fats), size_fat, (bs.fats != 1) ? "s" : "",
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -6,7 +6,6 @@ endif
TESTS = referenceFAT12.mkfs \
referenceFAT16.mkfs \
- referenceFAT32.mkfs \
check-bad_names.fsck \
check-chain_to_free_cluster.fsck \
check-chain_too_long.fsck \
@@ -28,6 +27,8 @@ dist_check_DATA = test-mkfs test-fsck
referenceFAT16.xxd \
referenceFAT32.mkfs \
referenceFAT32.xxd \
+ mkfs-fat32_4K.mkfs \
+ mkfs-fat32_4K.xxd \
check-bad_names.fsck \
check-chain_to_free_cluster.fsck \
check-chain_too_long.fsck \
--- /dev/null
+++ b/tests/mkfs-fat32_4K.mkfs
@@ -0,0 +1,3 @@
+ARGS="-n TEST4K -S 4096"
+SIZE=614400
+CMP_LIMIT=10M
--- /dev/null
+++ b/tests/mkfs-fat32_4K.xxd
@@ -0,0 +1,63 @@
+00000000: eb58 906d 6b66 732e 6661 7400 1001 2000 .X.mkfs.fat... .
+00000010: 0200 0000 00f8 0000 2000 0800 0000 0000 ........ .......
+00000020: 0058 0200 9600 0000 0000 0000 0200 0000 .X..............
+00000030: 0100 0600 0000 0000 0000 0000 0000 0000 ................
+00000040: 8000 29cd ab34 1254 4553 5434 4b20 2020 ..)..4.TEST4K
+00000050: 2020 4641 5433 3220 2020 0e1f be77 7cac FAT32 ...w|.
+00000060: 22c0 740b 56b4 0ebb 0700 cd10 5eeb f032 ".t.V.......^..2
+00000070: e4cd 16cd 19eb fe54 6869 7320 6973 206e .......This is n
+00000080: 6f74 2061 2062 6f6f 7461 626c 6520 6469 ot a bootable di
+00000090: 736b 2e20 2050 6c65 6173 6520 696e 7365 sk. Please inse
+000000a0: 7274 2061 2062 6f6f 7461 626c 6520 666c rt a bootable fl
+000000b0: 6f70 7079 2061 6e64 0d0a 7072 6573 7320 oppy and..press
+000000c0: 616e 7920 6b65 7920 746f 2074 7279 2061 any key to try a
+000000d0: 6761 696e 202e 2e2e 200d 0a00 0000 0000 gain ... .......
+000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+000001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.
+00000200: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+00001000: 5252 6141 0000 0000 0000 0000 0000 0000 RRaA............
+00001010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+000011e0: 0000 0000 7272 4161 b356 0200 0200 0000 ....rrAa.V......
+000011f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.
+00001200: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+00006000: eb58 906d 6b66 732e 6661 7400 1001 2000 .X.mkfs.fat... .
+00006010: 0200 0000 00f8 0000 2000 0800 0000 0000 ........ .......
+00006020: 0058 0200 9600 0000 0000 0000 0200 0000 .X..............
+00006030: 0100 0600 0000 0000 0000 0000 0000 0000 ................
+00006040: 8000 29cd ab34 1254 4553 5434 4b20 2020 ..)..4.TEST4K
+00006050: 2020 4641 5433 3220 2020 0e1f be77 7cac FAT32 ...w|.
+00006060: 22c0 740b 56b4 0ebb 0700 cd10 5eeb f032 ".t.V.......^..2
+00006070: e4cd 16cd 19eb fe54 6869 7320 6973 206e .......This is n
+00006080: 6f74 2061 2062 6f6f 7461 626c 6520 6469 ot a bootable di
+00006090: 736b 2e20 2050 6c65 6173 6520 696e 7365 sk. Please inse
+000060a0: 7274 2061 2062 6f6f 7461 626c 6520 666c rt a bootable fl
+000060b0: 6f70 7079 2061 6e64 0d0a 7072 6573 7320 oppy and..press
+000060c0: 616e 7920 6b65 7920 746f 2074 7279 2061 any key to try a
+000060d0: 6761 696e 202e 2e2e 200d 0a00 0000 0000 gain ... .......
+000060e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+000061f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.
+00006200: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+00007000: 5252 6141 0000 0000 0000 0000 0000 0000 RRaA............
+00007010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+000071e0: 0000 0000 7272 4161 b356 0200 0200 0000 ....rrAa.V......
+000071f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.
+00007200: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+00020000: f8ff ff0f ffff ff0f f8ff ff0f 0000 0000 ................
+00020010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+000b6000: f8ff ff0f ffff ff0f f8ff ff0f 0000 0000 ................
+000b6010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+0014c000: 5445 5354 344b 2020 2020 2008 0000 5a4b TEST4K ...ZK
+0014c010: 6e46 6e46 0000 5a4b 6e46 0000 0000 0000 nFnF..ZKnF......
+0014c020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+257ffff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
--- a/tests/referenceFAT32.xxd
+++ b/tests/referenceFAT32.xxd
@@ -52,3 +52,8 @@
001f8020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
3e7ffff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+001f8000: 5445 5354 4641 5433 3220 2008 0000 5a4b TESTFAT32 ...ZK
+001f8010: 6e46 6e46 0000 5a4b 6e46 0000 0000 0000 nFnF..ZKnF......
+001f8020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+*
+3e7ffff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................