Skip to content

Commit cdb5504

Browse files
committed
fs: Adjust to new mkfs.exfat behaviour in exfatprogs >= 1.4.0
mkfs.exfat now also creates a partition table, similarly to how mkfs.vfat does it.
1 parent 711c764 commit cdb5504

3 files changed

Lines changed: 41 additions & 9 deletions

File tree

src/plugins/fs/exfat.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ G_GNUC_INTERNAL BDExtraArg **
136136
bd_fs_exfat_mkfs_options (BDFSMkfsOptions *options, const BDExtraArg **extra) {
137137
GPtrArray *options_array = g_ptr_array_new ();
138138
const BDExtraArg **extra_p = NULL;
139+
UtilDep dep = {"mkfs.exfat", "1.4.0", "--version", "exfatprogs version[:\\s]+([\\d\\.]+).+"};
140+
gboolean new_exfat = FALSE;
139141

140142
if (options->label && g_strcmp0 (options->label, "") != 0)
141143
g_ptr_array_add (options_array, bd_extra_arg_new ("-n", options->label));
@@ -145,6 +147,15 @@ bd_fs_exfat_mkfs_options (BDFSMkfsOptions *options, const BDExtraArg **extra) {
145147
g_ptr_array_add (options_array, bd_extra_arg_copy ((BDExtraArg *) *extra_p));
146148
}
147149

150+
if (options->no_pt) {
151+
/* only exfatprogs >= 1.4.0 (sometimes) creates the partition table */
152+
new_exfat = bd_utils_check_util_version (dep.name, dep.version,
153+
dep.ver_arg, dep.ver_regexp,
154+
NULL);
155+
if (new_exfat)
156+
g_ptr_array_add (options_array, bd_extra_arg_new ("-P", "none"));
157+
}
158+
148159
g_ptr_array_add (options_array, NULL);
149160

150161
return (BDExtraArg **) g_ptr_array_free (options_array, FALSE);

src/plugins/fs/generic.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,10 @@ static const BDFSFeatures fs_features[BD_FS_LAST_FS] = {
146146
.max_size = 16 TiB },
147147
/* EXFAT */
148148
{ .resize = 0,
149-
.mkfs = BD_FS_MKFS_LABEL,
149+
.mkfs = BD_FS_MKFS_LABEL | BD_FS_MKFS_NOPT,
150150
.fsck = BD_FS_FSCK_CHECK | BD_FS_FSCK_REPAIR,
151151
.configure = BD_FS_SUPPORT_SET_LABEL | BD_FS_SUPPORT_SET_UUID,
152-
.features = 0,
152+
.features = BD_FS_FEATURE_PARTITION_TABLE,
153153
.partition_id = "0x07",
154154
.partition_type = "ebd0a0a2-b9e5-4433-87c0-68b6b72699c7",
155155
.min_size = 3 MiB,

tests/fs_tests/exfat_test.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import os
2+
import re
13
import tempfile
24

5+
from packaging.version import Version
6+
37
from .fs_test import FSTestCase, FSNoDevTestCase, mounted
48

59
import overrides_hack
@@ -8,6 +12,18 @@
812
from gi.repository import BlockDev, GLib
913

1014

15+
def _get_exfatprogs_version():
16+
_ret, out, _err = utils.run_command("mkfs.exfat --version")
17+
# exfatprogs version : 1.4.1 (2026-05-28)
18+
m = re.search(r"exfatprogs version : ([\d\.]+)", out)
19+
if not m or len(m.groups()) != 1:
20+
raise RuntimeError("Failed to determine exfatprogs version from: %s" % out)
21+
return Version(m.groups()[0])
22+
23+
24+
EXFATPROGS_VERSION = _get_exfatprogs_version()
25+
26+
1127
class ExfatNoDevTestCase(FSNoDevTestCase):
1228
def setUp(self):
1329
super(ExfatNoDevTestCase, self).setUp()
@@ -25,6 +41,11 @@ def setUp(self):
2541

2642
self.mount_dir = tempfile.mkdtemp(prefix="libblockdev.", suffix="exfat_test")
2743

44+
if EXFATPROGS_VERSION < Version("1.4.0"):
45+
self._mkfs_options = None
46+
else:
47+
self._mkfs_options = [BlockDev.ExtraArg.new("-P", "none")]
48+
2849

2950
class ExfatTestAvailability(ExfatNoDevTestCase):
3051

@@ -80,15 +101,15 @@ def test_exfat_features(self):
80101
self.assertFalse(features.mkfs & BlockDev.FSMkfsOptionsFlags.UUID)
81102
self.assertFalse(features.mkfs & BlockDev.FSMkfsOptionsFlags.DRY_RUN)
82103
self.assertFalse(features.mkfs & BlockDev.FSMkfsOptionsFlags.NODISCARD)
83-
self.assertFalse(features.mkfs & BlockDev.FSMkfsOptionsFlags.NOPT)
104+
self.assertTrue(features.mkfs & BlockDev.FSMkfsOptionsFlags.NOPT)
84105

85106
self.assertTrue(features.fsck & BlockDev.FSFsckFlags.CHECK)
86107
self.assertTrue(features.fsck & BlockDev.FSFsckFlags.REPAIR)
87108

88109
self.assertTrue(features.configure & BlockDev.FSConfigureFlags.LABEL)
89110
self.assertTrue(features.configure & BlockDev.FSConfigureFlags.UUID)
90111

91-
self.assertEqual(features.features, 0)
112+
self.assertEqual(features.features, BlockDev.FSFeatureFlags.PARTITION_TABLE)
92113

93114
self.assertEqual(features.partition_id, "0x07")
94115
self.assertEqual(features.partition_type, "ebd0a0a2-b9e5-4433-87c0-68b6b72699c7")
@@ -132,7 +153,7 @@ class ExfatTestCheck(ExfatTestCase):
132153
def test_exfat_check(self):
133154
"""Verify that it is possible to check an exfat file system"""
134155

135-
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0])
156+
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0], self._mkfs_options)
136157
self.assertTrue(succ)
137158

