[PATCH] block: try multiple NTFS filesystem implementations
Rafał Miłecki
zajec5 at gmail.com
Thu Nov 3 06:21:49 PDT 2022
From: Rafał Miłecki <rafal at milecki.pl>
NTFS filesystem is supported by multiple implementations. Try mounting
it using all known drivers. Trying just "ntfs" string was limiting
fstools to compatibility with the read-only upstream Linux driver.
This fixes:
daemon.err block: No "mount.ntfs" utility available
daemon.err block: mounting /dev/sda1 (ntfs) as /mnt/sda1 failed (25) - Not a tty
Above errors were appearing even with ntfs3 upstrea kernel driver or
ntfs-3g (user-space) installed.
Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
---
block.c | 33 +++++++++++++++++++++++++++++----
1 file changed, 29 insertions(+), 4 deletions(-)
diff --git a/block.c b/block.c
index 40c52a0..4b45200 100644
--- a/block.c
+++ b/block.c
@@ -934,15 +934,34 @@ static int exec_mount(const char *source, const char *target,
return err;
}
+static const char * const ntfs_fs[] = { "ntfs3", "ntfs-3g", "antfs", "ntfs" };
+
static int handle_mount(const char *source, const char *target,
const char *fstype, struct mount *m)
{
- int i, err;
size_t mount_opts_len;
char *mount_opts = NULL, *ptr;
+ const char * const *filesystems;
+ int err = -EINVAL;
+ size_t count;
+ int i;
+
+ if (!strcmp(fstype, "ntfs")) {
+ filesystems = ntfs_fs;
+ count = ARRAY_SIZE(ntfs_fs);
+ } else {
+ filesystems = &fstype;
+ count = 1;
+ }
- err = mount(source, target, fstype, m ? m->flags : 0,
- (m && m->options) ? m->options : "");
+ for (i = 0; i < count; i++) {
+ const char *fs = filesystems[i];
+
+ err = mount(source, target, fs, m ? m->flags : 0,
+ (m && m->options) ? m->options : "");
+ if (!err || errno != ENODEV)
+ break;
+ }
/* Requested file system type is not available in kernel,
attempt to call mount helper. */
@@ -979,7 +998,13 @@ static int handle_mount(const char *source, const char *target,
}
/* ... and now finally invoke the external mount program */
- err = exec_mount(source, target, fstype, mount_opts);
+ for (i = 0; i < count; i++) {
+ const char *fs = filesystems[i];
+
+ err = exec_mount(source, target, fs, mount_opts);
+ if (!err)
+ break;
+ }
}
free(mount_opts);
--
2.34.1
More information about the openwrt-devel
mailing list