Paragon NTFS3 driver backported to OpenWrt 5.10 kernel - how to test

Summary (tl;dr)
It is eminently doable to get Paragon's ntfs read/write (ntfs3) driver into OpenWrt today. Further work and testing are, of course, required, but the following proof of concept works and the performance gains are not insignificant, even over the in-kernel antfs driver.

EDIT: Reference 4 below now contains pre-built binaries for a few platforms. See the later post in this thread for a list of platforms which are included. It also contains a README with a mostly copy-and-paste set of instructions for building.

References:

  1. Paragon's initial announcement/release of their NTFS driver
  2. Complete Linux Kernel 5.15 with Paragon's in-tree NTFS read-write driver (NTFS3)
  3. ARCH Linux backport patches of the in-tree NTFS3 driver to kernel 5.12
  4. My 5.12 -> 5.10 backport patch (plus a complete unified diff with driver and backports applied)

Background:
In August last year Paragon released (1) an open source rewrite of their decade (at least) old Linux NTFS driver. It is available in two flavours: a module designed to be compiled outside the Linux kernel tree, and an in-tree version (2) designed to be made by the standard Linux kernel config and build system. The Arch Linux project then created (3) a set of patches to backport this driver back to kernel 5.12. I did a little work to bring this backport back to kernel 5.10 (4) and have successfully tested it in OpenWrt.

Procedure:
This kernel module is not (yet) in a state to be made into an OpenWrt package. To use it you must, in broad strokes:

  1. Set up and build any version of OpenWrt that uses kernel 5.10
  2. Patch the in-OpenWrt-tree kernel with the unified diff I made (4)
  3. Perform a $ make kernel_menuconfig, navigate to File systems -> DOS/FAT/EXFAT/NT Filesystems and turn on "NTFS Read-Write file system support" as a module
  4. Optionally you may turn on the option "activate support of external compressions lzx/xpress", but not (yet) "NTFS POSIX Access Control Lists"
  5. $ make the kernel
  6. Copy out the ntfs3.ko created in the kernel treet, and move it to a device running the same snapshot you downloaded and built above.

To do the above, I have created a unified patch (4) that combines all the individual Arch backport patches, my own modest patch, and which also patches it into fs/Makefile and fs/Kconfig. I created this patch by:

  1. Downloading the Linux tree with the in-tree driver from Paragon's git repository (2)
  2. Downloading the Arch patches from their git repository (3)
  3. Pulling fs/ntfs3/ from Paragon's 5.15 kernel tree and putting it in OpenWrt's kernel 5.10 tree
  4. Applying, in order, Arch's 5.15, 5.14, and 5.12 backport patches
  5. Editing xattr.c to fix minor issues and creating my own 5.10 backport patch with these changes
  6. Editing fs/Makefile and fs/Kconfig to add ntfs3 to both
5 Likes

Seems that part would negate "today"...

So that's a big reach.

I didn't say wide deployment. I set getting it into OpenWrt. Since it's sitting on my R6700v2, today as I type this, I assess it is not as much of a reach as you maintain.

1 Like

Maintenance doesn't stop immediately after throwing a patchset over the fence, it needs to remain supported for OpenWrt's predictable 2-3 year release cycle. It doesn't exactly instil confidence either that Paragon has gone silent pretty much immediately after ntfs3 has been merged mainline - and their userspace support tools (mkfs/ fsck) are also still 'pending'.

5 Likes

Initial post was long, so I left out the preliminary testing. Initial performance testing is encouragingly positive:
mt7621-based Netgear R6700v2 test platform with OpenWrt snapshot with a Seagate 8TB USB3 external archival drive (~150MB/s sustained write speed when connected to my laptop)

antfs:

root@shadow:/mnt/Trunk# pv -S -s 1G /dev/zero > zero
1.00GiB 0:00:21 [46.7MiB/s] [===================================>] 100%
root@shadow:/mnt/Trunk# pv zero > /dev/null 
1.00GiB 0:01:28 [11.6MiB/s] [===================================>] 100%

