9fans archive / 1998 / 04 / 11 /    prev next

From: Russ Cox rsc@pla...
Subject: [9fans] a problem with the 9p protocol?
Date: Sat, 4 Apr 1998 16:25:36 -0500

> Where is the problem?

Your problem arises from the way the mount driver handles
mounted file descriptors.  There is a flag CMSG on each fd (well,
each channel) that says whether or not it is mounted.
Once you mount(2) it, the flag gets set.  After the flag is
set, normal reads and writes (via the read and write system
calls) are disallowed, presumably to not interfere with the
9P calls by the mount driver.

> If I run it with:
> 	ramfs -s
> 	filter
> 	mount /srv/filter /tmp/mnt
> it seems to work: 

Right.  In this case, /srv/ramfs has never been mounted directly by the
system, so the associated channel doesn't have the CMSG flag set.
Reads and writes by filter work.

> But if I first mount and
> then unmount the ramfs with:
> 	ramfs -s
> 	mount -c /srv/ramfs /tmp/mnt
> 	unmount /tmp/mnt
> 	filter
> 	mount /srv/filter /tmp/mnt
> I get:
> 	client->server: Tsession tag 65535 		# (from dump)
> 	write server: inappropriate use of fd
> 	mount: mount /srv/filtre /tmp/mnt: fsession: i/o error during authentication

Right.  In this case, /srv/ramfs has been mounted directly,
so CMSG is set. The first time filter calls read or write
(it happens to be a write), it fails.

The phenomenon is more simply demonstrated by
	% ramfs -s
	% echo squeamish ossifrage >>/srv/ramfs
	% mount /srv/ramfs /tmp/mnt
	% unmount /tmp/mnt
	% echo squeamish ossifrage >>/srv/ramfs
	echo: write error: inappropriate use of fd
	%

Russ