block: try multiple NTFS filesystem implementations
authorRafał Miłecki <rafal@milecki.pl>
Thu, 3 Nov 2022 13:21:49 +0000 (14:21 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Thu, 10 Nov 2022 12:37:36 +0000 (13:37 +0100)
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@milecki.pl>
block.c

diff --git a/block.c b/block.c
index 40c52a060db8096fd39c25224ce62a16cb17d74d..4b45200ad3812f5b79bda5d53c72a13ca5e92636 100644 (file)
--- 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);