1. 25 Jun, 2018 1 commit
    • Kirill Smelkov's avatar
      X turn example/hello to return real non-small content · 0aff2383
      Kirill Smelkov authored
      I need this to compare speed wrt github.com/jacobsa/fuse which does not
      have ready loopback demo.
      
      Out of the box github.com/jacobsa/fuse turned out to be ~ 1.6x slower
      than github.com/hanwen/go-fuse.
      
      with github.com/hanwen/go-fuse:
      
              .../github.com/hanwen/go-fuse/example/benchmark-read-throughput$ md5sum ~/mnt/tmp/file.txt
              f4cbd65f70761c9c5306d9301422af02  /home/kirr/mnt/tmp/file.txt
      
              .../github.com/hanwen/go-fuse/example/benchmark-read-throughput$ go run readbench.go -bs 128 -limit 30000 ~/mnt/tmp/file.txt
              block size 128 kb: 30000.4 MB in 9.704823906s: 3091.29 MBs/s
      
      with github.com/jacobsa/fuse
      
              .../github.com/hanwen/go-fuse/example/benchmark-read-throughput$ md5sum ~/mnt/tmp/hello
              f4cbd65f70761c9c5306d9301422af02  /home/kirr/mnt/tmp/hello
      
              .../github.com/hanwen/go-fuse/example/benchmark-read-throughput$ go run readbench.go -bs 128 -limit 30000 ~/mnt/tmp/hello
              block size 128 kb: 30000.4 MB in 15.701199318s: 1910.71 MBs/s
      
      See also https://github.com/hanwen/go-fuse/issues/192#issuecomment-338198877
      0aff2383
  2. 22 May, 2018 2 commits
  3. 08 May, 2018 5 commits
  4. 02 May, 2018 1 commit
    • Jakob Unterwurzacher's avatar
      fuse: improve SETXATTR debug logging · 41df6ec8
      Jakob Unterwurzacher authored
      Set the operationHandlers[op].DecodeIn function and
      add xattr name parsing.
      
      SETXATTR is special because it is the only opcode that
      takes a file name (the xattr name) and a binary blob
      (the xattr value). This was not supported by the
      file name parsing code:
      * setting FileNames = 1 would lump the xattr name
        and value together and truncates the last byte
      * setting FileNames = 2 truncated the last xattr
        value byte.
      
      This was solved by adding a special-case to parse(),
      which seemed less ugly than adding a special-case
      InputDebug(), or leaving the truncation as-is.
      
      Before:
        2018/05/01 16:47:39 Dispatch 6: SETXATTR, NodeId: 3.  12 bytes
      After:
        2018/05/01 16:48:36 Dispatch 6: SETXATTR, NodeId: 3. data: {sz 3 f0} names: [user.foo] 12 bytes
      
      The change only affects debug output as doSetXAttr() does its
      own bytes.SplitN(). The parsed filename *could* also be used in
      doSetXAttr(), but the code seems clearer as-is.
      41df6ec8
  5. 23 Apr, 2018 1 commit
  6. 18 Mar, 2018 1 commit
  7. 16 Mar, 2018 1 commit
  8. 01 Mar, 2018 1 commit
  9. 02 Feb, 2018 1 commit
  10. 18 Jan, 2018 1 commit
  11. 12 Jan, 2018 1 commit
  12. 05 Dec, 2017 1 commit
  13. 13 Nov, 2017 1 commit
    • Jakob Unterwurzacher's avatar
      pathfs: simplify pathInode.GetAttr · 66de2f17
      Jakob Unterwurzacher authored
      The function was written with only a single return at
      the end, which was elegant, but harder to follow.
      
      Add early returns to handle common cases and add a few
      comments.
      
      A functional change is that we now catch when we get
      OK with fi == nil and return EINVAL and log a message.
      This should not happen and is a bug in the filesystem
      implementation.
      
      Passes ./all.bash and the gocryptfs test suite.
      66de2f17
  14. 07 Nov, 2017 2 commits
  15. 20 Oct, 2017 1 commit
  16. 19 Oct, 2017 3 commits
  17. 09 Oct, 2017 1 commit
    • Jakob Unterwurzacher's avatar
      debug output: fix blank line after READDIRPLUS · cfefa3d5
      Jakob Unterwurzacher authored
      Trivial patch that fixes a blank line in the debug output.
      
      Before:
      
        2017/10/03 20:25:56 Dispatch 602: READDIRPLUS, NodeId: 1. data: {Fh 2 off 0 sz 4096  L 0 DIRECTORY,NONBLOCK,0x8000}
        2017/10/03 20:25:56 Serialize 602: READDIRPLUS code: OK value:  832 bytes data
      
        2017/10/03 20:25:56 Dispatch 603: GETXATTR, NodeId: 7. data: {sz 0} names: [system.posix_acl_access] 24 bytes
        2017/10/03 20:25:56 Serialize 603: GETXATTR code: 61=no data available value:
      
      After:
      
        2017/10/03 21:02:46 Dispatch 22: READDIRPLUS, NodeId: 1. data: {Fh 2 off 0 sz 4096  L 0 RDONLY,0x8000}
        2017/10/03 21:02:46 Serialize 22: READDIRPLUS code: OK value:  648 bytes data
        2017/10/03 21:02:46 Dispatch 23: READDIRPLUS, NodeId: 1. data: {Fh 2 off 4 sz 4096  L 0 RDONLY,0x8000}
        2017/10/03 21:02:46 Serialize 23: READDIRPLUS code: OK value:
      cfefa3d5
  18. 11 Sep, 2017 1 commit
  19. 03 Sep, 2017 1 commit
  20. 08 Aug, 2017 1 commit
    • Jakob Unterwurzacher's avatar
      fuse, loopback: return actual inode numbers from READDIR · 204b45db
      Jakob Unterwurzacher authored
      When an app in a FUSE mount calls getdents(2), go-fuse receives
      READDIR[PLUS] and calls the filesystem's OpenDir function that
      returns []DirEntry.
      
      The data returned from getdents(2) contains an inode number for
      each directory entry, "d_ino". Until now, struct DirEntry had no
      corresponding field and the value passed to the kernel was always
      FUSE_UNKNOWN_INO = 0xffffffff
      
      This broke apps that actually look at the d_ino field, like
      "find -inum".
      
      This commit adds the "Ino" filed to struct DirEntry. If the field
      is not set by the filesystem, it is set to FUSE_UNKNOWN_INO,
      as before. Otherwise it is left alone and passed to the kernel.
      
      loopbackFileSystem's OpenDir function is extended to set the inode
      number. A test verifies that the returned inode number is sane.
      
      Fixes https://github.com/hanwen/go-fuse/issues/175
      204b45db
  21. 28 Jul, 2017 1 commit
  22. 18 Jul, 2017 3 commits
  23. 17 Jul, 2017 1 commit
  24. 15 Jul, 2017 6 commits
    • Han-Wen Nienhuys's avatar
      b4cc1627
    • Han-Wen Nienhuys's avatar
      Disable flock tests. · 6416abc3
      Han-Wen Nienhuys authored
      The locking code is not hooked in the fuse/ server code, so this
      just exercises the kernel's default locking implementation.
      6416abc3
    • Han-Wen Nienhuys's avatar
      fuse/pathfs: don't take pathLock in GetPath() · 68f32f6d
      Han-Wen Nienhuys authored
      The parent tracking moved into nodefs in
      commit 0107672a, so there is no need for
      taking that lock anymore.
      68f32f6d
    • Han-Wen Nienhuys's avatar
      96a198bf
    • Han-Wen Nienhuys's avatar
      fuse: fix tests for Go 1.9 · 4f10e248
      Han-Wen Nienhuys authored
      Go 1.9 uses epoll() for more efficient file I/O. File I/O causes a
      call to epoll, and the runtime makes this call take up a GOMAXPROCS
      slot.
      
      The FUSE kernel module also supports poll: polling on a file residing
      in a FUSE file system causes the kernel to sends a POLL request to the
      userspace process.  If the process responds with ENOSYS, the kernel
      will stop forwarding poll requests to the FUSE process.
      
      In a test for Go FUSE file systems, it is normal to serve the
      filesystem out of the same process that opens files in the file
      system. If this happens in Go 1.9, the epoll call can take the only
      GOMAXPROCS slot left, leaving the process unable to respond to the
      FUSE POLL opcode, deadlocking the process.
      
      This change add support for a magic file "/ .go-fuse-epoll-hack" with
      node ID uint64(-1), and on starting up the file system, the library
      calls poll() on this file, triggering the POLL opcode before the Go
      runtime had a chance to do so.
      
      There are two problem scenarios left:
      
      * File system tests that start I/O before calling WaitMount() still
        risk deadlocking themselves.
      
      * The Linux kernel keeps track of feature support in fuse_conn, which notes
      
               * The following bitfields are only for optimization purposes
               * and hence races in setting them will not cause malfunction
      
        if our forced ENOSYS gets lost due to a race condition in the
        kernel, this can still trigger.
      
      Fixes golang/go#21014 and #165
      4f10e248
    • Han-Wen Nienhuys's avatar
  25. 13 Jul, 2017 1 commit
    • Han-Wen Nienhuys's avatar
      splice: use syscall directly for splice I/O · a8bec8ce
      Han-Wen Nienhuys authored
      This avoids involving the go 1.9 poller in I/O, which causes hangs, as
      the poller does not understand the fcntl(O_NONBLOCK) tweak that we
      executed on the pipe's file descriptors.
      
      Fixes #164
      a8bec8ce