Sergiu Ivanov


Current Activity

I am currently busy finishing the university semester, this is why I am rather passive.


  • Build nsmux under the Hurd tree -- antrik has been urging me to do this for a long time, so I definitely have to give it a try.

  • Try Thomas's nsmux-notify branch -- To support his stance against including nsmux in the Hurd source tree, Thomas added to nsmux the ability to listen to port notification (as I understand it). I have to try that, too.

  • Make proxy nodes go away when the proxied translator goes away -- This should be done by listening to notifications on the ports to the proxied translators. A similar functionality is already implemented in unionmount, but it was decided that nsmux should use standard notification interfaces, as opposed to the custom demuxer and handler implemented in unionmount.

  • Don't attach anonymous translators -- There is no special point in attaching anonymous (formerly known as dynamic) translators to specific nodes. Keeping them orphan should simplify the design of nsmux by eliminating the need for shadow nodes, whose main purpose was to serve as virtual locations to attach translators to.

  • Setup a list of nodes proxying static translators -- This list is needed when for the filter, which should also be able to go down the static translator stack, not only the stack of anonymous translators.

  • Cleanup nsmux -- When I was writing nsmux my acquaintance with good coding and code formatting practices was very basic, which resulted in messy and sometimes ugly code.

  • Implement recursive propagation of translators down directories -- This task was planned long ago and is fascinating, but I won't be working on it in the near future.

Google Summer of Code: 2009 Project

Unionmount: The goal of this project is to make it possible to set translators in unionmount mode, which means that the filesystem published by the mounted translator will get merged with the directory tree of the node the translator is mounted onto.

For documentation, see unionmount.

At the Final Evaluation, this project was given a passing evaluation by antrik. This means that the union-mount functionality is working and has been tested normally to collaborate with eth-multiplexer.



(Dates in brackets show the completion date)

  • Make unionfs build. (24 May) For reasons unknown to me, unionfs Makefile was configured to search for include files from under $(prefix)/include, while $(prefix) was never defined. Setting $(prefix) to /usr solved the problem.

  • Change the command line parsing in unionfs to comply with the requirements of unionmount. (25 May) Although the core functionality of unionmount heavily relies on unionfs, the command line interface of these two programs is completely different: unionfs operates on directories, the list of which is explicitly specified, while unionmount always merges the underlying filesystem and the filesystem published by the mountee. Therefore, options like --add, --remove, --underlying (specific to unionfs) make little sense in unionmount context. These options have been removed. Also, unionmount must be able to pass some switches to the mountee, which means that it should stop parsing the command line arguments immediately after having encountered the path to the mountee (very similar to how settrans works). This functionality has also been implemented.

  • Make unionmount capable of starting the mountee. (28 May) The idea behind implementation of this goal is that unionmount should provide a proxy node on which to set the mountee. The main issue about this goal was the fact that the mountee cannot be started during the initialization of unionmount, because in this phase unionmount is not capable of responding to RPCs, while many translators try to io_stat their underlying node or do other interesting things on startup. The solution to this problem is, obviously, lazy startup, i.e. the mountee is started at the first attempt to access (via dir_lookup or dir_readdir) the merged filesystem published by unionmount.

  • Include the filesystem published by the mountee in the list of merged filesystems. (1 Jun) unionfs operates on a list of ports to the underlying filesystems, therefore, to finish the unionmount functionality, I had to include the port to the mountee in this list.

  • Learn Texinfo. (Jun 4) In order to produce canonical documentation I had to learn the Texinfo documentation format.

  • Write documentation for unionmount. (Jun 5) The basic unionmount functionality being finished, it has to be documented properly, lest it should lag behind and remain unfinished eventually.

  • Write documentation for unionfs. (Jun 5) unionfs is not exactly well-documented at the moment, the only help being provided by the comments in the sources. The goal is to write a more coherent documentation.

  • Start with a clean unionfs and implement the --mount argument (11 Jun) It was suggested to implement the union mount functionality first, instead of doing some partial adaptation of unionfs to unionmount and leaving the complete adaptation for the future.

  • Compile GNU/Hurd from source to be able to study eth-multiplexer. (16 Jun) On my way to getting a working instance of eth-multiplexer I learnt how I could compile GNU/Hurd in a Debian GNU/Hurd system.

  • Setup the devnode--eth-multiplexer--pfinet chain. (30 Jun) Due to the fact that I was trying to build everything using gcc-4.3, I got strange behaviour of pfinet and spend a week trying to figure out the reason.

  • Try to start the mountee during initialization of unionfs (4 Jul) Initially the mountee was started at the first lookup. Now it is started immediately after initialization of unionmount.

  • Fix the patches in --mount option series (5 Jul) The patches have been reviewed by antrik. I corrected them and posted them to the ML for final reviews.

  • Orphan the mountee after starting it (7 Jul) Orphaning the mountee after starting it up seems to be a nice work-around for the necessity of keeping a proxy node in unionmount in simple use-cases. It is possible that this functionality will provided as a separate patch (without inclusion in master) should it turn out that orphaning the mountee is a bad idea.

  • Decide which RPCs should be forwarded to the mountee and how this should happen (10 Jul) This is the primary requirement in being able to proxy the control port of unionmount.

  • Fix the patches the have already been commented on (14 Jul) The new patches I have submitted have been reviewed; also, the older patches have been reviewed again, which required correcting them.

  • Add the --no-mount option (14 Jul) Using the --no-mount and --mount options, the user can decide whether unionmount should be completely transparent (i.e. most control-port RPCs forwarded to the mountee) or not.

  • Make unionmount go away when the mountee goes away (14 Jul) unionmount makes sense only while the mountee is running, so it has to go away as soon as the mountee has been shut down for some reason.

  • Proxy the control port of unionmount (14 Jul) For unionmount to become transparent, most of the RPCs invoked on the its control port should be forwarded to the mountee.

  • Fix adding filesystems to unionmount (16 Jul) settrans -a foo unionfs -a <dir> -u -t <translator> worked, but settrans -a foo unionfs -u -t <translator> -a <dir> didn't. The problem was that in a series of rebase operations I accidentally left the "Orphan the mountee" commit out and the problem appeared when the start_mountee function tried to attach the mountee. Of course, this is not the definite solution, since I don't know why should the attempt to attach the mountee work in the former case and fail in the latter, but I will leave the investigation for some future time.

  • Create the patch for supplying the mountee with a port to the underlying node of unionfs (17 Jul) Such functionality makes unionmount even more transparent.

  • Try to make eth-multiplexer work with static instances of devnode (3 Aug) A static devnode translator is a devnode translator which is told to use the eth-multiplexer's pseudo master device port via the "-M" option. Technically it looks like settrans -a <node> devnode -M <dir> <device-name>, where <dir> is the node on which eth-multiplexer is running.

    The problem was in the fact that the root node of eth-multiplexer was not treated completely similarly as other nodes; specifically no device port was created for it. Minor modifications to some conditions solved the problem.

  • Add the MASTER node to eth-multiplexer (5 Aug) The MASTER node, published by eth-multiplexer, allows creating any number of virtual devices. This node is mainly accessed by static instances of devnode to setup their corresponding virtual devices.

  • Add support for priorities (6 Aug) Now the mountee's filesystem can be configured to "lie" beneath other filesystems.

  • Use unionmount to merge the virtual filesystem of eth-multiplexer with its underlying filesystem (7 Aug) eth-multiplexer can is unionmounted to "lie beneath" it's underlying filesystem. If, for example, the multiplexer is unionmounted on veth/, the user can both set (static) devnode translator on the nodes shown in veth/ and belonging to the underlying filesystem and create normal virtual multiplexer devices by accessing any node (not present in the underlying filesystem) and opening a device using the port to the node as a pseudo device port.

  • Rename the MASTER node into .MASTER (7 Aug) This name seems more natural for a special-purpose node.

  • Set the stat information for eth-multiplexer nodes in netfs_validate_stat (9 Aug) In the initial version the stat information was set up properly only at device creation. Before that the stat information was copied from the underlying node, which baffled unionmount. Now the stat information is setup in netfs_validate_stat.

  • Supply the mountee with the real root. (14 Aug) Since the mountee is not attached to its underlying node, it is okay to supply it with the real root node of unionfs. The mountee's filesystem will not obscure the unionfs's one because the mountee is not attached to the root node.

