Browse Source

Merge pull request #1104 from trapexit/ll

Remove libfuse abstraction in prep for adding request data
foo
trapexit 2 years ago
committed by GitHub
parent
commit
a2a12afb34
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 102
      libfuse/include/fuse.h
  2. 24
      libfuse/include/fuse_kernel.h
  3. 194
      libfuse/include/fuse_lowlevel.h
  4. 14
      libfuse/include/fuse_pollhandle.h
  5. 1527
      libfuse/lib/fuse.c
  6. 741
      libfuse/lib/fuse_lowlevel.c
  7. 4
      src/mergerfs.cpp

102
libfuse/include/fuse.h

@ -475,9 +475,10 @@ struct fuse_operations
* *
* Introduced in version 2.9 * Introduced in version 2.9
*/ */
int (*write_buf) (const fuse_file_info_t *ffi,
struct fuse_bufvec *buf,
off_t off);
int (*write) (const fuse_file_info_t *ffi,
const char *data,
size_t size,
off_t off);
/** Store data from an open file in a buffer /** Store data from an open file in a buffer
* *
@ -729,101 +730,6 @@ struct fuse_fs;
* fuse_fs_releasedir and fuse_fs_statfs, which return 0. * fuse_fs_releasedir and fuse_fs_statfs, which return 0.
*/ */
int fuse_fs_getattr(struct fuse_fs *fs,
const char *path,
struct stat *buf,
fuse_timeouts_t *timeout);
int fuse_fs_fgetattr(struct fuse_fs *fs,
struct stat *buf,
fuse_file_info_t *fi,
fuse_timeouts_t *timeout);
int fuse_fs_rename(struct fuse_fs *fs, const char *oldpath,
const char *newpath);
int fuse_fs_unlink(struct fuse_fs *fs, const char *path);
int fuse_fs_rmdir(struct fuse_fs *fs, const char *path);
int fuse_fs_symlink(struct fuse_fs *fs,
const char *linkname,
const char *path,
struct stat *st,
fuse_timeouts_t *timeouts);
int fuse_fs_link(struct fuse_fs *fs,
const char *oldpath,
const char *newpath,
struct stat *st,
fuse_timeouts_t *timeouts);
int fuse_fs_release(struct fuse_fs *fs,
fuse_file_info_t *fi);
int fuse_fs_open(struct fuse_fs *fs, const char *path,
fuse_file_info_t *fi);
int fuse_fs_read_buf(struct fuse_fs *fs,
struct fuse_bufvec **bufp, size_t size, off_t off,
fuse_file_info_t *fi);
int fuse_fs_write_buf(struct fuse_fs *fs,
struct fuse_bufvec *buf, off_t off,
fuse_file_info_t *fi);
int fuse_fs_fsync(struct fuse_fs *fs, int datasync,
fuse_file_info_t *fi);
int fuse_fs_flush(struct fuse_fs *fs,
fuse_file_info_t *fi);
int fuse_fs_statfs(struct fuse_fs *fs, const char *path, struct statvfs *buf);
int fuse_fs_opendir(struct fuse_fs *fs, const char *path,
fuse_file_info_t *fi);
int fuse_fs_readdir(struct fuse_fs *fs,
fuse_file_info_t *fi,
fuse_dirents_t *buf);
int fuse_fs_fsyncdir(struct fuse_fs *fs, int datasync,
fuse_file_info_t *fi);
int fuse_fs_releasedir(struct fuse_fs *fs,
fuse_file_info_t *fi);
int fuse_fs_create(struct fuse_fs *fs, const char *path, mode_t mode,
fuse_file_info_t *fi);
int fuse_fs_lock(struct fuse_fs *fs,
fuse_file_info_t *fi, int cmd, struct flock *lock);
int fuse_fs_flock(struct fuse_fs *fs,
fuse_file_info_t *fi, int op);
int fuse_fs_chmod(struct fuse_fs *fs, const char *path, mode_t mode);
int fuse_fs_chown(struct fuse_fs *fs, const char *path, uid_t uid, gid_t gid);
int fuse_fs_truncate(struct fuse_fs *fs, const char *path, off_t size);
int fuse_fs_ftruncate(struct fuse_fs *fs, off_t size,
fuse_file_info_t *fi);
int fuse_fs_utimens(struct fuse_fs *fs, const char *path,
const struct timespec tv[2]);
int fuse_fs_access(struct fuse_fs *fs, const char *path, int mask);
int fuse_fs_readlink(struct fuse_fs *fs, const char *path, char *buf,
size_t len);
int fuse_fs_mknod(struct fuse_fs *fs, const char *path, mode_t mode,
dev_t rdev);
int fuse_fs_mkdir(struct fuse_fs *fs, const char *path, mode_t mode);
int fuse_fs_setxattr(struct fuse_fs *fs, const char *path, const char *name,
const char *value, size_t size, int flags);
int fuse_fs_getxattr(struct fuse_fs *fs, const char *path, const char *name,
char *value, size_t size);
int fuse_fs_listxattr(struct fuse_fs *fs, const char *path, char *list,
size_t size);
int fuse_fs_removexattr(struct fuse_fs *fs, const char *path,
const char *name);
int fuse_fs_bmap(struct fuse_fs *fs, const char *path, size_t blocksize,
uint64_t *idx);
int fuse_fs_ioctl(struct fuse_fs *fs, unsigned long cmd, void *arg,
fuse_file_info_t *fi, unsigned int flags,
void *data, uint32_t *out_bufsz);
int fuse_fs_poll(struct fuse_fs *fs,
fuse_file_info_t *fi, fuse_pollhandle_t *ph,
unsigned *reventsp);
int fuse_fs_fallocate(struct fuse_fs *fs, int mode,
off_t offset, off_t length, fuse_file_info_t *fi);
void fuse_fs_init(struct fuse_fs *fs, struct fuse_conn_info *conn);
void fuse_fs_destroy(struct fuse_fs *fs);
int fuse_fs_prepare_hide(struct fuse_fs *fs, const char *path, uint64_t *fh);
int fuse_fs_free_hide(struct fuse_fs *fs, uint64_t fh);
ssize_t fuse_fs_copy_file_range(struct fuse_fs *fs,
fuse_file_info_t *fi_in, off_t off_in,
fuse_file_info_t *fi_out, off_t off_out,
size_t len, int flags);
int fuse_notify_poll(fuse_pollhandle_t *ph); int fuse_notify_poll(fuse_pollhandle_t *ph);
/** /**

24
libfuse/include/fuse_kernel.h

@ -282,18 +282,18 @@ struct fuse_file_lock {
/** /**
* Bitmasks for fuse_setattr_in.valid * Bitmasks for fuse_setattr_in.valid
*/ */
#define FATTR_MODE (1 << 0)
#define FATTR_UID (1 << 1)
#define FATTR_GID (1 << 2)
#define FATTR_SIZE (1 << 3)
#define FATTR_ATIME (1 << 4)
#define FATTR_MTIME (1 << 5)
#define FATTR_FH (1 << 6)
#define FATTR_ATIME_NOW (1 << 7)
#define FATTR_MTIME_NOW (1 << 8)
#define FATTR_LOCKOWNER (1 << 9)
#define FATTR_CTIME (1 << 10)
#define FATTR_KILL_SUIDGID (1 << 11)
#define FATTR_MODE (1 << 0)
#define FATTR_UID (1 << 1)
#define FATTR_GID (1 << 2)
#define FATTR_SIZE (1 << 3)
#define FATTR_ATIME (1 << 4)
#define FATTR_MTIME (1 << 5)
#define FATTR_FH (1 << 6)
#define FATTR_ATIME_NOW (1 << 7)
#define FATTR_MTIME_NOW (1 << 8)
#define FATTR_LOCKOWNER (1 << 9)
#define FATTR_CTIME (1 << 10)
#define FATTR_KILL_SUIDGID (1 << 11)
/** /**
* Flags returned by the OPEN request * Flags returned by the OPEN request

194
libfuse/include/fuse_lowlevel.h

@ -25,6 +25,7 @@
#include "extern_c.h" #include "extern_c.h"
#include "fuse_common.h" #include "fuse_common.h"
#include "fuse_kernel.h"
#include <fcntl.h> #include <fcntl.h>
#include <stdint.h> #include <stdint.h>
@ -117,12 +118,6 @@ struct fuse_ctx
mode_t umask; mode_t umask;
}; };
struct fuse_forget_data
{
uint64_t ino;
uint64_t nlookup;
};
/* ----------------------------------------------------------- * /* ----------------------------------------------------------- *
* Request methods and replies * * Request methods and replies *
* ----------------------------------------------------------- */ * ----------------------------------------------------------- */
@ -183,7 +178,8 @@ struct fuse_lowlevel_ops
* @param parent inode number of the parent directory * @param parent inode number of the parent directory
* @param name the name to look up * @param name the name to look up
*/ */
void (*lookup)(fuse_req_t req, uint64_t parent, const char *name);
void (*lookup)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Forget about an inode * Forget about an inode
@ -221,7 +217,8 @@ struct fuse_lowlevel_ops
* @param ino the inode number * @param ino the inode number
* @param nlookup the number of lookups to forget * @param nlookup the number of lookups to forget
*/ */
void (*forget)(fuse_req_t req, uint64_t ino, uint64_t nlookup);
void (*forget)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Get file attributes * Get file attributes
@ -229,12 +226,9 @@ struct fuse_lowlevel_ops
* Valid replies: * Valid replies:
* fuse_reply_attr * fuse_reply_attr
* fuse_reply_err * fuse_reply_err
*
* @param req request handle
* @param ino the inode number
* @param fi for future use, currently always NULL
*/ */
void (*getattr)(fuse_req_t req, uint64_t ino, fuse_file_info_t *fi);
void (*getattr)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Set file attributes * Set file attributes
@ -263,8 +257,8 @@ struct fuse_lowlevel_ops
* Changed in version 2.5: * Changed in version 2.5:
* file information filled in for ftruncate * file information filled in for ftruncate
*/ */
void (*setattr)(fuse_req_t req, uint64_t ino, struct stat *attr,
int to_set, fuse_file_info_t *fi);
void (*setattr)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Read symbolic link * Read symbolic link
@ -276,7 +270,8 @@ struct fuse_lowlevel_ops
* @param req request handle * @param req request handle
* @param ino the inode number * @param ino the inode number
*/ */
void (*readlink)(fuse_req_t req, uint64_t ino);
void (*readlink)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Create file node * Create file node
@ -294,8 +289,8 @@ struct fuse_lowlevel_ops
* @param mode file type and mode with which to create the new file * @param mode file type and mode with which to create the new file
* @param rdev the device number (only valid if created file is a device) * @param rdev the device number (only valid if created file is a device)
*/ */
void (*mknod)(fuse_req_t req, uint64_t parent, const char *name,
mode_t mode, dev_t rdev);
void (*mknod)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Create a directory * Create a directory
@ -309,8 +304,8 @@ struct fuse_lowlevel_ops
* @param name to create * @param name to create
* @param mode with which to create the new file * @param mode with which to create the new file
*/ */
void (*mkdir)(fuse_req_t req, uint64_t parent, const char *name,
mode_t mode);
void (*mkdir)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Remove a file * Remove a file
@ -327,7 +322,8 @@ struct fuse_lowlevel_ops
* @param parent inode number of the parent directory * @param parent inode number of the parent directory
* @param name to remove * @param name to remove
*/ */
void (*unlink)(fuse_req_t req, uint64_t parent, const char *name);
void (*unlink)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Remove a directory * Remove a directory
@ -344,7 +340,8 @@ struct fuse_lowlevel_ops
* @param parent inode number of the parent directory * @param parent inode number of the parent directory
* @param name to remove * @param name to remove
*/ */
void (*rmdir)(fuse_req_t req, uint64_t parent, const char *name);
void (*rmdir)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Create a symbolic link * Create a symbolic link
@ -358,8 +355,8 @@ struct fuse_lowlevel_ops
* @param parent inode number of the parent directory * @param parent inode number of the parent directory
* @param name to create * @param name to create
*/ */
void (*symlink)(fuse_req_t req, const char *link, uint64_t parent,
const char *name);
void (*symlink)(fuse_req_t req,
struct fuse_in_header *hdr);
/** Rename a file /** Rename a file
* *
@ -378,8 +375,8 @@ struct fuse_lowlevel_ops
* @param newparent inode number of the new parent directory * @param newparent inode number of the new parent directory
* @param newname new name * @param newname new name
*/ */
void (*rename)(fuse_req_t req, uint64_t parent, const char *name,
uint64_t newparent, const char *newname);
void (*rename)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Create a hard link * Create a hard link
@ -393,8 +390,8 @@ struct fuse_lowlevel_ops
* @param newparent inode number of the new parent directory * @param newparent inode number of the new parent directory
* @param newname new name to create * @param newname new name to create
*/ */
void (*link)(fuse_req_t req, uint64_t ino, uint64_t newparent,
const char *newname);
void (*link)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Open a file * Open a file
@ -421,8 +418,8 @@ struct fuse_lowlevel_ops
* @param ino the inode number * @param ino the inode number
* @param fi file information * @param fi file information
*/ */
void (*open)(fuse_req_t req, uint64_t ino,
fuse_file_info_t *fi);
void (*open)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Read data * Read data
@ -449,8 +446,8 @@ struct fuse_lowlevel_ops
* @param off offset to read from * @param off offset to read from
* @param fi file information * @param fi file information
*/ */
void (*read)(fuse_req_t req, uint64_t ino, size_t size, off_t off,
fuse_file_info_t *fi);
void (*read)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Write data * Write data
@ -475,8 +472,8 @@ struct fuse_lowlevel_ops
* @param off offset to write to * @param off offset to write to
* @param fi file information * @param fi file information
*/ */
void (*write)(fuse_req_t req, uint64_t ino, const char *buf,
size_t size, off_t off, fuse_file_info_t *fi);
void (*write)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Flush method * Flush method
@ -507,8 +504,8 @@ struct fuse_lowlevel_ops
* @param ino the inode number * @param ino the inode number
* @param fi file information * @param fi file information
*/ */
void (*flush)(fuse_req_t req, uint64_t ino,
fuse_file_info_t *fi);
void (*flush)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Release an open file * Release an open file
@ -534,8 +531,8 @@ struct fuse_lowlevel_ops
* @param ino the inode number * @param ino the inode number
* @param fi file information * @param fi file information
*/ */
void (*release)(fuse_req_t req, uint64_t ino,
fuse_file_info_t *fi);
void (*release)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Synchronize file contents * Synchronize file contents
@ -551,8 +548,8 @@ struct fuse_lowlevel_ops
* @param datasync flag indicating if only data should be flushed * @param datasync flag indicating if only data should be flushed
* @param fi file information * @param fi file information
*/ */
void (*fsync)(fuse_req_t req, uint64_t ino, int datasync,
fuse_file_info_t *fi);
void (*fsync)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Open a directory * Open a directory
@ -575,8 +572,8 @@ struct fuse_lowlevel_ops
* @param ino the inode number * @param ino the inode number
* @param fi file information * @param fi file information
*/ */
void (*opendir)(fuse_req_t req, uint64_t ino,
fuse_file_info_t *fi);
void (*opendir)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Read directory * Read directory
@ -599,12 +596,11 @@ struct fuse_lowlevel_ops
* @param off offset to continue reading the directory stream * @param off offset to continue reading the directory stream
* @param fi file information * @param fi file information
*/ */
void (*readdir)(fuse_req_t req, uint64_t ino, size_t size, off_t off,
fuse_file_info_t *llffi);
void (*readdir)(fuse_req_t req,
struct fuse_in_header *hdr);
void (*readdir_plus)(fuse_req_t req, uint64_t ino,
size_t size, off_t off,
fuse_file_info_t *ffi);
void (*readdir_plus)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Release an open directory * Release an open directory
@ -622,8 +618,8 @@ struct fuse_lowlevel_ops
* @param ino the inode number * @param ino the inode number
* @param fi file information * @param fi file information
*/ */
void (*releasedir)(fuse_req_t req, uint64_t ino,
fuse_file_info_t *fi);
void (*releasedir)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Synchronize directory contents * Synchronize directory contents
@ -642,8 +638,8 @@ struct fuse_lowlevel_ops
* @param datasync flag indicating if only data should be flushed * @param datasync flag indicating if only data should be flushed
* @param fi file information * @param fi file information
*/ */
void (*fsyncdir)(fuse_req_t req, uint64_t ino, int datasync,
fuse_file_info_t *fi);
void (*fsyncdir)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Get file system statistics * Get file system statistics
@ -655,7 +651,8 @@ struct fuse_lowlevel_ops
* @param req request handle * @param req request handle
* @param ino the inode number, zero means "undefined" * @param ino the inode number, zero means "undefined"
*/ */
void (*statfs)(fuse_req_t req, uint64_t ino);
void (*statfs)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Set an extended attribute * Set an extended attribute
@ -663,8 +660,8 @@ struct fuse_lowlevel_ops
* Valid replies: * Valid replies:
* fuse_reply_err * fuse_reply_err
*/ */
void (*setxattr)(fuse_req_t req, uint64_t ino, const char *name,
const char *value, size_t size, int flags);
void (*setxattr)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Get an extended attribute * Get an extended attribute
@ -689,8 +686,8 @@ struct fuse_lowlevel_ops
* @param name of the extended attribute * @param name of the extended attribute
* @param size maximum size of the value to send * @param size maximum size of the value to send
*/ */
void (*getxattr)(fuse_req_t req, uint64_t ino, const char *name,
size_t size);
void (*getxattr)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* List extended attribute names * List extended attribute names
@ -715,7 +712,8 @@ struct fuse_lowlevel_ops
* @param ino the inode number * @param ino the inode number
* @param size maximum size of the list to send * @param size maximum size of the list to send
*/ */
void (*listxattr)(fuse_req_t req, uint64_t ino, size_t size);
void (*listxattr)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Remove an extended attribute * Remove an extended attribute
@ -727,7 +725,8 @@ struct fuse_lowlevel_ops
* @param ino the inode number * @param ino the inode number
* @param name of the extended attribute * @param name of the extended attribute
*/ */
void (*removexattr)(fuse_req_t req, uint64_t ino, const char *name);
void (*removexattr)(fuse_req_t req,
const struct fuse_in_header *hdr);
/** /**
* Check file access permissions * Check file access permissions
@ -747,7 +746,8 @@ struct fuse_lowlevel_ops
* @param ino the inode number * @param ino the inode number
* @param mask requested access mode * @param mask requested access mode
*/ */
void (*access)(fuse_req_t req, uint64_t ino, int mask);
void (*access)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Create and open a file * Create and open a file
@ -782,8 +782,8 @@ struct fuse_lowlevel_ops
* @param mode file type and mode with which to create the new file * @param mode file type and mode with which to create the new file
* @param fi file information * @param fi file information
*/ */
void (*create)(fuse_req_t req, uint64_t parent, const char *name,
mode_t mode, fuse_file_info_t *fi);
void (*create)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Test for a POSIX file lock * Test for a POSIX file lock
@ -799,9 +799,8 @@ struct fuse_lowlevel_ops
* @param fi file information * @param fi file information
* @param lock the region/type to test * @param lock the region/type to test
*/ */
void (*getlk)(fuse_req_t req, uint64_t ino,
fuse_file_info_t *fi, struct flock *lock);
void (*getlk)(fuse_req_t req,
const struct fuse_in_header *hdr);
/** /**
* Acquire, modify or release a POSIX file lock * Acquire, modify or release a POSIX file lock
* *
@ -847,8 +846,8 @@ struct fuse_lowlevel_ops
* @param blocksize unit of block index * @param blocksize unit of block index
* @param idx block index within file * @param idx block index within file
*/ */
void (*bmap)(fuse_req_t req, uint64_t ino, size_t blocksize,
uint64_t idx);
void (*bmap)(fuse_req_t req,
const struct fuse_in_header *hdr);
/** /**
* Ioctl * Ioctl
@ -877,9 +876,8 @@ struct fuse_lowlevel_ops
* @param in_bufsz number of fetched bytes * @param in_bufsz number of fetched bytes
* @param out_bufsz maximum size of output data * @param out_bufsz maximum size of output data
*/ */
void (*ioctl)(fuse_req_t req, uint64_t ino, unsigned long cmd, void *arg,
fuse_file_info_t *fi, unsigned flags,
const void *in_buf, uint32_t in_bufsz, uint32_t out_bufsz);
void (*ioctl)(fuse_req_t req,
const struct fuse_in_header *hdr);
/** /**
* Poll for IO readiness * Poll for IO readiness
@ -907,40 +905,8 @@ struct fuse_lowlevel_ops
* @param fi file information * @param fi file information
* @param ph poll handle to be used for notification * @param ph poll handle to be used for notification
*/ */
void (*poll)(fuse_req_t req,
uint64_t ino,
fuse_file_info_t *fi,
fuse_pollhandle_t *ph);
/**
* Write data made available in a buffer
*
* This is a more generic version of the ->write() method. If
* FUSE_CAP_SPLICE_READ is set in fuse_conn_info.want and the
* kernel supports splicing from the fuse device, then the
* data will be made available in pipe for supporting zero
* copy data transfer.
*
* buf->count is guaranteed to be one (and thus buf->idx is
* always zero). The write_buf handler must ensure that
* bufv->off is correctly updated (reflecting the number of
* bytes read from bufv->buf[0]).
*
* Introduced in version 2.9
*
* Valid replies:
* fuse_reply_write
* fuse_reply_err
*
* @param req request handle
* @param ino the inode number
* @param bufv buffer containing the data
* @param off offset to write to
* @param fi file information
*/
void (*write_buf)(fuse_req_t req, uint64_t ino,
struct fuse_bufvec *bufv, off_t off,
fuse_file_info_t *fi);
void (*poll)(fuse_req_t req,
const struct fuse_in_header *hdr);
/** /**
* Callback function for the retrieve request * Callback function for the retrieve request
@ -974,8 +940,8 @@ struct fuse_lowlevel_ops
* *
* @param req request handle * @param req request handle
*/ */
void (*forget_multi)(fuse_req_t req, size_t count,
struct fuse_forget_data *forgets);
void (*forget_multi)(fuse_req_t req,
struct fuse_in_header *hdr);
/** /**
* Acquire, modify or release a BSD file lock * Acquire, modify or release a BSD file lock
@ -1014,8 +980,8 @@ struct fuse_lowlevel_ops
* @param mode determines the operation to be performed on the given range, * @param mode determines the operation to be performed on the given range,
* see fallocate(2) * see fallocate(2)
*/ */
void (*fallocate)(fuse_req_t req, uint64_t ino, int mode,
off_t offset, off_t length, fuse_file_info_t *fi);
void (*fallocate)(fuse_req_t req,
const struct fuse_in_header *hdr);
/** /**
* Copy a range of data from one file to another * Copy a range of data from one file to another
@ -1053,15 +1019,8 @@ struct fuse_lowlevel_ops
* @param len maximum size of the data to copy * @param len maximum size of the data to copy
* @param flags passed along with the copy_file_range() syscall * @param flags passed along with the copy_file_range() syscall
*/ */
void (*copy_file_range)(fuse_req_t req,
uint64_t ino_in,
off_t off_in,
fuse_file_info_t *fi_in,
uint64_t ino_out,
off_t off_out,
fuse_file_info_t *fi_out,
size_t len,
int flags);
void (*copy_file_range)(fuse_req_t req,
const struct fuse_in_header *hdr);
}; };
/** /**
@ -1164,7 +1123,8 @@ int fuse_reply_readlink(fuse_req_t req, const char *link);
* @param fi file information * @param fi file information
* @return zero for success, -errno for failure to send reply * @return zero for success, -errno for failure to send reply
*/ */
int fuse_reply_open(fuse_req_t req, const fuse_file_info_t *fi);
int fuse_reply_open(fuse_req_t req,
const fuse_file_info_t *fi);
/** /**
* Reply with number of bytes written * Reply with number of bytes written

14
libfuse/include/fuse_pollhandle.h

@ -0,0 +1,14 @@
#pragma once
#include <stdint.h>
struct fuse_chan;
struct fuse_ll;
typedef struct fuse_pollhandle_t fuse_pollhandle_t;
struct fuse_pollhandle_t
{
uint64_t kh;
struct fuse_chan *ch;
struct fuse_ll *f;
};

1527
libfuse/lib/fuse.c
File diff suppressed because it is too large
View File

741
libfuse/lib/fuse_lowlevel.c
File diff suppressed because it is too large
View File

4
src/mergerfs.cpp

@ -66,7 +66,7 @@
#include "fuse_truncate.hpp" #include "fuse_truncate.hpp"
#include "fuse_unlink.hpp" #include "fuse_unlink.hpp"
#include "fuse_utimens.hpp" #include "fuse_utimens.hpp"
#include "fuse_write_buf.hpp"
#include "fuse_write.hpp"
#include "fuse.h" #include "fuse.h"
@ -129,7 +129,7 @@ namespace l
ops_.truncate = FUSE::truncate; ops_.truncate = FUSE::truncate;
ops_.unlink = FUSE::unlink; ops_.unlink = FUSE::unlink;
ops_.utimens = FUSE::utimens; ops_.utimens = FUSE::utimens;
ops_.write_buf = (nullrw_ ? FUSE::write_buf_null : FUSE::write_buf);
ops_.write = (nullrw_ ? FUSE::write_null : FUSE::write);
return; return;
} }

Loading…
Cancel
Save