diff mbox series

block: try multiple NTFS filesystem implementations

Message ID 20221103132149.14232-1-zajec5@gmail.com
State Accepted
Delegated to: Rafał Miłecki
Headers show
Series block: try multiple NTFS filesystem implementations | expand

Commit Message

Rafał Miłecki Nov. 3, 2022, 1:21 p.m. UTC
From: Rafał Miłecki <rafal@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@milecki.pl>
---
 block.c | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)
diff mbox series

Patch

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);