CPU 4-logical-core average, 54.5%.
Breakdown: 80%/51%/50%/47%

ntfs3:

root@shadow:/mnt/Trunk# pv -S -s 1G /dev/zero > zero
1.00GiB 0:00:12 [79.5MiB/s][===================================>] 100%
root@shadow:/mnt/Trunk# pv zero > /dev/null 
1.00GiB 0:00:11 [85.4MiB/s] [==================================>] 100% 

CPU 4-logical-core average, 38.75%
Breakdown: 87%/24%/25%/19%

The CPU load was measured with htop on a 10-second average.

This isn't an extensive test by any means. Sustained writes appear to be about 70% faster with ntfs3, and when you factor out the CPU core with pv itself, the CPU load for ntfs3 is about half that of antfs. I'm not quite sure what to make of antfs's terrible sustained read speed, but I ran the test several times on files located all over that drive. Can someone independently verify?

Perhaps. To that I'll only point out that antfs is itself a homebrew kitbash of the user-space ntfs-3g library into kernel space and it hasn't seen an official commit in the four years since it was first made.

<soapbox>Point is, I'm not slagging antfs. It was a great idea and it filled (fills) a need. The need was the fact that the FUSE ntfs-3g was the rate limiting step in the network file access chain for NTFS. Right now, for even lower end consumer-grade networking devices, antfs is (by a large factor) the rate limiting step in that same chain. If it was the network, I'd say screw it, we can afford to make people wait a year and a half. But I maintain the same need exists to bring in ntfs3 today that existed when the same decision was made for antfs.</soapbox>

5 Likes

I have made pre-built ntfs3 kernel module binaries for a few platforms to make it easier for people to play with. They are included for the following platforms:
RAMIPS/mt7621
MEDIATEK/mt7222
MEDIATEK/mt7623
IPQ806x/generic

These are located in the patch download at reference 4 above. Anyone without the resources to build the module for themselves and who wants to test it, feel free to let me know and I may be willing to add more platforms to the above.

That being said, to make building it a little easier I have also included a README in the tarball with a mostly copy-and-paste set of commands.

2 Likes

I came here due to some searching regarding OpenWRT and antfs, because the last time I rebuilt OpenWRT I switched. (I've been using ntfs-3g for quite a while). It turns out antfs was a gigantic mistake. (It took a while to notice because I haven't used DLNA from the router for a while...)

On an Archer C2600, a 50MB read takes more than 50 seconds with antfs. Yes, that's right, I'm seeing sustained reads of <1 MB/second, and it's CPU-bound. ntfs-3g can do 38+ and I'm pretty sure it's bound by the limits of a 5400RPM rustspinner. (Will check CPU utilization tonight.)

Hi, like this work. In the hope to get us on board a little bit easier, I've set up a feed so we can avoid these patch work.

And correct me if I'm wrong, kmod from feed/out of kernel tree seems to not change a firmware's vermagic?

3 Likes

Fantastic! Thank-you! Great work.

Correct.

2 Likes

Hello,

nice work with the feed, I compiled a build for my router asus n13u b1, and it works nice, and I compiled the same for my other router 1043nd v4, and here the ntfs partition won't mount. Is this driver incompatible with ath79?

This was the error message.

mounting /dev/sda1 (ntfs) as /mnt/sda1 failed (22) - Invalid argument
mount.ntfs: failed with status 28416

show dmesg

