[[!meta copyright="Copyright © 2026 Free Software Foundation, Inc."]]

[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable
id="license" text="Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no Invariant
Sections, no Front-Cover Texts, and no Back-Cover Texts.  A copy of the license
is included in the section entitled [[GNU Free Documentation
License|/fdl]]."]]"""]]

Hello and welcome to another Qoth!  Here's what's been happening in Q2
of 2026!

Joshua Branson added a pretty cool svg logo for our [[ethernet
multiplexor|hurd/translator/eth-multiplexer]].  He built that image
with Inkscape whilst using a Hurd laptop (Thinkpad 420) running on
real iron! The Hurd wiki could certainly use more artwork.  Perhaps
you have a favorite Hurd translator that you believes needs some
artwork!

Sergey Bugaev announced his [WIP
9pfs](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00012.html)
([source code](https://github.com/bugaevc/9pfs)),
and it has a [[wiki page|hurd/translator/9pfs]]! He writes:

    Some years ago, I experimented with implementing a 9P translator for
    the Hurd. Hopefully there is no need to tell this list what 9P is :)

    Besides just browsing files on the few existing servers out there, a
    potential use case is virtio-9p, to enable shared directory trees
    between VMs and the host. But that would need someone to implement
    virtio support in the Hurd.

    I wanted to complete 9pfs before publishing, but that ultimately
    didn't happen, so now it's time to turn it over to the community. I
    now went and made the repository public on GitHub:
    https://github.com/bugaevc/9pfs

    What's implemented is basic browsing (readdir, stat), path resolution
    (dir_lookup), and reading files (io_read). And below that, the whole
    tracking for nodes, peropens, protids, fids, tags, and 9p RPCs.

    Improvements are welcome, send patches to this list with [PATCH 9pfs]
    in the subject. A good starting point would be to continue porting
    things that I had implemented in the old netfs-based version (see
    netfs.c) but didn't yet port to the new one.

He then got a little more motivated, and he added some write support!

Etienne Brateau added
[validation](https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00098.html)
to [msync](https://man7.org/linux/man-pages/man2/msync.2.html), so
that the Hurd better follows POSIX.

Diego Nieto Cid worked on allowing privileged users to set their task
priority (nice value).  His patches landed in
[glibc](https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00100.html)
and [GNU
Mach](https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00099.html).
He also fixed a [tiny
bug](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00232.html)
in our test suite. He fixed an adjtime bug, which is helpful to [the
OpenNTPD
port](https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00061.html),
and he fixed
[two more](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00133.html)
[bugs](https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00117.html).


Paulo Duarte sent a RFC patch series trying to commit Sergey’s
previous AArch64 work. He writes:

    This series adds the gnumach kernel-side implementation for the
    aarch64 ABI Sergey landed in April 2024, plus the test-suite arms.
    Patch 01 brings in the aarch64-only sources from bugaevc/wip-aarch64
    verbatim, with Sergey as Author; the rest is mine.

    The meaningful divergence from wip-aarch64 is what I left out:
    roughly 150 files of cross-arch refactoring across kern/, ipc/, vm/,
    device/intr.{c,h}, and the i386 tree. Each got replaced with a
    smaller per-arch shim under aarch64/ so kern/bootstrap.c,
    device/intr.{c,h}, kern/lock.h, and the i386 trees all stay
    bit-identical to current master. The shared-file footprint outside
    aarch64/ is four files: a new ELF constant, two missing decls plus
    their include, and a linker-symbol filter extension...

    Tested: 12/12 pass on x86_64, i686, and aarch64 under qemu. No
    bare-metal validation yet. I plan to build bootable images and boot
    the kernel on Apple M1 / Raspberry Pi (aarch64) and an x86_64 box
    (x86_64 + i686). Help on any of these welcome.


He also fixed a [tiny cross compilation issue](https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00077.html).


gfleury fixed some [tmpfs
typos](https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00038.html).
He also fixed a [kernel crash on a null pointer
deference](https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00101.html).

Almudena Garcia is developing a [WIP trivfs implementation in
rust](https://gitlab.com/AlmuHS/hurd-translator-in-rust).  The work is
not complete yet, but it is possible to write Hurd translators in Rust!

Mikhail Karpov added some checks for [mmap in several places](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00165.html).
He also worked on adding storeio to the [bootstrap
chain](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00221.html).
This is actually quite interesting.  Currently the Hurd sets device
entries in `/dev/` statically.  For example, I am writing this qoth on
a Hurd machine that is using two `/dev/` entries for my filesystem:
`/dev/wd0s1` for swap and `/dev/wd0s5` for my root filesystem.
However, `/dev/wd0s1` through `/dev/wd0s16` exist on my computer!
Once Mikhail's project is done, then the Hurd will dynamically
populate SATA devices at boot time!  No more need for static
translators! [He
writes](https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00041.html):


    I've expanded the functionality of the partfs translator to work
	with multiple disks and their partitions. Thus, by running the
    command:
	settrans -c partfs /hurd/partfs /root/disk1.img /root/disk2.img /root/disk3.img


    The translator directory will have the following directory tree:
    partfs
    ├── 0
    │ ├── 1
    │ ├── 2
    │ └── ...
    ├── 1
    │ ├── 1
    │ ├── 2
    │ └── ...
    ├── 2
    │ ├── 1
    │ ├── 2
    │ └── ...
    Since the disks are directories, the cd and ls commands work in the translator node.

    I also tested mounting, reading, and writing using the commands:
    `settrans -c ext01 /hurd/ext2fs -w -T typed file:/root/partfs/0/1`
    and
    `settrans -c ext1_1 /hurd/ext2fs -w -T typed part:1:file:/root/partfs/1`

It actually is even cooler!  Samuel (our fearless leader) is [seeking
feedback](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00187.html)
for how to name these newer `/dev` entries. Samuel [writes](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00187.html):

    One thing that would be really needed for efficiency is to implement
    netfs_file_get_storage_info, so that libstore would be able to get the
    underlying storage information, and directly get data from there rather
    than partfs having to pass data with io_read/write.

    I'm then wondering how this would fit in the "grand scheme". Our current
    approach, /dev/hd0s* being always there, is indeed not really good
    because it doesn't easily tell the user which partitions are actually
    there. We used to have to have this because partitions used to be
    handled by the kernel, and then we have moved to
    storerio+parted-supported partitions, which brings much more
    flexibility.

    Perhaps we could use

    settrans -c /dev/hd0s /hurd/partfs /dev/hd0

    and then we'd have /dev/hd0s/1, which is almost like before, but allows
    the entries to be dynamic. Actually, we could even have some

    settrans -c /dev/hd /hurd/probedisk hd

    and then we'd have /dev/hd/0, and we could have /dev/hd/0s being partfs,
    so we'd eventually have

    /dev/hd/0s/1

    But I'm also thinking that perhaps it could be integrated more with
    storeio, i.e. /dev/hd0 can as well also act as a directory with partfs
    behavior, so you could have

    /dev/hd0/1

    and with the probedisk translator, you could have

    /dev/hd/0/1

    What do people think about it?


Mike Kelly has been hard at work [porting OpenBSD’s
OpenNTPD](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00185.html),
which required some glibc work. The Hurd doesn't currently have a
NTP daemon, so thanks Mike!

He also debugged a [weird memory error with
rump](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00029.html),
and he provided a ["brown-tape"
solution](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00136.html)
for it. Hopefully, he (or you dear reader), can reach out to the
NetBSD people to fix this bug.  This just goes to show that when two
projects use the same code, both projects benefit!

He also got a [glibc patch
committed](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00012.html).
Essentially `SIGSTOP`/`SIGCONT` was duplicating portions of files,
which is now fixed.  However, there are still some [other
issues](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00149.html)
with building some haskell packages.

Joan Lledó continued his work
[on](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00067.html)
[porting](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00146.html)
[dhcpcd](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00028.html).
Also Roy Maples, the dhcpcd maintainer did a lot of helpful work to
help us out.  Thanks Roy!

Bradley Morgan fixed a [tiny implementation bug with
cat](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00120.html). He
also tweaked procfs to [show hidden
files](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00122.html),
and he [allowed passing “-s” to
init](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00082.html).
Previously, passing "-s" to init was silently ignored.

Johannes Schauer Marin Rodrigues has been working on getting [s-build
to run on amd64
Hurd](https://lists.debian.org/debian-hurd/2026/06/msg00000.html).  It
is a rather long email thread, so grab some popcorn and dig in!

Milos Nikic ported
[Neovim](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00141.html).
He also worked on
[bug](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00179.html)
[fixes](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00195.html)
to
[libdiskfs](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00020.html),
and he fixed a deadlock bug in the [“ext3/ext4” filesystem
journal](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00171.html).


In the last qoth we had talked about how the Milos was working on
adding an ext3/ext4 binary compatible journal.  Samuel has committed
it!  Samuel wrote:

    There is a couple things that I fixed on the fly:

    - We want to use pthread_cond_clockwait rather than
      pthread_cond_timedwait, to be able to use CLOCK_MONOTONIC instead of
      CLOCK_REALTIME, to avoid being hit by ntpdate and such.

    - In diskfs_S_dir_rename, there was an addition of:

      pthread_mutex_unlock (&fnp->lock);

      which was clearly bogus: we were unlocking it again below.

    There are a couple things that we'd want to fix now:

    - when calling diskfs_file_update, don't we have to be inside a
      transaction? Otherwise if we pass wait=1 and use a journal, we won't
      be waiting AIUI? Notably, in diskfs_S_dir_rmdir we don't use a
      transaction. And ideally we'd have an assertion that makes sure we
      respect this.

    - we should define some helper for this recurring pattern:

      if ((docommit) && (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
        diskfs_journal_commit_transaction (txn);
      else
        diskfs_journal_stop_transaction (txn);

    - journal_drain_deferred_blocks should document what it does, not just
      its call conditions :), and more generally the functions that are
      not already documented in a .h and not just a _locked variant of a
      documented function.

Leonardo Lopes Pereira did some [spring
cleaning](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00083.html)
to remove some [dead
code](https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00084.html).



Samuel Thibault mentioned [in an
email](https://lists.debian.org/debian-hurd/2026/04/msg00016.html)
that the Hurd can support nvmes with rump, but that the work was just
not done yet.  Perhaps you, dear reader, would like to help us
accomplish this task?

The mysterious user yelini worked on [porting the D language compiler](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00069.html).


Damien Zammit worked on [tweaking the Hurd’s WIP
CI](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00139.html).
He also
[fixed](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00106.html)
[several](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00100.html)
[bugs](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00117.html)
to make it possible to run the Hurd’s test suite from GNU/Linux
running on an AArch64 computer. He also is working on integrating
qemu’s Hurd support into [upstream qemu’s
CI](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00102.html),
so that the support does not bitrot.


Sophiel Zhou fixed [a tiny pfinet permission checking
issue](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00027.html)
and taught [pfinet to not fail under memory pressure](https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00043.html):

    This series fixes two latent crash bugs in pfinet where mmap
    return values go unchecked, may causing crash when memory is tight.

    Both bugs follow the same pattern: mmap is called to grow a buffer,
    but the returned pointer is dereferenced before (or without) checking
    for MAP_FAILED.  Under normal operation mmap rarely fails, so these
    have gone unnoticed, but under address-space pressure pfinet would
    crash.

