1 Here are some good questions and answers in no particular order.
3 ---------------------------------------------------------------------------
7 > Can you explain me what are the differences between this two modules
8 > and why did you start a new project?
10 Well looking at the release dates on SF, the first release of FUSE is
11 almost a year older than that of LUFS. But we probably weren't awere
12 of each others project for quite some time.
14 The main difference between them is that in LUFS the filesystem is a
15 shared object (.so) which is loaded by lufsmount, and in FUSE the
16 filesystem is a separate executable, which uses the fuse library. The
17 actual API is very similar, and I've written a translator, that can
18 load LUFS modules and run them using the FUSE kernel module (see the
19 lufis package on the FUSE page).
21 Another difference is that LUFS does some caching of directories and
22 file attributes. FUSE does not do this, so it provides a 'thinner'
25 ---------------------------------------------------------------------------
26 Subject: close() not in struct fuse_operations
29 > Is there a reason for 'close' not being one of the
30 > fuse_operations? I'd need to know when files are
33 It's not easy. Consider mmap(): if you have a memory file, even after
34 closing it, you can read or write the file through memory.
36 Despite this there are close()-like operations: flush and release.
37 Flush gets called on each close() and release gets called when there
38 are no more uses of a file, including memory mappings.
40 ---------------------------------------------------------------------------
41 Subject: overlapping open/release states
44 > I'm using a fairly current CVS version of Fuse, and have noticed
45 > overlapping open / release calls for a file. In other words a file
46 > is opened multiple times and receives multiple release calls. Is
49 It has always been like this. The open / release calls correspond to
50 actual file opens / releases. The release is called when there are no
51 more refernces to the file, i.e. on the last close() or munmap().
53 > This isn't what I expected. Do I need to keep track of how many
54 > open() calls were made to a file and expect that many release() calls?
56 Yes. You can also keep track of the number of files opened for
57 writing for example, and use that information for finally flushing
60 > So it appears that there may even be additional file operations after
61 > one or more of the release calls..
63 That is expected also. It would be a bug if there were reads/writes
64 after the last release, or if the number of releases didn't match the
67 > I've solved this in my code by counting the number of open / release
68 > calls and only dropping information when the last expected release
69 > is received. But I thought I'd point this out in case, as it was
70 > unexpected behavior..
72 ---------------------------------------------------------------------------
73 Subject: return value from release()
76 > Hmm. So it doesn't matter what I return from my release function? I
77 > understand there is not an exact 1:1 relationship between close() and
78 > release, but I had hoped that a error return from release would be
79 > carried up as an error return from close().
81 In release() the error value is ignored, and not every close will
82 cause a release. Consider this:
84 - process opens a file
86 - parent closes the file
87 - child closes the file
89 The file will only be released on the second close, i.e. when all
90 references to the file are closed. Also memory mapping a file creates
91 a reference to the file, that is released when the memory is unmapped.
93 There is a flush() operation that is called on every close(), through
94 which the filesystem can return an error.
96 Note: there can be read/write operations even after the last flush()
97 but before a release().
99 ---------------------------------------------------------------------------
100 Subject: FUSE lacks ioctl support
103 > I'll try to add ioctl support to FUSE, but I am quite new to it, so I
104 > would apreciate any suggestions.
106 It's not clear to me how would you use ioctls since they are
107 meaningless on normal files, and on device files the filesystem
108 implementation usually does not care about the ioctl operations. And
109 even if you manage to hack fuse to intercept device ioctls, you
110 wouldn't be able to do anything with them, because they contain
111 arbitrarily structured data (not length/value as in the case of read
116 Using getxattr() and setxattr() is much cleaner than ioctl(), and is
117 actually supported in fuse-2.0.
119 ---------------------------------------------------------------------------
123 > Now for the problem case: I cat the 256k file, the kernel issues a
124 > read with length 65536 and offset 0. My program returns only 10
125 > bytes. What I expected to see was the kernel to then issue a read for
126 > length 65536 and offset 10. Instead what I saw in the result was the
127 > 10 bytes I returned, followed by 65526 zero bytes.
129 > Is this the intended behavior?
131 Yes. You can easily program around it with a for-loop in your read
134 > Does this simplify things significantly? If it isn't much of a
135 > difference, I'd like to suggest doing it the other way: many people
136 > (like me) implement their fuse read function in terms of read(), and
137 > read() can return early.
139 No. Read from a pipe/socket can be short, but read from a file can't.
141 ---------------------------------------------------------------------------
142 Subject: protocol error
144 > I'm having trouble with file writing. I can
145 > 'echo something > file' to a file, but
146 > 'cp file something' or 'cat something > file'
147 > gives a protocol error.
149 Two possible reasons for this are:
151 1) A mismatch between the library version and the kernel module
154 2) The write() operation returns less than the 'size' parameter.
155 Short writes are generally not allowed (as in case of read()). The
156 exception is if the 'direct_io' mount option is used.
158 ---------------------------------------------------------------------------
162 > There are a million other projects with the same name. Why did you
165 Because I'm an imbecile. The lesson is that a common term is not a
166 good project name. A somewhat strange story comes to my mind: I was
167 contacted by Philip Kendall shortly after releasing FUSE, blaming me
168 for choosing the same name as his ZX Spectrum emulator (Fuse). We
169 have known each other from earlier times, since I have also written a
170 ZX Spectrum emulator (Spectemu).
172 ---------------------------------------------------------------------------
176 > Is there any easy way to know the uid of a reader? For example, let's
177 > say I wanted to create a file that contained 'foo' for uid 1, but
182 fuse_get_context()->uid
185 ---------------------------------------------------------------------------
186 Subject: 'find' command
189 > I'm having trouble getting the find command to search through fuse
190 > directories. What settings do I need in 'getattr'?
192 use the -noleaf option to find
193 (find uses the following parameters to determine whether it should recurse
196 nr_links must be >= 3
198 and must be a directory
200 so just return those in the getattr for your directories and you wont have
203 ---------------------------------------------------------------------------
204 Subject: File system interactivity
206 > I need to add interactivity to my user space file system.
207 > For example, while executing create(), I need to ask a
208 > question to the terminal that issued the request.
210 > Is there a way I can achieve this goal?
212 It would not be possible generally speaking, since it might not be an
213 interactive program but rather a daemon, or a GUI program creating the
214 file. However you should be able to get the PID for the caller, and
215 by looking in /proc you should be able to find the process tty or
216 something similar. Perhaps it would be better to redesign your program
217 not to have such interactivity anyway, try to use e.g. extended
218 attributes of files to set per-file options, or a configuration file