root@OpenWrt:~# dmesg
[    0.000000] Linux version 5.10.146 (builder@buildhost) (mips-openwrt-linux-musl-gcc (OpenWrt GCC 11.2.0 r19803-9a599fee93) 11.2.0, GNU ld (GNU Binutils) 2.37) #0 Fri Oct 14 22:44:41 2022
[    0.000000] printk: bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 00019750 (MIPS 74Kc)
[    0.000000] MIPS: machine is TP-Link TL-WR1043ND v4
[    0.000000] SoC: Qualcomm Atheros QCA956X ver 1 rev 0
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, VIPT, cache aliases, linesize 32 bytes
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000000000000-0x0000000003ffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x0000000003ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000003ffffff]
[    0.000000] On node 0 totalpages: 16384
[    0.000000]   Normal zone: 144 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 16384 pages, LIFO batch:3
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 16240
[    0.000000] Kernel command line: console=ttyS0,115200n8 rootfstype=squashfs,jffs2
[    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
[    0.000000] Writing ErrCtl register=00000000
[    0.000000] Readback ErrCtl register=00000000
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 56176K/65536K available (5850K kernel code, 611K rwdata, 744K rodata, 1232K init, 209K bss, 9360K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS: 51
[    0.000000] CPU clock: 775.000 MHz
[    0.000000] clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 4932285024 ns
[    0.000007] sched_clock: 32 bits at 387MHz, resolution 2ns, wraps every 5541893118ns
[    0.008273] Calibrating delay loop... 385.84 BogoMIPS (lpj=1929216)
[    0.074802] pid_max: default: 32768 minimum: 301
[    0.079800] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.087513] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.097636] dyndbg: Ignore empty _ddebug table in a CONFIG_DYNAMIC_DEBUG_CORE build
[    0.108228] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.118632] futex hash table entries: 256 (order: -1, 3072 bytes, linear)
[    0.125895] pinctrl core: initialized pinctrl subsystem
[    0.135441] NET: Registered protocol family 16
[    0.140840] thermal_sys: Registered thermal governor 'step_wise'
[    0.189610] clocksource: Switched to clocksource MIPS
[    0.202387] NET: Registered protocol family 2
[    0.207192] IP idents hash table entries: 2048 (order: 2, 16384 bytes, linear)
[    0.215582] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes, linear)
[    0.224502] TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.232600] TCP bind hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.240044] TCP: Hash tables configured (established 1024 bind 1024)
[    0.246865] UDP hash table entries: 256 (order: 0, 4096 bytes, linear)
[    0.253806] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes, linear)
[    0.261437] NET: Registered protocol family 1
[    0.266051] PCI: CLS 0 bytes, default 32
[    0.275960] workingset: timestamp_bits=14 max_order=14 bucket_order=0
[    0.286286] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.292489] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[    0.304489] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[    0.314825] pinctrl-single 1804002c.pinmux: 544 pins, size 68
[    0.321403] gpio-export gpio-export: 1 gpio(s) exported
[    0.327656] Serial: 8250/16550 driver, 16 ports, IRQ sharing enabled
[    0.336497] printk: console [ttyS0] disabled
[    0.341114] 18020000.uart: ttyS0 at MMIO 0x18020000 (irq = 9, base_baud = 1562500) is a 16550A
[    0.350227] printk: console [ttyS0] enabled
[    0.359273] printk: bootconsole [early0] disabled
[    0.385661] spi-nor spi0.0: w25q128 (16384 Kbytes)
[    0.390734] 7 fixed-partitions partitions found on MTD device spi0.0
[    0.397329] OF: Bad cell count for /ahb/spi@1f000000/flash@0/partitions
[    0.404196] OF: Bad cell count for /ahb/spi@1f000000/flash@0/partitions
[    0.411471] OF: Bad cell count for /ahb/spi@1f000000/flash@0/partitions
[    0.418330] OF: Bad cell count for /ahb/spi@1f000000/flash@0/partitions
[    0.425766] Creating 7 MTD partitions on "spi0.0":
[    0.430780] 0x000000000000-0x000000020000 : "u-boot"
[    0.440649] 0x000000020000-0x000000f50000 : "firmware"
[    0.447263] 2 tplink-fw partitions found on MTD device firmware
[    0.453444] Creating 2 MTD partitions on "firmware":
[    0.458579] 0x000000000000-0x000000223fc7 : "kernel"
[    0.463719] mtd: partition "kernel" doesn't end on an erase/write block -- force read-only
[    0.474614] 0x000000223fc7-0x000000f30000 : "rootfs"
[    0.479799] mtd: partition "rootfs" doesn't start on an erase/write block boundary -- force read-only
[    0.490221] mtd: device 3 (rootfs) set to be root filesystem
[    0.496903] 1 squashfs-split partitions found on MTD device rootfs
[    0.503351] 0x000000850000-0x000000f30000 : "rootfs_data"
[    0.509898] 0x000000f50000-0x000000f70000 : "info"
[    0.517228] 0x000000f70000-0x000000fc0000 : "config"
[    0.523350] 0x000000fc0000-0x000000fd0000 : "partition-table"
[    0.531689] 0x000000fd0000-0x000000ff0000 : "logs"
[    0.537567] 0x000000ff0000-0x000001000000 : "art"
[    1.263642] switch0: Atheros AR8337 rev. 2 switch registered on mdio.0
[    1.921155] ag71xx 19000000.eth: connected to PHY at mdio.0:00 [uid=004dd036, driver=Atheros AR8216/AR8236/AR8316]
[    1.932431] eth0: Atheros AG71xx at 0xb9000000, irq 4, mode: sgmii
[    1.939260] i2c /dev entries driver
[    1.945408] NET: Registered protocol family 10
[    1.960098] Segment Routing with IPv6
[    1.963994] NET: Registered protocol family 17
[    1.968656] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[    1.982088] 8021q: 802.1Q VLAN Support v1.8
[    1.998927] VFS: Mounted root (squashfs filesystem) readonly on device 31:3.
[    2.012985] Freeing unused kernel memory: 1232K
[    2.017664] This architecture does not have kernel memory protection.
[    2.024363] Run /sbin/init as init process
[    2.028592]   with arguments:
[    2.028596]     /sbin/init
[    2.028599]   with environment:
[    2.028603]     HOME=/
[    2.028607]     TERM=linux
[    2.859772] init: Console is alive
[    2.863719] init: - watchdog -
[    4.577843] kmodloader: loading kernel modules from /etc/modules-boot.d/*
[    4.642147] usbcore: registered new interface driver usbfs
[    4.647865] usbcore: registered new interface driver hub
[    4.653479] usbcore: registered new device driver usb
[    4.670980] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    4.685807] SCSI subsystem initialized
[    4.695393] ehci-fsl: Freescale EHCI Host controller driver
[    4.703848] ehci-platform: EHCI generic platform driver
[    4.709580] ehci-platform 1b000000.usb: EHCI Host Controller
[    4.715512] ehci-platform 1b000000.usb: new USB bus registered, assigned bus number 1
[    4.723736] ehci-platform 1b000000.usb: irq 12, io mem 0x1b000000
[    4.759634] ehci-platform 1b000000.usb: USB 2.0 started, EHCI 1.00
[    4.766878] hub 1-0:1.0: USB hub found
[    4.771529] hub 1-0:1.0: 1 port detected
[    4.783843] usbcore: registered new interface driver usb-storage
[    4.791364] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[    4.800795] init: - preinit -
[    5.209793] usb 1-1: new high-speed USB device number 2 using ehci-platform
[    5.685592] usb-storage 1-1:1.0: USB Mass Storage device detected
[    5.751018] scsi host0: usb-storage 1-1:1.0
[    5.860806] random: procd: uninitialized urandom read (4 bytes read)
[    6.530846] random: jshn: uninitialized urandom read (4 bytes read)
[    6.884989] scsi 0:0:0:0: Direct-Access     ST380215 A                     PQ: 0 ANSI: 2 CCS
[    6.910554] sd 0:0:0:0: [sda] 156301488 512-byte logical blocks: (80.0 GB/74.5 GiB)
[    6.929684] sd 0:0:0:0: [sda] Write Protect is off
[    6.934679] sd 0:0:0:0: [sda] Mode Sense: 28 00 00 00
[    6.935404] sd 0:0:0:0: [sda] No Caching mode page found
[    6.940946] sd 0:0:0:0: [sda] Assuming drive cache: write through
[    6.983546]  sda: sda1 sda2
[    6.991667] sd 0:0:0:0: [sda] Attached SCSI disk
[    7.013880] random: jshn: uninitialized urandom read (4 bytes read)
[    7.268833] random: jshn: uninitialized urandom read (4 bytes read)
[    7.332515] random: jshn: uninitialized urandom read (4 bytes read)
[    8.806595] Atheros AR8216/AR8236/AR8316 mdio.0:00: Port 2 is up
[    8.813347] Atheros AR8216/AR8236/AR8316 mdio.0:00: Port 5 is up
[    8.829687] eth0: link up (1000Mbps/Full duplex)
[    8.834551] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[    8.854960] IPv6: ADDRCONF(NETDEV_CHANGE): eth0.1: link becomes ready
[   13.233792] mount_root: loading kmods from internal overlay
[   13.271662] kmodloader: loading kernel modules from //etc/modules-boot.d/*
[   13.282990] kmodloader: done loading kernel modules from //etc/modules-boot.d/*
[   13.853693] block: attempting to load /etc/config/fstab
[   13.863881] block: unable to load configuration (fstab: Entry not found)
[   13.871242] block: no usable configuration
[   13.876335] mount_root: jffs2 not ready yet, using temporary tmpfs overlay
[   13.887556] urandom-seed: Seed file not found (/etc/urandom.seed)
[   14.024145] eth0: link down
[   14.046429] procd: - early -
[   14.050347] procd: - watchdog -
[   14.797320] procd: - watchdog -
[   14.869355] procd: - ubus -
[   15.024268] random: ubusd: uninitialized urandom read (4 bytes read)
[   15.033485] random: ubusd: uninitialized urandom read (4 bytes read)
[   15.040642] random: ubusd: uninitialized urandom read (4 bytes read)
[   15.054749] procd: - init -
[   16.256304] random: jshn: uninitialized urandom read (4 bytes read)
[   16.298380] random: ubusd: uninitialized urandom read (4 bytes read)
[   16.403711] kmodloader: loading kernel modules from /etc/modules.d/*
[   16.806553] urngd: v1.0.2 started.
[   16.965753] ntfs3: Max link count 4000
[   16.974746] random: crng init done
[   16.978276] random: 25 urandom warning(s) missed due to ratelimiting
[   16.992811] Loading modules backported from Linux version v5.15.58-0-g7d8048d4e064
[   17.000696] Backport generated by backports.git v5.15.58-1-0-g42a95ce7
[   17.294665] PPP generic driver version 2.4.2
[   17.302392] NET: Registered protocol family 24
[   17.359359] ath: EEPROM regdomain: 0x0
[   17.359372] ath: EEPROM indicates default country code should be used
[   17.359376] ath: doing EEPROM country->regdmn map search
[   17.359390] ath: country maps to regdmn code: 0x3a
[   17.359396] ath: Country alpha2 being used: US
[   17.359400] ath: Regpair used: 0x3a
[   17.371352] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[   17.373192] ieee80211 phy0: Atheros AR9561 Rev:0 mem=0xb8100000, irq=2
[   17.413772] kmodloader: done loading kernel modules from /etc/modules.d/*
[   49.189882] jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
[   49.197026] jffs2_build_filesystem(): unlocking the mtd device... 
[   49.197030] done.
[   49.205420] jffs2_build_filesystem(): erasing all blocks after the end marker... 
[   50.908310] eth0: link up (1000Mbps/Full duplex)
[   50.940163] br-lan: port 1(eth0.1) entered blocking state
[   50.945754] br-lan: port 1(eth0.1) entered disabled state
[   50.951655] device eth0.1 entered promiscuous mode
[   50.956610] device eth0 entered promiscuous mode
[   50.984122] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   51.030411] br-lan: port 1(eth0.1) entered blocking state
[   51.036000] br-lan: port 1(eth0.1) entered forwarding state
[   51.939683] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready
[   76.966559] done.
[   76.968585] jffs2: notice: (2232) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
[   77.384837] overlayfs: upper fs does not support tmpfile.

Try to mount with:
mount -t ntfs3
not
mount -t ntfs

I did, same error occurs.

root@OpenWrt:~# mount -t ntfs3 /dev/sda1 /mnt/sda1
mount: mounting /dev/sda1 on /mnt/sda1 failed: Invalid argument 

I would try to run ntfsfix, check if /proc/modules contains ntfs3

the same drive has plug and play mounting in other router. Before all this I formatted the drive in normal mode (slow). Also tried multiple drives, all with same issue. Weird!

Also

/proc/modules 

is empty. In both routers (this one 1043nd and the other n13ub1.) there's nothing on it.

Just so you know, these are my list-installed on 1043Nd

root@OpenWrt:~# opkg list-installed
aria2 - 1.36.0-2
base-files - 1494-r19803-9a599fee93
block-mount - 2022-06-02-93369be0-2
busybox - 1.35.0-4
ca-bundle - 20211016-1
cgi-io - 2022-08-10-901b0f04-21
dnsmasq - 2.86-14
dropbear - 2022.82-2
fdisk - 2.37.4-1
firewall4 - 2022-10-14-4fbf6d75-1
fstools - 2022-06-02-93369be0-2
fwtool - 2019-11-12-8f7fe925-1
getrandom - 2021-08-03-205defb5-2
hostapd-common - 2022-01-16-cff80b4f-13.1
iw - 5.16-1
iwinfo - 2022-08-19-0dad3e66-1
jansson4 - 2.13.1-2
jshn - 2022-05-15-d2223ef9-1
jsonfilter - 2018-02-04-c7e938d6-1
kernel - 5.10.146-1-1e009b036e6ec38e12ad84969a6f9e0d
kmod-asn1-decoder - 5.10.146-1
kmod-ath - 5.10.146+5.15.58-1-1
kmod-ath9k - 5.10.146+5.15.58-1-1
kmod-ath9k-common - 5.10.146+5.15.58-1-1
kmod-cfg80211 - 5.10.146+5.15.58-1-1
kmod-crypto-aead - 5.10.146-1
kmod-crypto-ccm - 5.10.146-1
kmod-crypto-cmac - 5.10.146-1
kmod-crypto-crc32c - 5.10.146-1
kmod-crypto-ctr - 5.10.146-1
kmod-crypto-des - 5.10.146-1
kmod-crypto-ecb - 5.10.146-1
kmod-crypto-gcm - 5.10.146-1
kmod-crypto-gf128 - 5.10.146-1
kmod-crypto-ghash - 5.10.146-1
kmod-crypto-hash - 5.10.146-1
kmod-crypto-hmac - 5.10.146-1
kmod-crypto-manager - 5.10.146-1
kmod-crypto-md4 - 5.10.146-1
kmod-crypto-md5 - 5.10.146-1
kmod-crypto-null - 5.10.146-1
kmod-crypto-rng - 5.10.146-1
kmod-crypto-seqiv - 5.10.146-1
kmod-crypto-sha256 - 5.10.146-1
kmod-crypto-sha512 - 5.10.146-1
kmod-fs-exfat - 5.10.146-1
kmod-fs-ksmbd - 5.10.146+3.4.5-1
kmod-fs-ntfs3 - 5.10.146+5.15.72-1
kmod-gpio-button-hotplug - 5.10.146-3
kmod-lib-crc-ccitt - 5.10.146-1
kmod-lib-crc32c - 5.10.146-1
kmod-mac80211 - 5.10.146+5.15.58-1-1
kmod-nf-conntrack - 5.10.146-1
kmod-nf-conntrack6 - 5.10.146-1
kmod-nf-flow - 5.10.146-1
kmod-nf-log - 5.10.146-1
kmod-nf-log6 - 5.10.146-1
kmod-nf-nat - 5.10.146-1
kmod-nf-reject - 5.10.146-1
kmod-nf-reject6 - 5.10.146-1
kmod-nfnetlink - 5.10.146-1
kmod-nft-core - 5.10.146-1
kmod-nft-fib - 5.10.146-1
kmod-nft-nat - 5.10.146-1
kmod-nft-offload - 5.10.146-1
kmod-nls-base - 5.10.146-1
kmod-nls-utf8 - 5.10.146-1
kmod-oid-registry - 5.10.146-1
kmod-phy-ath79-usb - 5.10.146-1
kmod-ppp - 5.10.146-1
kmod-pppoe - 5.10.146-1
kmod-pppox - 5.10.146-1
kmod-rt2x00-lib - 5.10.146+5.15.58-1-1
kmod-scsi-core - 5.10.146-1
kmod-slhc - 5.10.146-1
kmod-usb-core - 5.10.146-1
kmod-usb-ehci - 5.10.146-1
kmod-usb-storage - 5.10.146-1
kmod-usb2 - 5.10.146-1
ksmbd-server - 3.4.5-3
libblkid1 - 2.37.4-1
libblobmsg-json20220515 - 2022-05-15-d2223ef9-1
libc - 1.2.3-4
libcurl4 - 7.85.0-6.1
libevent2-7 - 2.1.12-1
libfdisk1 - 2.37.4-1
libgcc1 - 11.2.0-4
libiwinfo-data - 2022-08-19-0dad3e66-1
libiwinfo-lua - 2022-08-19-0dad3e66-1
libiwinfo20210430 - 2022-08-19-0dad3e66-1
libjson-c5 - 0.15-2
libjson-script20220515 - 2022-05-15-d2223ef9-1
liblua5.1.5 - 5.1.5-10
liblucihttp-lua - 2022-07-08-6e68a106-1
liblucihttp0 - 2022-07-08-6e68a106-1
libmbedtls12 - 2.28.1-1
libminiupnpc - 2.2.3-1
libmnl0 - 1.0.5-1
libnatpmp1 - 20150609-3
libncurses6 - 6.3-2
libnftnl11 - 1.2.1-1
libnghttp2-14 - 1.44.0-1
libnl-core200 - 3.5.0-1
libnl-genl200 - 3.5.0-1
libnl-tiny1 - 2021-11-21-8e0555fb-1
libopenssl1.1 - 1.1.1q-1
libpthread - 1.2.3-4
librt - 1.2.3-4
libsmartcols1 - 2.37.4-1
libstdcpp6 - 11.2.0-4
libubox20220515 - 2022-05-15-d2223ef9-1
libubus-lua - 2022-06-01-2bebf93c-1
libubus20220601 - 2022-06-01-2bebf93c-1
libuci20130104 - 2021-10-22-f84f49f0-6
libuclient20201210 - 2021-05-14-6a6011df-1
libucode20220812 - 2022-10-07-4ae70721-1
libustream-wolfssl20201210 - 2022-01-16-868fd881-2
libuuid1 - 2.37.4-1
libwolfssl5.5.1.ee39414e - 5.5.1-stable-3
logd - 2021-08-03-205defb5-2
lua - 5.1.5-10
luci - git-20.074.84698-ead5e81
luci-app-aria2 - git-21.321.27401-9dda104
luci-app-firewall - git-22.089.67563-7e3c1b4
luci-app-ksmbd - git-21.224.17289-a624647
luci-app-opkg - git-22.273.29004-9f6876b
luci-base - git-22.288.45147-96ec0cd
luci-lib-base - git-20.232.39649-1f6dc29
luci-lib-ip - git-20.250.76529-62505bd
luci-lib-jsonc - git-22.097.61921-7513345
luci-lib-nixio - git-20.234.06894-c4a4e43
luci-mod-admin-full - git-19.253.48496-3f93650
luci-mod-network - git-22.244.54818-b13d8c7
luci-mod-status - git-22.189.48501-6731190
luci-mod-system - git-22.264.46172-b6b7da4
luci-proto-ipv6 - git-21.148.48881-79947af
luci-proto-ppp - git-21.158.38888-88b9d84
luci-ssl - git-20.244.36115-e10f954
luci-theme-bootstrap - git-22.288.45147-96ec0cd
mtd - 26
netifd - 2022-08-25-76d2d41b-1
nftables-json - 1.0.2-2.1
ntfs3-mount - 1
odhcp6c - 2022-08-05-7d21e8d8-18
odhcpd-ipv6only - 2022-03-22-860ca900-1
openwrt-keyring - 2022-03-25-62471e69-3
opkg - 2022-02-24-d038e5b6-1
ppp - 2.4.9.git-2021-01-04-3
ppp-mod-pppoe - 2.4.9.git-2021-01-04-3
procd - 2022-06-01-7a009685-1
procd-seccomp - 2022-06-01-7a009685-1
procd-ujail - 2022-06-01-7a009685-1
px5g-wolfssl - 5.1
rpcd - 2022-09-21-8c852b65-1
rpcd-mod-file - 2022-09-21-8c852b65-1
rpcd-mod-iwinfo - 2022-09-21-8c852b65-1
rpcd-mod-luci - 20210614
rpcd-mod-rrdns - 20170710
swconfig - 12
terminfo - 6.3-2
transmission-daemon - 3.00-18
transmission-web - 3.00-18
uboot-envtools - 2022.01-32
ubox - 2021-08-03-205defb5-2
ubus - 2022-06-01-2bebf93c-1
ubusd - 2022-06-01-2bebf93c-1
uci - 2021-10-22-f84f49f0-6
uclient-fetch - 2021-05-14-6a6011df-1
ucode - 2022-10-07-4ae70721-1
ucode-mod-fs - 2022-10-07-4ae70721-1
ucode-mod-ubus - 2022-10-07-4ae70721-1
ucode-mod-uci - 2022-10-07-4ae70721-1
uhttpd - 2022-08-12-e3395cd9-1
uhttpd-mod-ubus - 2022-08-12-e3395cd9-1
urandom-seed - 3
urngd - 2020-01-21-c7f7b6b6-1
usign - 2020-05-23-f1f65026-1
wireless-regdb - 2022.08.12-1
wpad-basic-wolfssl - 2022-01-16-cff80b4f-13.1
wsdd2 - 2021-10-22-9831daf2-1
zlib - 1.2.11-6

@Alpha1096 Please confirm that the output of dmesg that you posted above was done after trying to mount an ntfs partition?
I would do the following:

First make sure the ntfs3 module actually loads insmod ntfs3.ko, then check to make sure it is loaded with lsmod. Then try to mount the ntfs3 partition. If this fails, check dmesg to see if there are any more relevant messages at the end.

Yes, I ran dmesg after the system log showed that error message.

daemon.err block: mount.ntfs: failed with status 28416
daemon.err block: mounting /dev/sda1 (ntfs) as /mnt/sda1 failed (22) - Invalid argument

This shows the module is already loaded ntfs3, confirmed it with lsmod.

I'm positive this is incompatible with my device somehow. I have probably done everything to make it work on 1043Nd, and yet it simply won't work.
I tried to format the (already good) drive using openwrt itself, after formatting I tried to mount the new partition using mount -t ntfs3 /dev/sda1 /mnt/sda1, this time although there wasn't any error like before but the drive still won't mount. When checked, there was nothing inside /mnt/sda1, I couldn't make any file or folder there due to I/O error.

After formatting the drive within openwrt, at least there were some new errors in systemlog..
ntfs3: sda1: Mark volume as dirty due to NTFS errors
This is crazy, the drive is fresh opened new, checked with two fresh drives. Same error.

Another one was
ntfs3: sda1: ino=5, "/" Looks like your dir is corrupt
This I believe happened when I tried to create a folder and it showed I/O error.

Nothing like this happens with my other router asus n13u b1, both of the drives that showed errors on 1043nd are plug and play on the latter. So I'm like 80% sure this ntfs3 driver (or this patch) is somehow not compatible with 1043nd or the whole ath79 family.

Do the antfs and ntfd modules work correctly?