Google Summer of Code: 2008 Project: Namespace-based translator selection

Current Task

Write the filesystem proxy for namespace-based translator selection (nsmux).

The code is at

Did this week

  • Modified the node cache so that it maintains shadow nodes alive.

Plans for the next week

  • Implement the shutting down of translator stacks when nsmux is asked to go away (in case antrik considers that necessary).

  • Make nsmux provide the access to the translator stack of the real node, in case a translator (mainly, a filter) should ask for its underlying node to be opened in O_NOTRANS mode.

Current Status


  • The skeleton which mirrors the filesystem.

  • Provide proxy nodes (modify the standard version of netfs_S_dir_lookup).


  • Create the generic filtering translator.

  • Create the translator '0' (providing the untranslated version of the node).

  • Create the "recursive wrappers" for one-node translators.

  • Create special translators for the main proxy so that its functionality should be complete.

  • Implement sharing of dynamic translator stacks where possible.

  • Make dynamic translators go away as soon as they are not required.

  • Refine the skeleton in several places so that it should become faster and more reliable.

  • Kill bugs.

  • Integrate nsmux upstream.

  • Solve the libtrivfs stacking issue.

  • Patch libnetfs (it does not support file_get_translator_cntl, for instance).


8: Fri Sep 19:

Modified the ncache so that it now maintains shadow nodes (and directory nodes too, it is a side effect at the moment) alive.

7: Sat Aug 30 - Fri Sep 5:

Added the code for shutting down dynamic translator stacks.

6: Mon Aug 4 - Fri Aug 29:

Implemented the proxy nodes.

5: Thu Jul 24 - Thu Jul 24:

Created a libnetfs-based one-node translator, working exactly like the libtrivfs-based translator I had written before; the former, however, can be included in a translator stack.

4: Tue Jul 22 - Thu Jul 24:

Attempted to make a libtrivfs-based translator to be able to be stacked upon itself (to be able to receive a translator on top of itself, more exactly); attempted to borrow some code from libnetfs but this didn't bring any results.

3: Sun Jul 20 - Tue Jul 22:

Implemented the possibility to propagate a translator on all files belonging to a directory 'dir' in the request of the type 'dir,,x/'.

2: Thu Jul 17 - Fri Jul 18:

Extended the lookup code in nsmux to allow for looking up nodes like 'file,,x' and added the possibility to escape the double-comma in the following way: ',,,'.

1: Mon Jul 12 - Tue Jul 13:

Implemented a simple libtrivfs-based translator to test the lookup code for nsmux.

0: Sat Jul 12 - Sat Jul 12:

Made small changes to the code of filterfs to fit the needs of nsmux.

Completed Tasks

2: Sat May 3 - Fri Jul 17:

Write a translator that should filter the contents of the directory it is set on according to some property. The property can be an arbitrary command.

The code is at

1: Mon Apr 28 - Wed Apr 30:

Wrote a Python extension module in C for retreiving the uptime. The module is based on the code of w.

0: Sun Apr 27:

Followed the code of dmesgd ( kindly offered by bddebian and rewrote it from scratch as a tutorial.