From 3affe9ea5098c8bb90111ce97d50ad976ef0c034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Thu, 3 Nov 2022 14:21:49 +0100 Subject: block: try multiple NTFS filesystem implementations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- 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); -- cgit v1.2.1