$! is the last error from syscall/library call (like errno in C). Fuse functions should return standard error codes in case of errors, and they should be less than zero because positive number can mean a file descriptor or comething else. Thus, -$! is returned as it is (minus) error code from the last system or library call which caused the error.