138159
succ = BlockDev.fs_exfat_check(self.loop_devs[0])
@@ -143,7 +164,7 @@ class ExfatTestRepair(ExfatTestCase):
143164
def test_exfat_repair(self):
144165
"""Verify that it is possible to repair an exfat file system"""
145166

146-
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0])
167+
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0], self._mkfs_options)
147168
self.assertTrue(succ)
148169

149170
succ = BlockDev.fs_exfat_repair(self.loop_devs[0])
@@ -154,7 +175,7 @@ class ExfatGetInfo(ExfatTestCase):
154175
def test_exfat_get_info(self):
155176
"""Verify that it is possible to get info about an exfat file system"""
156177

157-
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0], None)
178+
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0], self._mkfs_options)
158179
self.assertTrue(succ)
159180

160181
fi = BlockDev.fs_exfat_get_info(self.loop_devs[0])
@@ -171,7 +192,7 @@ class ExfatSetLabel(ExfatTestCase):
171192
def test_exfat_set_label(self):
172193
"""Verify that it is possible to set label of an exfat file system"""
173194

174-
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0], None)
195+
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0], self._mkfs_options)
175196
self.assertTrue(succ)
176197

177198
fi = BlockDev.fs_exfat_get_info(self.loop_devs[0])
@@ -207,7 +228,7 @@ class ExfatSetUUID(ExfatTestCase):
207228
def test_exfat_set_uuid(self):
208229
"""Verify that it is possible to set UUID/volume ID of an exfat file system"""
209230

210-
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0])
231+
succ = BlockDev.fs_exfat_mkfs(self.loop_devs[0], self._mkfs_options)
211232
self.assertTrue(succ)
212233

213234
succ = BlockDev.fs_exfat_set_uuid(self.loop_devs[0], "0x2E24EC82")

0 commit comments

Comments
 (0)