<div dir="ltr">I think it would be a good project.  Definitely some significant porting work on the kernel side because our namespace VOP API is quite different, but the tmpfs code makes for great reference material and I don't think you would have too much trouble getting it working.  The FUSE API is also fairly stable I think, so unlike WIFI, a FUSE port can be a one-off.<div><br></div><div>Some differences between FreeBSD and DragonFly:</div><div><br></div><div>* DragonFly has VOP_NRESOLVE to resolve a namespace lookup, and does not have VOP_LOOKUP.  DragonFly also has numerous other VOP_N*() functions (e.g. VOP_NRENAME(), VOP_NLINK(), etc).  These functions are similar to related FreeBSD VOPs but they use the DragonFly mandatory namecache infrastructure.  Use tmpfs as a reference.  The main thing to get right with the namespace calls is to be sure to make all the correct cache_*() calls to keep the namecache in proper synchronization with the filesystem.</div><div><br></div><div>* There are probably some minor differences in locking requirements.  Again using tmpfs as reference material will help a lot.</div><div><br></div><div>* In DragonFly, using the buffer cache is mandatory (otherwise mmap() will not work properly).  tmpfs may not be the best reference here because tmpfs has some complexity in this regard due to the fact that its data is actually backed by the buffer cache and VM system and it is not just using it as a cache. </div><div><br></div><div>* VOP_SETATTR and VOP_WRITE are the most complex VOPs.  File truncations and extensions (including write-appends) require appropriate API calls to nvtruncbuf() and nvextendbuf().  tmpfs is a good reference for this.   VOP_READ and VOP_WRITE must use the buffer cache, so the actual read and write operations must be implemented in the buffer cache flushing code which will be via VOP_STRATEGY.  UFS is probably a good reference for this if TMPFS is too confusing.  But start with TMPFS.</div><div><br></div><div>* When you are first trying to get it to mount, the most important VFS op to get right, other than VFS_MOUNT, is VFS_ROOT.</div><div><br></div><div>* Don't worry about being able to NFS-export a fuse filesystem until the whole thing is basically working.  This simplifies the VFS ops enormously because you don't have to support vfs_fhtovp() or vfs_vptofh().<br><div><br></div><div>-Matt</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Sep 16, 2016 at 3:17 AM, Tomohiro Kusumi <span dir="ltr"><<a href="mailto:kusumi.tomohiro@gmail.com" target="_blank">kusumi.tomohiro@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks, I'll eventually need you or marino's help on dports side once<br>
sys/vfs/fuse part starts to work.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
2016-09-16 1:01 GMT-04:00 Rimvydas Jasinskas <<a href="mailto:rimvydasjas@gmail.com">rimvydasjas@gmail.com</a>>:<br>
> I'm in, let me know what parts you need in dports.<br>
><br>
><br>
><br>
> On Fri, Sep 16, 2016 at 12:59 AM, Tomohiro Kusumi<br>
> <<a href="mailto:kusumi.tomohiro@gmail.com">kusumi.tomohiro@gmail.com</a>> wrote:<br>
>> I'm thinking about porting fuse from FreeBSD. Several benefits by doing this.<br>
>><br>
>> 1. There are some good fuse based fs like sshfs, ntfs-3g and maybe<br>
>> some others I'm not really aware of (like glusterfs if it ever worked<br>
>> on BSD ?).<br>
>><br>
>> 2. puffs in DragonFly is broken according to other devs/users, and no<br>
>> one is really going to fix it (which is fine with me too).<br>
>><br>
>> 3. We probably don't need (a broken) puffs if we get (a working) fuse,<br>
>> given the fact that most userspace filesystems are written for Linux<br>
>> fuse, but not for NetBSD puffs. NetBSD puffs seems to provide a some<br>
>> sort of emulation layer for compatibility with fuse, but ours<br>
>> apparently doesn't because it's broken.<br>
>><br>
>> --<br>
>> I haven't written any code yet, and won't be for another 2-3 weeks,<br>
>> but was looking at fuse (a kernel subsystem in FreeBSD and Linux<br>
>> kernel), libfuse (userspace portion of fuse) and some specific<br>
>> filesystem implementations such as sshfs.<br>
>><br>
>> The target will be the next DragonFly release which is 4.8. Not sure<br>
>> if I can make it if we're to release 4.8 within 2016 (which is only 4<br>
>> months from 4.6), but I should be able to make it otherwise with good<br>
>> enough stability for the initial release.<br>
>><br>
>> The difficult part is that it's kinda difficult to tell how long it<br>
>> takes to port fuse, given the concept of the fuse itself. It's easy to<br>
>> imagine some sort of bugs will be exremely difficult to fix or even<br>
>> investigate.<br>
>><br>
>> I know DragonFly users want ntfs(3g), but the initial release won't<br>
>> target ntfs. In theory, having fuse subsystem with good stability<br>
>> should mean it runs ntfs, but ntfs is probably way too complex to make<br>
>> it reliably work without bunch of try-and-errors within fuse itself.<br>
>><br>
>> sshfs seems to be a good one for dogfooding the fuse on DragonFly once<br>
>> it starts to work, because sshfs isn't a toy fs (I think it's quite<br>
>> popular among Linux users) yet the code size isn't that huge, plus<br>
>> it's written by the same author as fuse in Linux kernel which<br>
>> guarantees good code quality.<br>
>><br>
>> If porting a kernel subsystem goes as expected, I'll eventually need<br>
>> marino@ (or someone who is as good) to help with userspace. One of the<br>
>> issue with libfuse is that ./configure doesn't recognize DragonFly as<br>
>> a BSD, probably because our uname doesn't contain "BSD" (see around<br>
>> line 12000 of ./configure), and tries to compile with Linux specific<br>
>> code (e.g. mount(2) with 5 arguments instead of four). I may be able<br>
>> to fix these issues myself, but I doubt I do it in a right way.<br>
>><br>
>> I'm also willing to fix any issues I may encounter on FreeBSD.<br>
>><br>
>> If everything goes as expected, we can get rid of puffs in 4.8.<br>
</div></div></blockquote></div><br></div>