Russ Cox
2006-01-23 17:06:55 UTC
Fuse has a nice crunchy layer of GNU crud around it
which makes it hard to swallow, but at its core, it's
very close to 9P (or the version 8 network file system).
You open /dev/fuse, hand the fd to the kernel to mount
it somewhere, and then you read and write fuse messages
on the fd. All the kernel vfs operations end up as fuse
messages, including close. (It just isn't used in examples,
but it does exist. It's called release.) The main failing I see
from a protocol standpoint seems to be the lack of a flush
message. Instead, fuse just puts interrupted requests on
a list and assumes they'll come back eventually.
This wouldn't be appropriate for things like interrupting
a read from /dev/tty. For mounting file systems on a
Unix system, fuse is probably a better protocol than 9P.
It appears to match the kernel better, so the implementation
should be simpler. (As soon as you want to talk between
different operating systems or send the messages over
the network, that's where 9P starts to make more sense.)
Fuse's main problem is that they bundle the protocol inside
the library loop, so what you see from the outside is the
equivalent of 9P+lib9p. You don't ever get to see the protocol
by itself. That's often good enough, but sometimes it's nice
to deal with the raw messages. Another big problem with
fuse is the lack of easily-found documentation.
If you download a fuse distribution and look in
kernel/fuse_kernel.h you can see the messages.
Russ
which makes it hard to swallow, but at its core, it's
very close to 9P (or the version 8 network file system).
You open /dev/fuse, hand the fd to the kernel to mount
it somewhere, and then you read and write fuse messages
on the fd. All the kernel vfs operations end up as fuse
messages, including close. (It just isn't used in examples,
but it does exist. It's called release.) The main failing I see
from a protocol standpoint seems to be the lack of a flush
message. Instead, fuse just puts interrupted requests on
a list and assumes they'll come back eventually.
This wouldn't be appropriate for things like interrupting
a read from /dev/tty. For mounting file systems on a
Unix system, fuse is probably a better protocol than 9P.
It appears to match the kernel better, so the implementation
should be simpler. (As soon as you want to talk between
different operating systems or send the messages over
the network, that's where 9P starts to make more sense.)
Fuse's main problem is that they bundle the protocol inside
the library loop, so what you see from the outside is the
equivalent of 9P+lib9p. You don't ever get to see the protocol
by itself. That's often good enough, but sometimes it's nice
to deal with the raw messages. Another big problem with
fuse is the lack of easily-found documentation.
If you download a fuse distribution and look in
kernel/fuse_kernel.h you can see the messages.
Russ