mirror of
https://github.com/trapexit/mergerfs.git
synced 2024-11-22 08:50:13 +08:00
Reduce struct node size
* Replace the stat values with a crc32b of them instead (for auto-cache) * Replace char flag with bitfield * Remove node generation. nodeid is an unsigned 64bit int. Would take 500K+ years to rollover at 1M nodes per second.
This commit is contained in:
parent
88b91161e0
commit
930dad31de
|
@ -32,14 +32,15 @@ INSTALLMAN1DIR = $(DESTDIR)$(MAN1DIR)
|
|||
AR ?= ar
|
||||
|
||||
SRC = \
|
||||
lib/fuse_node.c \
|
||||
lib/buffer.c \
|
||||
lib/fuse_dirents.c \
|
||||
lib/crc32b.c \
|
||||
lib/fuse.c \
|
||||
lib/fuse_dirents.c \
|
||||
lib/fuse_kern_chan.c \
|
||||
lib/fuse_loop_mt.c \
|
||||
lib/fuse_lowlevel.c \
|
||||
lib/fuse_mt.c \
|
||||
lib/fuse_node.c \
|
||||
lib/fuse_opt.c \
|
||||
lib/fuse_session.c \
|
||||
lib/fuse_signals.c \
|
||||
|
|
|
@ -43,9 +43,6 @@ EXTERN_C_BEGIN
|
|||
/** The node ID of the root inode */
|
||||
#define FUSE_ROOT_ID 1
|
||||
|
||||
/** Inode number type */
|
||||
typedef uint64_t fuse_ino_t;
|
||||
|
||||
/** Request pointer type */
|
||||
typedef struct fuse_req *fuse_req_t;
|
||||
|
||||
|
@ -74,7 +71,7 @@ struct fuse_entry_param
|
|||
* ino the kernel may cache negative entries for entry_timeout
|
||||
* seconds.
|
||||
*/
|
||||
fuse_ino_t ino;
|
||||
uint64_t ino;
|
||||
|
||||
/** Generation number for this entry.
|
||||
*
|
||||
|
@ -122,7 +119,7 @@ struct fuse_ctx
|
|||
|
||||
struct fuse_forget_data
|
||||
{
|
||||
fuse_ino_t ino;
|
||||
uint64_t ino;
|
||||
uint64_t nlookup;
|
||||
};
|
||||
|
||||
|
@ -186,7 +183,7 @@ struct fuse_lowlevel_ops
|
|||
* @param parent inode number of the parent directory
|
||||
* @param name the name to look up
|
||||
*/
|
||||
void (*lookup)(fuse_req_t req, fuse_ino_t parent, const char *name);
|
||||
void (*lookup)(fuse_req_t req, uint64_t parent, const char *name);
|
||||
|
||||
/**
|
||||
* Forget about an inode
|
||||
|
@ -224,7 +221,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param nlookup the number of lookups to forget
|
||||
*/
|
||||
void (*forget)(fuse_req_t req, fuse_ino_t ino, uint64_t nlookup);
|
||||
void (*forget)(fuse_req_t req, uint64_t ino, uint64_t nlookup);
|
||||
|
||||
/**
|
||||
* Get file attributes
|
||||
|
@ -237,7 +234,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param fi for future use, currently always NULL
|
||||
*/
|
||||
void (*getattr)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*getattr)(fuse_req_t req, uint64_t ino,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -267,7 +264,7 @@ struct fuse_lowlevel_ops
|
|||
* Changed in version 2.5:
|
||||
* file information filled in for ftruncate
|
||||
*/
|
||||
void (*setattr)(fuse_req_t req, fuse_ino_t ino, struct stat *attr,
|
||||
void (*setattr)(fuse_req_t req, uint64_t ino, struct stat *attr,
|
||||
int to_set, fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -280,7 +277,7 @@ struct fuse_lowlevel_ops
|
|||
* @param req request handle
|
||||
* @param ino the inode number
|
||||
*/
|
||||
void (*readlink)(fuse_req_t req, fuse_ino_t ino);
|
||||
void (*readlink)(fuse_req_t req, uint64_t ino);
|
||||
|
||||
/**
|
||||
* Create file node
|
||||
|
@ -298,7 +295,7 @@ struct fuse_lowlevel_ops
|
|||
* @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)
|
||||
*/
|
||||
void (*mknod)(fuse_req_t req, fuse_ino_t parent, const char *name,
|
||||
void (*mknod)(fuse_req_t req, uint64_t parent, const char *name,
|
||||
mode_t mode, dev_t rdev);
|
||||
|
||||
/**
|
||||
|
@ -313,7 +310,7 @@ struct fuse_lowlevel_ops
|
|||
* @param name to create
|
||||
* @param mode with which to create the new file
|
||||
*/
|
||||
void (*mkdir)(fuse_req_t req, fuse_ino_t parent, const char *name,
|
||||
void (*mkdir)(fuse_req_t req, uint64_t parent, const char *name,
|
||||
mode_t mode);
|
||||
|
||||
/**
|
||||
|
@ -331,7 +328,7 @@ struct fuse_lowlevel_ops
|
|||
* @param parent inode number of the parent directory
|
||||
* @param name to remove
|
||||
*/
|
||||
void (*unlink)(fuse_req_t req, fuse_ino_t parent, const char *name);
|
||||
void (*unlink)(fuse_req_t req, uint64_t parent, const char *name);
|
||||
|
||||
/**
|
||||
* Remove a directory
|
||||
|
@ -348,7 +345,7 @@ struct fuse_lowlevel_ops
|
|||
* @param parent inode number of the parent directory
|
||||
* @param name to remove
|
||||
*/
|
||||
void (*rmdir)(fuse_req_t req, fuse_ino_t parent, const char *name);
|
||||
void (*rmdir)(fuse_req_t req, uint64_t parent, const char *name);
|
||||
|
||||
/**
|
||||
* Create a symbolic link
|
||||
|
@ -362,7 +359,7 @@ struct fuse_lowlevel_ops
|
|||
* @param parent inode number of the parent directory
|
||||
* @param name to create
|
||||
*/
|
||||
void (*symlink)(fuse_req_t req, const char *link, fuse_ino_t parent,
|
||||
void (*symlink)(fuse_req_t req, const char *link, uint64_t parent,
|
||||
const char *name);
|
||||
|
||||
/** Rename a file
|
||||
|
@ -382,8 +379,8 @@ struct fuse_lowlevel_ops
|
|||
* @param newparent inode number of the new parent directory
|
||||
* @param newname new name
|
||||
*/
|
||||
void (*rename)(fuse_req_t req, fuse_ino_t parent, const char *name,
|
||||
fuse_ino_t newparent, const char *newname);
|
||||
void (*rename)(fuse_req_t req, uint64_t parent, const char *name,
|
||||
uint64_t newparent, const char *newname);
|
||||
|
||||
/**
|
||||
* Create a hard link
|
||||
|
@ -397,7 +394,7 @@ struct fuse_lowlevel_ops
|
|||
* @param newparent inode number of the new parent directory
|
||||
* @param newname new name to create
|
||||
*/
|
||||
void (*link)(fuse_req_t req, fuse_ino_t ino, fuse_ino_t newparent,
|
||||
void (*link)(fuse_req_t req, uint64_t ino, uint64_t newparent,
|
||||
const char *newname);
|
||||
|
||||
/**
|
||||
|
@ -425,7 +422,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*open)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*open)(fuse_req_t req, uint64_t ino,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -453,7 +450,7 @@ struct fuse_lowlevel_ops
|
|||
* @param off offset to read from
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*read)(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
|
||||
void (*read)(fuse_req_t req, uint64_t ino, size_t size, off_t off,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -479,7 +476,7 @@ struct fuse_lowlevel_ops
|
|||
* @param off offset to write to
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*write)(fuse_req_t req, fuse_ino_t ino, const char *buf,
|
||||
void (*write)(fuse_req_t req, uint64_t ino, const char *buf,
|
||||
size_t size, off_t off, fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -511,7 +508,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*flush)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*flush)(fuse_req_t req, uint64_t ino,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -538,7 +535,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*release)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*release)(fuse_req_t req, uint64_t ino,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -555,7 +552,7 @@ struct fuse_lowlevel_ops
|
|||
* @param datasync flag indicating if only data should be flushed
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*fsync)(fuse_req_t req, fuse_ino_t ino, int datasync,
|
||||
void (*fsync)(fuse_req_t req, uint64_t ino, int datasync,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -579,7 +576,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*opendir)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*opendir)(fuse_req_t req, uint64_t ino,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -603,10 +600,10 @@ struct fuse_lowlevel_ops
|
|||
* @param off offset to continue reading the directory stream
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*readdir)(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
|
||||
void (*readdir)(fuse_req_t req, uint64_t ino, size_t size, off_t off,
|
||||
fuse_file_info_t *llffi);
|
||||
|
||||
void (*readdir_plus)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*readdir_plus)(fuse_req_t req, uint64_t ino,
|
||||
size_t size, off_t off,
|
||||
fuse_file_info_t *ffi);
|
||||
|
||||
|
@ -626,7 +623,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*releasedir)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*releasedir)(fuse_req_t req, uint64_t ino,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -646,7 +643,7 @@ struct fuse_lowlevel_ops
|
|||
* @param datasync flag indicating if only data should be flushed
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*fsyncdir)(fuse_req_t req, fuse_ino_t ino, int datasync,
|
||||
void (*fsyncdir)(fuse_req_t req, uint64_t ino, int datasync,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -659,7 +656,7 @@ struct fuse_lowlevel_ops
|
|||
* @param req request handle
|
||||
* @param ino the inode number, zero means "undefined"
|
||||
*/
|
||||
void (*statfs)(fuse_req_t req, fuse_ino_t ino);
|
||||
void (*statfs)(fuse_req_t req, uint64_t ino);
|
||||
|
||||
/**
|
||||
* Set an extended attribute
|
||||
|
@ -667,7 +664,7 @@ struct fuse_lowlevel_ops
|
|||
* Valid replies:
|
||||
* fuse_reply_err
|
||||
*/
|
||||
void (*setxattr)(fuse_req_t req, fuse_ino_t ino, const char *name,
|
||||
void (*setxattr)(fuse_req_t req, uint64_t ino, const char *name,
|
||||
const char *value, size_t size, int flags);
|
||||
|
||||
/**
|
||||
|
@ -693,7 +690,7 @@ struct fuse_lowlevel_ops
|
|||
* @param name of the extended attribute
|
||||
* @param size maximum size of the value to send
|
||||
*/
|
||||
void (*getxattr)(fuse_req_t req, fuse_ino_t ino, const char *name,
|
||||
void (*getxattr)(fuse_req_t req, uint64_t ino, const char *name,
|
||||
size_t size);
|
||||
|
||||
/**
|
||||
|
@ -719,7 +716,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param size maximum size of the list to send
|
||||
*/
|
||||
void (*listxattr)(fuse_req_t req, fuse_ino_t ino, size_t size);
|
||||
void (*listxattr)(fuse_req_t req, uint64_t ino, size_t size);
|
||||
|
||||
/**
|
||||
* Remove an extended attribute
|
||||
|
@ -731,7 +728,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param name of the extended attribute
|
||||
*/
|
||||
void (*removexattr)(fuse_req_t req, fuse_ino_t ino, const char *name);
|
||||
void (*removexattr)(fuse_req_t req, uint64_t ino, const char *name);
|
||||
|
||||
/**
|
||||
* Check file access permissions
|
||||
|
@ -751,7 +748,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ino the inode number
|
||||
* @param mask requested access mode
|
||||
*/
|
||||
void (*access)(fuse_req_t req, fuse_ino_t ino, int mask);
|
||||
void (*access)(fuse_req_t req, uint64_t ino, int mask);
|
||||
|
||||
/**
|
||||
* Create and open a file
|
||||
|
@ -786,7 +783,7 @@ struct fuse_lowlevel_ops
|
|||
* @param mode file type and mode with which to create the new file
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*create)(fuse_req_t req, fuse_ino_t parent, const char *name,
|
||||
void (*create)(fuse_req_t req, uint64_t parent, const char *name,
|
||||
mode_t mode, fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -803,7 +800,7 @@ struct fuse_lowlevel_ops
|
|||
* @param fi file information
|
||||
* @param lock the region/type to test
|
||||
*/
|
||||
void (*getlk)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*getlk)(fuse_req_t req, uint64_t ino,
|
||||
fuse_file_info_t *fi, struct flock *lock);
|
||||
|
||||
/**
|
||||
|
@ -830,7 +827,7 @@ struct fuse_lowlevel_ops
|
|||
* @param lock the region/type to set
|
||||
* @param sleep locking operation may sleep
|
||||
*/
|
||||
void (*setlk)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*setlk)(fuse_req_t req, uint64_t ino,
|
||||
fuse_file_info_t *fi,
|
||||
struct flock *lock, int sleep);
|
||||
|
||||
|
@ -851,7 +848,7 @@ struct fuse_lowlevel_ops
|
|||
* @param blocksize unit of block index
|
||||
* @param idx block index within file
|
||||
*/
|
||||
void (*bmap)(fuse_req_t req, fuse_ino_t ino, size_t blocksize,
|
||||
void (*bmap)(fuse_req_t req, uint64_t ino, size_t blocksize,
|
||||
uint64_t idx);
|
||||
|
||||
/**
|
||||
|
@ -881,7 +878,7 @@ struct fuse_lowlevel_ops
|
|||
* @param in_bufsz number of fetched bytes
|
||||
* @param out_bufsz maximum size of output data
|
||||
*/
|
||||
void (*ioctl)(fuse_req_t req, fuse_ino_t ino, unsigned long cmd, void *arg,
|
||||
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);
|
||||
|
||||
|
@ -912,7 +909,7 @@ struct fuse_lowlevel_ops
|
|||
* @param ph poll handle to be used for notification
|
||||
*/
|
||||
void (*poll)(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi,
|
||||
fuse_pollhandle_t *ph);
|
||||
|
||||
|
@ -942,7 +939,7 @@ struct fuse_lowlevel_ops
|
|||
* @param off offset to write to
|
||||
* @param fi file information
|
||||
*/
|
||||
void (*write_buf)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*write_buf)(fuse_req_t req, uint64_t ino,
|
||||
struct fuse_bufvec *bufv, off_t off,
|
||||
fuse_file_info_t *fi);
|
||||
|
||||
|
@ -960,7 +957,7 @@ struct fuse_lowlevel_ops
|
|||
* @param offset the offset supplied to fuse_lowlevel_notify_retrieve()
|
||||
* @param bufv the buffer containing the returned data
|
||||
*/
|
||||
void (*retrieve_reply)(fuse_req_t req, void *cookie, fuse_ino_t ino,
|
||||
void (*retrieve_reply)(fuse_req_t req, void *cookie, uint64_t ino,
|
||||
off_t offset, struct fuse_bufvec *bufv);
|
||||
|
||||
/**
|
||||
|
@ -996,7 +993,7 @@ struct fuse_lowlevel_ops
|
|||
* @param fi file information
|
||||
* @param op the locking operation, see flock(2)
|
||||
*/
|
||||
void (*flock)(fuse_req_t req, fuse_ino_t ino,
|
||||
void (*flock)(fuse_req_t req, uint64_t ino,
|
||||
fuse_file_info_t *fi, int op);
|
||||
|
||||
/**
|
||||
|
@ -1016,7 +1013,7 @@ struct fuse_lowlevel_ops
|
|||
* @param mode determines the operation to be performed on the given range,
|
||||
* see fallocate(2)
|
||||
*/
|
||||
void (*fallocate)(fuse_req_t req, fuse_ino_t ino, int mode,
|
||||
void (*fallocate)(fuse_req_t req, uint64_t ino, int mode,
|
||||
off_t offset, off_t length, fuse_file_info_t *fi);
|
||||
|
||||
/**
|
||||
|
@ -1056,10 +1053,10 @@ struct fuse_lowlevel_ops
|
|||
* @param flags passed along with the copy_file_range() syscall
|
||||
*/
|
||||
void (*copy_file_range)(fuse_req_t req,
|
||||
fuse_ino_t ino_in,
|
||||
uint64_t ino_in,
|
||||
off_t off_in,
|
||||
fuse_file_info_t *fi_in,
|
||||
fuse_ino_t ino_out,
|
||||
uint64_t ino_out,
|
||||
off_t off_out,
|
||||
fuse_file_info_t *fi_out,
|
||||
size_t len,
|
||||
|
@ -1345,7 +1342,7 @@ int fuse_lowlevel_notify_poll(fuse_pollhandle_t *ph);
|
|||
* @param len the amount of cache to invalidate or 0 for all
|
||||
* @return zero for success, -errno for failure
|
||||
*/
|
||||
int fuse_lowlevel_notify_inval_inode(struct fuse_chan *ch, fuse_ino_t ino,
|
||||
int fuse_lowlevel_notify_inval_inode(struct fuse_chan *ch, uint64_t ino,
|
||||
off_t off, off_t len);
|
||||
|
||||
/**
|
||||
|
@ -1362,7 +1359,7 @@ int fuse_lowlevel_notify_inval_inode(struct fuse_chan *ch, fuse_ino_t ino,
|
|||
* @param namelen strlen() of file name
|
||||
* @return zero for success, -errno for failure
|
||||
*/
|
||||
int fuse_lowlevel_notify_inval_entry(struct fuse_chan *ch, fuse_ino_t parent,
|
||||
int fuse_lowlevel_notify_inval_entry(struct fuse_chan *ch, uint64_t parent,
|
||||
const char *name, size_t namelen);
|
||||
|
||||
/**
|
||||
|
@ -1382,7 +1379,7 @@ int fuse_lowlevel_notify_inval_entry(struct fuse_chan *ch, fuse_ino_t parent,
|
|||
* @return zero for success, -errno for failure
|
||||
*/
|
||||
int fuse_lowlevel_notify_delete(struct fuse_chan *ch,
|
||||
fuse_ino_t parent, fuse_ino_t child,
|
||||
uint64_t parent, uint64_t child,
|
||||
const char *name, size_t namelen);
|
||||
|
||||
/**
|
||||
|
@ -1406,7 +1403,7 @@ int fuse_lowlevel_notify_delete(struct fuse_chan *ch,
|
|||
* @param flags flags controlling the copy
|
||||
* @return zero for success, -errno for failure
|
||||
*/
|
||||
int fuse_lowlevel_notify_store(struct fuse_chan *ch, fuse_ino_t ino,
|
||||
int fuse_lowlevel_notify_store(struct fuse_chan *ch, uint64_t ino,
|
||||
off_t offset, struct fuse_bufvec *bufv,
|
||||
enum fuse_buf_copy_flags flags);
|
||||
/**
|
||||
|
@ -1434,7 +1431,7 @@ int fuse_lowlevel_notify_store(struct fuse_chan *ch, fuse_ino_t ino,
|
|||
* @param cookie user data to supply to the reply callback
|
||||
* @return zero for success, -errno for failure
|
||||
*/
|
||||
int fuse_lowlevel_notify_retrieve(struct fuse_chan *ch, fuse_ino_t ino,
|
||||
int fuse_lowlevel_notify_retrieve(struct fuse_chan *ch, uint64_t ino,
|
||||
size_t size, off_t offset, void *cookie);
|
||||
|
||||
|
||||
|
|
112
libfuse/lib/crc32b.c
Normal file
112
libfuse/lib/crc32b.c
Normal file
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
ISC License
|
||||
|
||||
Copyright (c) 2021, Antonio SJ Musumeci <trapexit@spawn.link>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "crc32b.h"
|
||||
|
||||
static
|
||||
const
|
||||
crc32b_t CRC32BTABLE[256] =
|
||||
{
|
||||
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
|
||||
0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
|
||||
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
|
||||
0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
|
||||
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
|
||||
0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
|
||||
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
|
||||
0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
|
||||
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
|
||||
0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
|
||||
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
|
||||
0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
|
||||
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
|
||||
0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
|
||||
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
|
||||
0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
|
||||
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
|
||||
0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
|
||||
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
|
||||
0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
|
||||
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
|
||||
0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
|
||||
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
|
||||
0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
|
||||
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
|
||||
0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
|
||||
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
|
||||
0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
|
||||
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
|
||||
0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
|
||||
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
|
||||
0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
|
||||
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
|
||||
0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
|
||||
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
|
||||
0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
|
||||
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
|
||||
0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
|
||||
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
|
||||
0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
|
||||
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
|
||||
0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
|
||||
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
|
||||
};
|
||||
|
||||
crc32b_t
|
||||
crc32b_start(void)
|
||||
{
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
crc32b_t
|
||||
crc32b_continue(const void *buf_,
|
||||
const crc32b_t len_,
|
||||
const crc32b_t crc_)
|
||||
{
|
||||
int i;
|
||||
char *buf;
|
||||
crc32b_t crc;
|
||||
|
||||
crc = crc_;
|
||||
buf = (char*)buf_;
|
||||
for(i = 0; i < len_; i++)
|
||||
{
|
||||
crc = (CRC32BTABLE[(crc ^ buf[i]) & 0xFFL] ^ (crc >> 8));
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
crc32b_t
|
||||
crc32b_finish(const crc32b_t crc_)
|
||||
{
|
||||
return (crc_ ^ 0xFFFFFFFF);
|
||||
}
|
||||
|
||||
crc32b_t
|
||||
crc32b(const void *buf_,
|
||||
const crc32b_t len_)
|
||||
{
|
||||
crc32b_t crc;
|
||||
|
||||
crc = crc32b_start();
|
||||
crc = crc32b_continue(buf_,len_,crc);
|
||||
crc = crc32b_finish(crc);
|
||||
|
||||
return crc;
|
||||
}
|
32
libfuse/lib/crc32b.h
Normal file
32
libfuse/lib/crc32b.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
ISC License
|
||||
|
||||
Copyright (c) 2021, Antonio SJ Musumeci <trapexit@spawn.link>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef CRC32B_H_INCLUDED
|
||||
#define CRC32B_H_INCLUDED
|
||||
|
||||
typedef unsigned int crc32b_t;
|
||||
|
||||
crc32b_t crc32b_start(void);
|
||||
crc32b_t crc32b_continue(const void *buf,
|
||||
const crc32b_t len,
|
||||
const crc32b_t crc);
|
||||
crc32b_t crc32b_finish(const crc32b_t crc);
|
||||
|
||||
crc32b_t crc32b(const void *buf, crc32b_t len);
|
||||
|
||||
#endif
|
|
@ -9,9 +9,11 @@
|
|||
/* For pthread_rwlock_t */
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include "crc32b.h"
|
||||
#include "fuse_node.h"
|
||||
#include "lfmp.h"
|
||||
#include "khash.h"
|
||||
#include "kvec.h"
|
||||
#include "lfmp.h"
|
||||
|
||||
#include "config.h"
|
||||
#include "fuse_i.h"
|
||||
|
@ -75,11 +77,11 @@ struct lock_queue_element
|
|||
{
|
||||
struct lock_queue_element *next;
|
||||
pthread_cond_t cond;
|
||||
fuse_ino_t nodeid1;
|
||||
uint64_t nodeid1;
|
||||
const char *name1;
|
||||
char **path1;
|
||||
struct node **wnode1;
|
||||
fuse_ino_t nodeid2;
|
||||
uint64_t nodeid2;
|
||||
const char *name2;
|
||||
char **path2;
|
||||
struct node **wnode2;
|
||||
|
@ -117,13 +119,19 @@ struct remembered_node_t
|
|||
time_t time;
|
||||
};
|
||||
|
||||
typedef struct nodeid_gen_t nodeid_gen_t;
|
||||
struct nodeid_gen_t
|
||||
{
|
||||
uint64_t nodeid;
|
||||
uint64_t generation;
|
||||
};
|
||||
|
||||
struct fuse
|
||||
{
|
||||
struct fuse_session *se;
|
||||
struct node_table name_table;
|
||||
struct node_table id_table;
|
||||
fuse_ino_t ctr;
|
||||
uint64_t generation;
|
||||
nodeid_gen_t nodeid_gen;
|
||||
unsigned int hidectr;
|
||||
pthread_mutex_t lock;
|
||||
struct fuse_config conf;
|
||||
|
@ -149,22 +157,23 @@ struct node
|
|||
{
|
||||
struct node *name_next;
|
||||
struct node *id_next;
|
||||
fuse_ino_t nodeid;
|
||||
uint64_t generation;
|
||||
int refctr;
|
||||
struct node *parent;
|
||||
|
||||
uint64_t nodeid;
|
||||
char *name;
|
||||
struct node *parent;
|
||||
|
||||
uint64_t nlookup;
|
||||
int open_count;
|
||||
struct lock *locks;
|
||||
uint32_t refctr;
|
||||
uint32_t open_count;
|
||||
uint64_t hidden_fh;
|
||||
char is_hidden;
|
||||
int treelock;
|
||||
ino_t ino;
|
||||
off_t size;
|
||||
struct timespec mtim;
|
||||
char stat_cache_valid;
|
||||
|
||||
int32_t treelock;
|
||||
struct lock *locks;
|
||||
|
||||
uint32_t stat_crc32b;
|
||||
char inline_name[32];
|
||||
uint8_t is_hidden:1;
|
||||
uint8_t is_stat_cache_valid:1;
|
||||
};
|
||||
|
||||
|
||||
|
@ -188,6 +197,38 @@ static pthread_key_t fuse_context_key;
|
|||
static pthread_mutex_t fuse_context_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
static int fuse_context_ref;
|
||||
|
||||
/*
|
||||
Why was the nodeid:generation logic simplified?
|
||||
|
||||
nodeid is uint64_t: max value of 18446744073709551616
|
||||
If nodes were created at a rate of 1048576 per second it would take
|
||||
over 500 thousand years to roll over. I'm fine with risking that.
|
||||
*/
|
||||
static
|
||||
uint64_t
|
||||
generate_nodeid(nodeid_gen_t *ng_)
|
||||
{
|
||||
ng_->nodeid++;
|
||||
|
||||
return ng_->nodeid;
|
||||
}
|
||||
|
||||
static
|
||||
char*
|
||||
filename_strdup(struct fuse *f_,
|
||||
const char *fn_)
|
||||
{
|
||||
return strdup(fn_);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
filename_free(struct fuse *f_,
|
||||
char *fn_)
|
||||
{
|
||||
free(fn_);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
list_add(struct list_head *new,
|
||||
|
@ -248,7 +289,7 @@ free_node_mem(struct fuse *f,
|
|||
static
|
||||
size_t
|
||||
id_hash(struct fuse *f,
|
||||
fuse_ino_t ino)
|
||||
uint64_t ino)
|
||||
{
|
||||
uint64_t hash = ((uint32_t)ino * 2654435761U) % f->id_table.size;
|
||||
uint64_t oldhash = hash % (f->id_table.size / 2);
|
||||
|
@ -262,7 +303,7 @@ id_hash(struct fuse *f,
|
|||
static
|
||||
struct node*
|
||||
get_node_nocheck(struct fuse *f,
|
||||
fuse_ino_t nodeid)
|
||||
uint64_t nodeid)
|
||||
{
|
||||
size_t hash = id_hash(f,nodeid);
|
||||
struct node *node;
|
||||
|
@ -277,7 +318,7 @@ get_node_nocheck(struct fuse *f,
|
|||
static
|
||||
struct node*
|
||||
get_node(struct fuse *f,
|
||||
const fuse_ino_t nodeid)
|
||||
const uint64_t nodeid)
|
||||
{
|
||||
struct node *node = get_node_nocheck(f,nodeid);
|
||||
|
||||
|
@ -306,6 +347,21 @@ remove_remembered_node(struct fuse *f_,
|
|||
}
|
||||
}
|
||||
|
||||
static
|
||||
uint32_t
|
||||
stat_crc32b(const struct stat *st_)
|
||||
{
|
||||
uint32_t crc;
|
||||
|
||||
crc = crc32b_start();
|
||||
crc = crc32b_continue(&st_->st_ino,sizeof(st_->st_ino),crc);
|
||||
crc = crc32b_continue(&st_->st_size,sizeof(st_->st_size),crc);
|
||||
crc = crc32b_continue(&st_->st_mtim,sizeof(st_->st_mtim),crc);
|
||||
crc = crc32b_finish(crc);
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
#ifndef CLOCK_MONOTONIC
|
||||
# define CLOCK_MONOTONIC CLOCK_REALTIME
|
||||
#endif
|
||||
|
@ -337,7 +393,7 @@ free_node(struct fuse *f_,
|
|||
struct node *node_)
|
||||
{
|
||||
if(node_->name != node_->inline_name)
|
||||
free(node_->name);
|
||||
filename_free(f_,node_->name);
|
||||
|
||||
if(node_->is_hidden)
|
||||
fuse_fs_free_hide(f_->fs,node_->hidden_fh);
|
||||
|
@ -486,7 +542,7 @@ hash_id(struct fuse *f,
|
|||
static
|
||||
size_t
|
||||
name_hash(struct fuse *f,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name)
|
||||
{
|
||||
uint64_t hash = parent;
|
||||
|
@ -554,7 +610,7 @@ unhash_name(struct fuse *f,
|
|||
node->name_next = NULL;
|
||||
unref_node(f,node->parent);
|
||||
if(node->name != node->inline_name)
|
||||
free(node->name);
|
||||
filename_free(f,node->name);
|
||||
node->name = NULL;
|
||||
node->parent = NULL;
|
||||
f->name_table.use--;
|
||||
|
@ -612,7 +668,7 @@ static
|
|||
int
|
||||
hash_name(struct fuse *f,
|
||||
struct node *node,
|
||||
fuse_ino_t parentid,
|
||||
uint64_t parentid,
|
||||
const char *name)
|
||||
{
|
||||
size_t hash = name_hash(f,parentid,name);
|
||||
|
@ -624,7 +680,7 @@ hash_name(struct fuse *f,
|
|||
}
|
||||
else
|
||||
{
|
||||
node->name = strdup(name);
|
||||
node->name = filename_strdup(f,name);
|
||||
if(node->name == NULL)
|
||||
return -1;
|
||||
}
|
||||
|
@ -686,26 +742,10 @@ rand64(void)
|
|||
return rv;
|
||||
}
|
||||
|
||||
static
|
||||
fuse_ino_t
|
||||
next_id(struct fuse *f)
|
||||
{
|
||||
do
|
||||
{
|
||||
f->ctr = ((f->ctr + 1) & UINT64_MAX);
|
||||
if(f->ctr == 0)
|
||||
f->generation++;
|
||||
} while((f->ctr == 0) ||
|
||||
(f->ctr == FUSE_UNKNOWN_INO) ||
|
||||
(get_node_nocheck(f,f->ctr) != NULL));
|
||||
|
||||
return f->ctr;
|
||||
}
|
||||
|
||||
static
|
||||
struct node*
|
||||
lookup_node(struct fuse *f,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name)
|
||||
{
|
||||
size_t hash;
|
||||
|
@ -731,7 +771,7 @@ inc_nlookup(struct node *node)
|
|||
static
|
||||
struct node*
|
||||
find_node(struct fuse *f,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name)
|
||||
{
|
||||
struct node *node;
|
||||
|
@ -748,8 +788,7 @@ find_node(struct fuse *f,
|
|||
if(node == NULL)
|
||||
goto out_err;
|
||||
|
||||
node->nodeid = next_id(f);
|
||||
node->generation = f->generation;
|
||||
node->nodeid = generate_nodeid(&f->nodeid_gen);
|
||||
if(f->conf.remember)
|
||||
inc_nlookup(node);
|
||||
|
||||
|
@ -814,7 +853,7 @@ add_name(char **buf,
|
|||
static
|
||||
void
|
||||
unlock_path(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
struct node *wnode,
|
||||
struct node *end)
|
||||
{
|
||||
|
@ -840,7 +879,7 @@ unlock_path(struct fuse *f,
|
|||
static
|
||||
int
|
||||
try_get_path(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const char *name,
|
||||
char **path,
|
||||
struct node **wnodep,
|
||||
|
@ -1072,7 +1111,7 @@ wait_path(struct fuse *f,
|
|||
static
|
||||
int
|
||||
get_path_common(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const char *name,
|
||||
char **path,
|
||||
struct node **wnode)
|
||||
|
@ -1100,7 +1139,7 @@ get_path_common(struct fuse *f,
|
|||
static
|
||||
int
|
||||
get_path(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
char **path)
|
||||
{
|
||||
return get_path_common(f,nodeid,NULL,path,NULL);
|
||||
|
@ -1109,7 +1148,7 @@ get_path(struct fuse *f,
|
|||
static
|
||||
int
|
||||
get_path_name(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const char *name,
|
||||
char **path)
|
||||
{
|
||||
|
@ -1119,7 +1158,7 @@ get_path_name(struct fuse *f,
|
|||
static
|
||||
int
|
||||
get_path_wrlock(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const char *name,
|
||||
char **path,
|
||||
struct node **wnode)
|
||||
|
@ -1130,9 +1169,9 @@ get_path_wrlock(struct fuse *f,
|
|||
static
|
||||
int
|
||||
try_get_path2(struct fuse *f,
|
||||
fuse_ino_t nodeid1,
|
||||
uint64_t nodeid1,
|
||||
const char *name1,
|
||||
fuse_ino_t nodeid2,
|
||||
uint64_t nodeid2,
|
||||
const char *name2,
|
||||
char **path1,
|
||||
char **path2,
|
||||
|
@ -1161,9 +1200,9 @@ try_get_path2(struct fuse *f,
|
|||
static
|
||||
int
|
||||
get_path2(struct fuse *f,
|
||||
fuse_ino_t nodeid1,
|
||||
uint64_t nodeid1,
|
||||
const char *name1,
|
||||
fuse_ino_t nodeid2,
|
||||
uint64_t nodeid2,
|
||||
const char *name2,
|
||||
char **path1,
|
||||
char **path2,
|
||||
|
@ -1198,7 +1237,7 @@ get_path2(struct fuse *f,
|
|||
static
|
||||
void
|
||||
free_path_wrlock(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
struct node *wnode,
|
||||
char *path)
|
||||
{
|
||||
|
@ -1213,7 +1252,7 @@ free_path_wrlock(struct fuse *f,
|
|||
static
|
||||
void
|
||||
free_path(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
char *path)
|
||||
{
|
||||
if(path)
|
||||
|
@ -1223,8 +1262,8 @@ free_path(struct fuse *f,
|
|||
static
|
||||
void
|
||||
free_path2(struct fuse *f,
|
||||
fuse_ino_t nodeid1,
|
||||
fuse_ino_t nodeid2,
|
||||
uint64_t nodeid1,
|
||||
uint64_t nodeid2,
|
||||
struct node *wnode1,
|
||||
struct node *wnode2,
|
||||
char *path1,
|
||||
|
@ -1242,7 +1281,7 @@ free_path2(struct fuse *f,
|
|||
static
|
||||
void
|
||||
forget_node(struct fuse *f,
|
||||
const fuse_ino_t nodeid,
|
||||
const uint64_t nodeid,
|
||||
const uint64_t nlookup)
|
||||
{
|
||||
struct node *node;
|
||||
|
@ -1310,7 +1349,7 @@ unlink_node(struct fuse *f,
|
|||
static
|
||||
void
|
||||
remove_node(struct fuse *f,
|
||||
fuse_ino_t dir,
|
||||
uint64_t dir,
|
||||
const char *name)
|
||||
{
|
||||
struct node *node;
|
||||
|
@ -1325,9 +1364,9 @@ remove_node(struct fuse *f,
|
|||
static
|
||||
int
|
||||
rename_node(struct fuse *f,
|
||||
fuse_ino_t olddir,
|
||||
uint64_t olddir,
|
||||
const char *oldname,
|
||||
fuse_ino_t newdir,
|
||||
uint64_t newdir,
|
||||
const char *newname)
|
||||
{
|
||||
struct node *node;
|
||||
|
@ -1358,7 +1397,7 @@ rename_node(struct fuse *f,
|
|||
static
|
||||
void
|
||||
set_stat(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
struct stat *stbuf)
|
||||
{
|
||||
if(!f->conf.use_ino)
|
||||
|
@ -1786,22 +1825,20 @@ void
|
|||
update_stat(struct node *node_,
|
||||
const struct stat *stnew_)
|
||||
{
|
||||
if((node_->stat_cache_valid) &&
|
||||
((node_->mtim.tv_sec != stnew_->st_mtim.tv_sec) ||
|
||||
(node_->mtim.tv_nsec != stnew_->st_mtim.tv_nsec) ||
|
||||
(node_->ino != stnew_->st_ino) ||
|
||||
(node_->size != stnew_->st_size)))
|
||||
node_->stat_cache_valid = 0;
|
||||
uint32_t crc32b;
|
||||
|
||||
node_->ino = stnew_->st_ino;
|
||||
node_->size = stnew_->st_size;
|
||||
node_->mtim = stnew_->st_mtim;
|
||||
crc32b = stat_crc32b(stnew_);
|
||||
|
||||
if(node_->is_stat_cache_valid && (crc32b != node_->stat_crc32b))
|
||||
node_->is_stat_cache_valid = 0;
|
||||
|
||||
node_->stat_crc32b = crc32b;
|
||||
}
|
||||
|
||||
static
|
||||
int
|
||||
set_path_info(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const char *name,
|
||||
struct fuse_entry_param *e)
|
||||
{
|
||||
|
@ -1812,7 +1849,7 @@ set_path_info(struct fuse *f,
|
|||
return -ENOMEM;
|
||||
|
||||
e->ino = node->nodeid;
|
||||
e->generation = node->generation;
|
||||
e->generation = f->nodeid_gen.generation;
|
||||
|
||||
pthread_mutex_lock(&f->lock);
|
||||
update_stat(node,&e->attr);
|
||||
|
@ -1826,7 +1863,7 @@ set_path_info(struct fuse *f,
|
|||
static
|
||||
int
|
||||
lookup_path(struct fuse *f,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const char *name,
|
||||
const char *path,
|
||||
struct fuse_entry_param *e,
|
||||
|
@ -2005,7 +2042,7 @@ fuse_lib_destroy(void *data)
|
|||
static
|
||||
void
|
||||
fuse_lib_lookup(fuse_req_t req,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name)
|
||||
{
|
||||
struct fuse *f = req_fuse_prepare(req);
|
||||
|
@ -2064,7 +2101,7 @@ fuse_lib_lookup(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_forget(struct fuse *f,
|
||||
const fuse_ino_t ino,
|
||||
const uint64_t ino,
|
||||
const uint64_t nlookup)
|
||||
{
|
||||
forget_node(f,ino,nlookup);
|
||||
|
@ -2073,7 +2110,7 @@ do_forget(struct fuse *f,
|
|||
static
|
||||
void
|
||||
fuse_lib_forget(fuse_req_t req,
|
||||
const fuse_ino_t ino,
|
||||
const uint64_t ino,
|
||||
const uint64_t nlookup)
|
||||
{
|
||||
do_forget(req_fuse(req),ino,nlookup);
|
||||
|
@ -2099,7 +2136,7 @@ fuse_lib_forget_multi(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_getattr(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi)
|
||||
{
|
||||
|
||||
|
@ -2174,7 +2211,7 @@ fuse_fs_fchmod(struct fuse_fs *fs_,
|
|||
static
|
||||
void
|
||||
fuse_lib_setattr(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
struct stat *attr,
|
||||
int valid,
|
||||
fuse_file_info_t *fi)
|
||||
|
@ -2293,7 +2330,7 @@ fuse_lib_setattr(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_access(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
int mask)
|
||||
{
|
||||
struct fuse *f = req_fuse_prepare(req);
|
||||
|
@ -2313,7 +2350,7 @@ fuse_lib_access(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_readlink(fuse_req_t req,
|
||||
fuse_ino_t ino)
|
||||
uint64_t ino)
|
||||
{
|
||||
struct fuse *f = req_fuse_prepare(req);
|
||||
char linkname[PATH_MAX + 1];
|
||||
|
@ -2341,7 +2378,7 @@ fuse_lib_readlink(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_mknod(fuse_req_t req,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name,
|
||||
mode_t mode,
|
||||
dev_t rdev)
|
||||
|
@ -2383,7 +2420,7 @@ fuse_lib_mknod(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_mkdir(fuse_req_t req,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name,
|
||||
mode_t mode)
|
||||
{
|
||||
|
@ -2406,7 +2443,7 @@ fuse_lib_mkdir(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_unlink(fuse_req_t req,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name)
|
||||
{
|
||||
int err;
|
||||
|
@ -2441,7 +2478,7 @@ fuse_lib_unlink(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_rmdir(fuse_req_t req,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name)
|
||||
{
|
||||
struct fuse *f = req_fuse_prepare(req);
|
||||
|
@ -2465,7 +2502,7 @@ static
|
|||
void
|
||||
fuse_lib_symlink(fuse_req_t req_,
|
||||
const char *linkname_,
|
||||
fuse_ino_t parent_,
|
||||
uint64_t parent_,
|
||||
const char *name_)
|
||||
{
|
||||
int rv;
|
||||
|
@ -2490,9 +2527,9 @@ fuse_lib_symlink(fuse_req_t req_,
|
|||
static
|
||||
void
|
||||
fuse_lib_rename(fuse_req_t req,
|
||||
fuse_ino_t olddir,
|
||||
uint64_t olddir,
|
||||
const char *oldname,
|
||||
fuse_ino_t newdir,
|
||||
uint64_t newdir,
|
||||
const char *newname)
|
||||
{
|
||||
int err;
|
||||
|
@ -2530,8 +2567,8 @@ fuse_lib_rename(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_link(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
fuse_ino_t newparent,
|
||||
uint64_t ino,
|
||||
uint64_t newparent,
|
||||
const char *newname)
|
||||
{
|
||||
int rv;
|
||||
|
@ -2558,7 +2595,7 @@ fuse_lib_link(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_do_release(struct fuse *f,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi)
|
||||
{
|
||||
struct node *node;
|
||||
|
@ -2588,7 +2625,7 @@ fuse_do_release(struct fuse *f,
|
|||
static
|
||||
void
|
||||
fuse_lib_create(fuse_req_t req,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name,
|
||||
mode_t mode,
|
||||
fuse_file_info_t *fi)
|
||||
|
@ -2644,7 +2681,7 @@ fuse_lib_create(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
open_auto_cache(struct fuse *f,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
const char *path,
|
||||
fuse_file_info_t *fi)
|
||||
{
|
||||
|
@ -2654,7 +2691,7 @@ open_auto_cache(struct fuse *f,
|
|||
pthread_mutex_lock(&f->lock);
|
||||
|
||||
node = get_node(f,ino);
|
||||
if(node->stat_cache_valid)
|
||||
if(node->is_stat_cache_valid)
|
||||
{
|
||||
int err;
|
||||
struct stat stbuf;
|
||||
|
@ -2666,13 +2703,13 @@ open_auto_cache(struct fuse *f,
|
|||
if(!err)
|
||||
update_stat(node,&stbuf);
|
||||
else
|
||||
node->stat_cache_valid = 0;
|
||||
node->is_stat_cache_valid = 0;
|
||||
}
|
||||
|
||||
if(node->stat_cache_valid)
|
||||
if(node->is_stat_cache_valid)
|
||||
fi->keep_cache = 1;
|
||||
|
||||
node->stat_cache_valid = 1;
|
||||
node->is_stat_cache_valid = 1;
|
||||
|
||||
pthread_mutex_unlock(&f->lock);
|
||||
}
|
||||
|
@ -2680,7 +2717,7 @@ open_auto_cache(struct fuse *f,
|
|||
static
|
||||
void
|
||||
fuse_lib_open(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi)
|
||||
{
|
||||
int err;
|
||||
|
@ -2719,7 +2756,7 @@ fuse_lib_open(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_read(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
size_t size,
|
||||
off_t off,
|
||||
fuse_file_info_t *fi)
|
||||
|
@ -2741,7 +2778,7 @@ fuse_lib_read(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_write_buf(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
struct fuse_bufvec *buf,
|
||||
off_t off,
|
||||
fuse_file_info_t *fi)
|
||||
|
@ -2761,7 +2798,7 @@ fuse_lib_write_buf(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_fsync(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
int datasync,
|
||||
fuse_file_info_t *fi)
|
||||
{
|
||||
|
@ -2787,7 +2824,7 @@ get_dirhandle(const fuse_file_info_t *llfi,
|
|||
static
|
||||
void
|
||||
fuse_lib_opendir(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *llfi)
|
||||
{
|
||||
int err;
|
||||
|
@ -2868,7 +2905,7 @@ readdir_buf(fuse_dirents_t *d_,
|
|||
static
|
||||
void
|
||||
fuse_lib_readdir(fuse_req_t req_,
|
||||
fuse_ino_t ino_,
|
||||
uint64_t ino_,
|
||||
size_t size_,
|
||||
off_t off_,
|
||||
fuse_file_info_t *llffi_)
|
||||
|
@ -2908,7 +2945,7 @@ fuse_lib_readdir(fuse_req_t req_,
|
|||
static
|
||||
void
|
||||
fuse_lib_readdir_plus(fuse_req_t req_,
|
||||
fuse_ino_t ino_,
|
||||
uint64_t ino_,
|
||||
size_t size_,
|
||||
off_t off_,
|
||||
fuse_file_info_t *llffi_)
|
||||
|
@ -2948,7 +2985,7 @@ fuse_lib_readdir_plus(fuse_req_t req_,
|
|||
static
|
||||
void
|
||||
fuse_lib_releasedir(fuse_req_t req_,
|
||||
fuse_ino_t ino_,
|
||||
uint64_t ino_,
|
||||
fuse_file_info_t *llfi_)
|
||||
{
|
||||
struct fuse *f;
|
||||
|
@ -2972,7 +3009,7 @@ fuse_lib_releasedir(fuse_req_t req_,
|
|||
static
|
||||
void
|
||||
fuse_lib_fsyncdir(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
int datasync,
|
||||
fuse_file_info_t *llfi)
|
||||
{
|
||||
|
@ -2990,7 +3027,7 @@ fuse_lib_fsyncdir(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_statfs(fuse_req_t req,
|
||||
fuse_ino_t ino)
|
||||
uint64_t ino)
|
||||
{
|
||||
struct fuse *f = req_fuse_prepare(req);
|
||||
struct statvfs buf;
|
||||
|
@ -3016,7 +3053,7 @@ fuse_lib_statfs(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_setxattr(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
const char *name,
|
||||
const char *value,
|
||||
size_t size,
|
||||
|
@ -3040,7 +3077,7 @@ static
|
|||
int
|
||||
common_getxattr(struct fuse *f,
|
||||
fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
const char *name,
|
||||
char *value,
|
||||
size_t size)
|
||||
|
@ -3062,7 +3099,7 @@ common_getxattr(struct fuse *f,
|
|||
static
|
||||
void
|
||||
fuse_lib_getxattr(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
const char *name,
|
||||
size_t size)
|
||||
{
|
||||
|
@ -3099,7 +3136,7 @@ static
|
|||
int
|
||||
common_listxattr(struct fuse *f,
|
||||
fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
|
@ -3119,7 +3156,7 @@ common_listxattr(struct fuse *f,
|
|||
static
|
||||
void
|
||||
fuse_lib_listxattr(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
size_t size)
|
||||
{
|
||||
struct fuse *f = req_fuse_prepare(req);
|
||||
|
@ -3154,7 +3191,7 @@ fuse_lib_listxattr(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_removexattr(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
const char *name)
|
||||
{
|
||||
struct fuse *f = req_fuse_prepare(req);
|
||||
|
@ -3174,10 +3211,10 @@ fuse_lib_removexattr(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_copy_file_range(fuse_req_t req_,
|
||||
fuse_ino_t nodeid_in_,
|
||||
uint64_t nodeid_in_,
|
||||
off_t off_in_,
|
||||
fuse_file_info_t *ffi_in_,
|
||||
fuse_ino_t nodeid_out_,
|
||||
uint64_t nodeid_out_,
|
||||
off_t off_out_,
|
||||
fuse_file_info_t *ffi_out_,
|
||||
size_t len_,
|
||||
|
@ -3348,7 +3385,7 @@ static
|
|||
int
|
||||
fuse_flush_common(struct fuse *f,
|
||||
fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi)
|
||||
{
|
||||
struct flock lock;
|
||||
|
@ -3382,7 +3419,7 @@ fuse_flush_common(struct fuse *f,
|
|||
static
|
||||
void
|
||||
fuse_lib_release(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi)
|
||||
{
|
||||
int err = 0;
|
||||
|
@ -3403,7 +3440,7 @@ fuse_lib_release(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_flush(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi)
|
||||
{
|
||||
int err;
|
||||
|
@ -3417,7 +3454,7 @@ fuse_lib_flush(fuse_req_t req,
|
|||
static
|
||||
int
|
||||
fuse_lock_common(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi,
|
||||
struct flock *lock,
|
||||
int cmd)
|
||||
|
@ -3433,7 +3470,7 @@ fuse_lock_common(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_getlk(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi,
|
||||
struct flock *lock)
|
||||
{
|
||||
|
@ -3463,7 +3500,7 @@ fuse_lib_getlk(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_setlk(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi,
|
||||
struct flock *lock,
|
||||
int sleep)
|
||||
|
@ -3487,7 +3524,7 @@ fuse_lib_setlk(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_flock(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi,
|
||||
int op)
|
||||
{
|
||||
|
@ -3502,7 +3539,7 @@ fuse_lib_flock(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_bmap(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
size_t blocksize,
|
||||
uint64_t idx)
|
||||
{
|
||||
|
@ -3526,7 +3563,7 @@ fuse_lib_bmap(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_ioctl(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
unsigned long cmd,
|
||||
void *arg,
|
||||
fuse_file_info_t *llfi,
|
||||
|
@ -3576,7 +3613,7 @@ fuse_lib_ioctl(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_poll(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
fuse_file_info_t *fi,
|
||||
fuse_pollhandle_t *ph)
|
||||
{
|
||||
|
@ -3595,7 +3632,7 @@ fuse_lib_poll(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
fuse_lib_fallocate(fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
int mode,
|
||||
off_t offset,
|
||||
off_t length,
|
||||
|
@ -3724,48 +3761,48 @@ fuse_prune_remembered_nodes(struct fuse *f_)
|
|||
|
||||
static struct fuse_lowlevel_ops fuse_path_ops =
|
||||
{
|
||||
.access = fuse_lib_access,
|
||||
.bmap = fuse_lib_bmap,
|
||||
.copy_file_range = fuse_lib_copy_file_range,
|
||||
.create = fuse_lib_create,
|
||||
.destroy = fuse_lib_destroy,
|
||||
.fallocate = fuse_lib_fallocate,
|
||||
.flock = fuse_lib_flock,
|
||||
.flush = fuse_lib_flush,
|
||||
.forget = fuse_lib_forget,
|
||||
.forget_multi = fuse_lib_forget_multi,
|
||||
.fsync = fuse_lib_fsync,
|
||||
.fsyncdir = fuse_lib_fsyncdir,
|
||||
.getattr = fuse_lib_getattr,
|
||||
.getlk = fuse_lib_getlk,
|
||||
.getxattr = fuse_lib_getxattr,
|
||||
.init = fuse_lib_init,
|
||||
.ioctl = fuse_lib_ioctl,
|
||||
.link = fuse_lib_link,
|
||||
.listxattr = fuse_lib_listxattr,
|
||||
.lookup = fuse_lib_lookup,
|
||||
.mkdir = fuse_lib_mkdir,
|
||||
.mknod = fuse_lib_mknod,
|
||||
.open = fuse_lib_open,
|
||||
.opendir = fuse_lib_opendir,
|
||||
.poll = fuse_lib_poll,
|
||||
.read = fuse_lib_read,
|
||||
.readdir = fuse_lib_readdir,
|
||||
.readdir_plus = fuse_lib_readdir_plus,
|
||||
.readlink = fuse_lib_readlink,
|
||||
.release = fuse_lib_release,
|
||||
.releasedir = fuse_lib_releasedir,
|
||||
.removexattr = fuse_lib_removexattr,
|
||||
.rename = fuse_lib_rename,
|
||||
.retrieve_reply = NULL,
|
||||
.rmdir = fuse_lib_rmdir,
|
||||
.setattr = fuse_lib_setattr,
|
||||
.setlk = fuse_lib_setlk,
|
||||
.setxattr = fuse_lib_setxattr,
|
||||
.statfs = fuse_lib_statfs,
|
||||
.symlink = fuse_lib_symlink,
|
||||
.unlink = fuse_lib_unlink,
|
||||
.write_buf = fuse_lib_write_buf,
|
||||
.access = fuse_lib_access,
|
||||
.bmap = fuse_lib_bmap,
|
||||
.copy_file_range = fuse_lib_copy_file_range,
|
||||
.create = fuse_lib_create,
|
||||
.destroy = fuse_lib_destroy,
|
||||
.fallocate = fuse_lib_fallocate,
|
||||
.flock = fuse_lib_flock,
|
||||
.flush = fuse_lib_flush,
|
||||
.forget = fuse_lib_forget,
|
||||
.forget_multi = fuse_lib_forget_multi,
|
||||
.fsync = fuse_lib_fsync,
|
||||
.fsyncdir = fuse_lib_fsyncdir,
|
||||
.getattr = fuse_lib_getattr,
|
||||
.getlk = fuse_lib_getlk,
|
||||
.getxattr = fuse_lib_getxattr,
|
||||
.init = fuse_lib_init,
|
||||
.ioctl = fuse_lib_ioctl,
|
||||
.link = fuse_lib_link,
|
||||
.listxattr = fuse_lib_listxattr,
|
||||
.lookup = fuse_lib_lookup,
|
||||
.mkdir = fuse_lib_mkdir,
|
||||
.mknod = fuse_lib_mknod,
|
||||
.open = fuse_lib_open,
|
||||
.opendir = fuse_lib_opendir,
|
||||
.poll = fuse_lib_poll,
|
||||
.read = fuse_lib_read,
|
||||
.readdir = fuse_lib_readdir,
|
||||
.readdir_plus = fuse_lib_readdir_plus,
|
||||
.readlink = fuse_lib_readlink,
|
||||
.release = fuse_lib_release,
|
||||
.releasedir = fuse_lib_releasedir,
|
||||
.removexattr = fuse_lib_removexattr,
|
||||
.rename = fuse_lib_rename,
|
||||
.retrieve_reply = NULL,
|
||||
.rmdir = fuse_lib_rmdir,
|
||||
.setattr = fuse_lib_setattr,
|
||||
.setlk = fuse_lib_setlk,
|
||||
.setxattr = fuse_lib_setxattr,
|
||||
.statfs = fuse_lib_statfs,
|
||||
.symlink = fuse_lib_symlink,
|
||||
.unlink = fuse_lib_unlink,
|
||||
.write_buf = fuse_lib_write_buf,
|
||||
};
|
||||
|
||||
int
|
||||
|
@ -3862,30 +3899,30 @@ fuse_get_context(void)
|
|||
}
|
||||
|
||||
enum {
|
||||
KEY_HELP,
|
||||
KEY_HELP,
|
||||
};
|
||||
|
||||
#define FUSE_LIB_OPT(t,p,v) { t,offsetof(struct fuse_config,p),v }
|
||||
|
||||
static const struct fuse_opt fuse_lib_opts[] =
|
||||
{
|
||||
FUSE_OPT_KEY("-h", KEY_HELP),
|
||||
FUSE_OPT_KEY("--help", KEY_HELP),
|
||||
FUSE_OPT_KEY("debug", FUSE_OPT_KEY_KEEP),
|
||||
FUSE_OPT_KEY("-d", FUSE_OPT_KEY_KEEP),
|
||||
FUSE_LIB_OPT("debug", debug,1),
|
||||
FUSE_LIB_OPT("-d", debug,1),
|
||||
FUSE_LIB_OPT("umask=", set_mode,1),
|
||||
FUSE_LIB_OPT("umask=%o", umask,0),
|
||||
FUSE_LIB_OPT("uid=", set_uid,1),
|
||||
FUSE_LIB_OPT("uid=%d", uid,0),
|
||||
FUSE_LIB_OPT("gid=", set_gid,1),
|
||||
FUSE_LIB_OPT("gid=%d", gid,0),
|
||||
FUSE_LIB_OPT("noforget", remember,-1),
|
||||
FUSE_LIB_OPT("remember=%u", remember,0),
|
||||
FUSE_LIB_OPT("threads=%d", threads,0),
|
||||
FUSE_LIB_OPT("use_ino", use_ino,1),
|
||||
FUSE_OPT_END
|
||||
FUSE_OPT_KEY("-h", KEY_HELP),
|
||||
FUSE_OPT_KEY("--help", KEY_HELP),
|
||||
FUSE_OPT_KEY("debug", FUSE_OPT_KEY_KEEP),
|
||||
FUSE_OPT_KEY("-d", FUSE_OPT_KEY_KEEP),
|
||||
FUSE_LIB_OPT("debug", debug,1),
|
||||
FUSE_LIB_OPT("-d", debug,1),
|
||||
FUSE_LIB_OPT("umask=", set_mode,1),
|
||||
FUSE_LIB_OPT("umask=%o", umask,0),
|
||||
FUSE_LIB_OPT("uid=", set_uid,1),
|
||||
FUSE_LIB_OPT("uid=%d", uid,0),
|
||||
FUSE_LIB_OPT("gid=", set_gid,1),
|
||||
FUSE_LIB_OPT("gid=%d", gid,0),
|
||||
FUSE_LIB_OPT("noforget", remember,-1),
|
||||
FUSE_LIB_OPT("remember=%u", remember,0),
|
||||
FUSE_LIB_OPT("threads=%d", threads,0),
|
||||
FUSE_LIB_OPT("use_ino", use_ino,1),
|
||||
FUSE_OPT_END
|
||||
};
|
||||
|
||||
static void fuse_lib_help(void)
|
||||
|
@ -4068,8 +4105,8 @@ fuse_new_common(struct fuse_chan *ch,
|
|||
|
||||
/* Trace topmost layer by default */
|
||||
srand(time(NULL));
|
||||
f->ctr = 0;
|
||||
f->generation = rand64();
|
||||
f->nodeid_gen.nodeid = FUSE_ROOT_ID;
|
||||
f->nodeid_gen.generation = rand64();
|
||||
if(node_table_init(&f->name_table) == -1)
|
||||
goto out_free_session;
|
||||
|
||||
|
|
|
@ -43,8 +43,11 @@ struct fuse_req
|
|||
struct fuse_notify_req
|
||||
{
|
||||
uint64_t unique;
|
||||
void (*reply)(struct fuse_notify_req *, fuse_req_t, fuse_ino_t,
|
||||
const void *, const struct fuse_buf *);
|
||||
void (*reply)(struct fuse_notify_req *,
|
||||
fuse_req_t,
|
||||
uint64_t,
|
||||
const void *,
|
||||
const struct fuse_buf *);
|
||||
struct fuse_notify_req *next;
|
||||
struct fuse_notify_req *prev;
|
||||
};
|
||||
|
|
|
@ -1002,7 +1002,7 @@ fuse_reply_poll(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_lookup(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
char *name = (char*)inarg;
|
||||
|
@ -1013,7 +1013,7 @@ do_lookup(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_forget(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_forget_in *arg = (struct fuse_forget_in*)inarg;
|
||||
|
@ -1024,7 +1024,7 @@ do_forget(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_batch_forget(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_batch_forget_in *arg = (void *) inarg;
|
||||
|
@ -1040,7 +1040,7 @@ do_batch_forget(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_getattr(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t *fip = NULL;
|
||||
|
@ -1063,7 +1063,7 @@ do_getattr(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_setattr(fuse_req_t req_,
|
||||
fuse_ino_t nodeid_,
|
||||
uint64_t nodeid_,
|
||||
const void *inarg_)
|
||||
{
|
||||
struct stat stbuf = {0};
|
||||
|
@ -1101,7 +1101,7 @@ do_setattr(fuse_req_t req_,
|
|||
static
|
||||
void
|
||||
do_access(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_access_in *arg = (struct fuse_access_in *)inarg;
|
||||
|
@ -1112,7 +1112,7 @@ do_access(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_readlink(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
(void)inarg;
|
||||
|
@ -1123,7 +1123,7 @@ do_readlink(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_mknod(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_mknod_in *arg = (struct fuse_mknod_in *) inarg;
|
||||
|
@ -1140,7 +1140,7 @@ do_mknod(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_mkdir(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_mkdir_in *arg = (struct fuse_mkdir_in *) inarg;
|
||||
|
@ -1154,7 +1154,7 @@ do_mkdir(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_unlink(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
char *name = (char*)inarg;
|
||||
|
@ -1165,7 +1165,7 @@ do_unlink(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_rmdir(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
char *name = (char*)inarg;
|
||||
|
@ -1176,7 +1176,7 @@ do_rmdir(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_symlink(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
char *name = (char*)inarg;
|
||||
|
@ -1188,7 +1188,7 @@ do_symlink(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_rename(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_rename_in *arg = (struct fuse_rename_in*)inarg;
|
||||
|
@ -1201,7 +1201,7 @@ do_rename(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_link(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_link_in *arg = (struct fuse_link_in*)inarg;
|
||||
|
@ -1212,7 +1212,7 @@ do_link(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_create(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_create_in *arg = (struct fuse_create_in*)inarg;
|
||||
|
@ -1232,7 +1232,7 @@ do_create(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_open(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1246,7 +1246,7 @@ do_open(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_read(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1265,7 +1265,7 @@ do_read(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_write(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
char *param;
|
||||
|
@ -1292,14 +1292,14 @@ do_write(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_write_buf(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg,
|
||||
const struct fuse_buf *ibuf)
|
||||
{
|
||||
struct fuse_ll *f = req->f;
|
||||
struct fuse_bufvec bufv = {
|
||||
.buf[0] = *ibuf,
|
||||
.count = 1,
|
||||
.buf[0] = *ibuf,
|
||||
.count = 1,
|
||||
};
|
||||
fuse_file_info_t fi = {0};
|
||||
struct fuse_write_in *arg = (struct fuse_write_in *) inarg;
|
||||
|
@ -1344,7 +1344,7 @@ do_write_buf(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_flush(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1361,7 +1361,7 @@ do_flush(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_release(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1387,7 +1387,7 @@ do_release(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_fsync(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1401,7 +1401,7 @@ do_fsync(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_opendir(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1415,7 +1415,7 @@ do_opendir(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_readdir(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1429,7 +1429,7 @@ do_readdir(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_readdir_plus(fuse_req_t req_,
|
||||
fuse_ino_t nodeid_,
|
||||
uint64_t nodeid_,
|
||||
const void *inarg_)
|
||||
{
|
||||
const struct fuse_read_in *arg;
|
||||
|
@ -1444,7 +1444,7 @@ do_readdir_plus(fuse_req_t req_,
|
|||
static
|
||||
void
|
||||
do_releasedir(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1459,7 +1459,7 @@ do_releasedir(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_fsyncdir(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1473,7 +1473,7 @@ do_fsyncdir(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_statfs(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
(void)nodeid;
|
||||
|
@ -1485,7 +1485,7 @@ do_statfs(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_setxattr(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_setxattr_in *arg = (struct fuse_setxattr_in*)inarg;
|
||||
|
@ -1498,7 +1498,7 @@ do_setxattr(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_getxattr(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_getxattr_in *arg = (struct fuse_getxattr_in*)inarg;
|
||||
|
@ -1509,7 +1509,7 @@ do_getxattr(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_listxattr(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_getxattr_in *arg = (struct fuse_getxattr_in*)inarg;
|
||||
|
@ -1520,7 +1520,7 @@ do_listxattr(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_removexattr(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
char *name = (char *) inarg;
|
||||
|
@ -1547,7 +1547,7 @@ convert_fuse_file_lock(struct fuse_file_lock *fl,
|
|||
static
|
||||
void
|
||||
do_getlk(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1565,7 +1565,7 @@ do_getlk(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_setlk_common(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg,
|
||||
int sleep)
|
||||
{
|
||||
|
@ -1609,7 +1609,7 @@ do_setlk_common(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_setlk(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
do_setlk_common(req, nodeid, inarg, 0);
|
||||
|
@ -1618,7 +1618,7 @@ do_setlk(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_setlkw(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
do_setlk_common(req, nodeid, inarg, 1);
|
||||
|
@ -1627,7 +1627,7 @@ do_setlkw(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_interrupt(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
destroy_req(req);
|
||||
|
@ -1636,7 +1636,7 @@ do_interrupt(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_bmap(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_bmap_in *arg = (struct fuse_bmap_in*)inarg;
|
||||
|
@ -1647,7 +1647,7 @@ do_bmap(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_ioctl(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1684,7 +1684,7 @@ fuse_pollhandle_destroy(fuse_pollhandle_t *ph)
|
|||
static
|
||||
void
|
||||
do_poll(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1711,7 +1711,7 @@ do_poll(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_fallocate(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
fuse_file_info_t fi = {0};
|
||||
|
@ -1725,7 +1725,7 @@ do_fallocate(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_init(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_init_out outarg = {0};
|
||||
|
@ -1912,7 +1912,7 @@ do_init(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_destroy(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg)
|
||||
{
|
||||
struct fuse_ll *f = req->f;
|
||||
|
@ -1959,7 +1959,7 @@ list_init_nreq(struct fuse_notify_req *nreq)
|
|||
static
|
||||
void
|
||||
do_notify_reply(fuse_req_t req,
|
||||
fuse_ino_t nodeid,
|
||||
uint64_t nodeid,
|
||||
const void *inarg,
|
||||
const struct fuse_buf *buf)
|
||||
{
|
||||
|
@ -1986,7 +1986,7 @@ do_notify_reply(fuse_req_t req,
|
|||
static
|
||||
void
|
||||
do_copy_file_range(fuse_req_t req_,
|
||||
fuse_ino_t nodeid_in_,
|
||||
uint64_t nodeid_in_,
|
||||
const void *arg_)
|
||||
|
||||
{
|
||||
|
@ -2052,7 +2052,7 @@ fuse_lowlevel_notify_poll(fuse_pollhandle_t *ph)
|
|||
|
||||
int
|
||||
fuse_lowlevel_notify_inval_inode(struct fuse_chan *ch,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
off_t off,
|
||||
off_t len)
|
||||
{
|
||||
|
@ -2079,7 +2079,7 @@ fuse_lowlevel_notify_inval_inode(struct fuse_chan *ch,
|
|||
|
||||
int
|
||||
fuse_lowlevel_notify_inval_entry(struct fuse_chan *ch,
|
||||
fuse_ino_t parent,
|
||||
uint64_t parent,
|
||||
const char *name,
|
||||
size_t namelen)
|
||||
{
|
||||
|
@ -2108,8 +2108,8 @@ fuse_lowlevel_notify_inval_entry(struct fuse_chan *ch,
|
|||
|
||||
int
|
||||
fuse_lowlevel_notify_delete(struct fuse_chan *ch,
|
||||
fuse_ino_t parent,
|
||||
fuse_ino_t child,
|
||||
uint64_t parent,
|
||||
uint64_t child,
|
||||
const char *name,
|
||||
size_t namelen)
|
||||
{
|
||||
|
@ -2142,7 +2142,7 @@ fuse_lowlevel_notify_delete(struct fuse_chan *ch,
|
|||
|
||||
int
|
||||
fuse_lowlevel_notify_store(struct fuse_chan *ch,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
off_t offset,
|
||||
struct fuse_bufvec *bufv,
|
||||
enum fuse_buf_copy_flags flags)
|
||||
|
@ -2194,7 +2194,7 @@ static
|
|||
void
|
||||
fuse_ll_retrieve_reply(struct fuse_notify_req *nreq,
|
||||
fuse_req_t req,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
const void *inarg,
|
||||
const struct fuse_buf *ibuf)
|
||||
{
|
||||
|
@ -2203,8 +2203,8 @@ fuse_ll_retrieve_reply(struct fuse_notify_req *nreq,
|
|||
container_of(nreq, struct fuse_retrieve_req, nreq);
|
||||
const struct fuse_notify_retrieve_in *arg = inarg;
|
||||
struct fuse_bufvec bufv = {
|
||||
.buf[0] = *ibuf,
|
||||
.count = 1,
|
||||
.buf[0] = *ibuf,
|
||||
.count = 1,
|
||||
};
|
||||
|
||||
if (!(bufv.buf[0].flags & FUSE_BUF_IS_FD))
|
||||
|
@ -2239,7 +2239,7 @@ fuse_ll_retrieve_reply(struct fuse_notify_req *nreq,
|
|||
|
||||
int
|
||||
fuse_lowlevel_notify_retrieve(struct fuse_chan *ch,
|
||||
fuse_ino_t ino,
|
||||
uint64_t ino,
|
||||
size_t size,
|
||||
off_t offset,
|
||||
void *cookie)
|
||||
|
@ -2305,53 +2305,53 @@ fuse_req_ctx(fuse_req_t req)
|
|||
}
|
||||
|
||||
static struct {
|
||||
void (*func)(fuse_req_t, fuse_ino_t, const void *);
|
||||
void (*func)(fuse_req_t, uint64_t, const void *);
|
||||
const char *name;
|
||||
} fuse_ll_ops[] =
|
||||
{
|
||||
[FUSE_LOOKUP] = { do_lookup, "LOOKUP" },
|
||||
[FUSE_FORGET] = { do_forget, "FORGET" },
|
||||
[FUSE_GETATTR] = { do_getattr, "GETATTR" },
|
||||
[FUSE_SETATTR] = { do_setattr, "SETATTR" },
|
||||
[FUSE_READLINK] = { do_readlink, "READLINK" },
|
||||
[FUSE_SYMLINK] = { do_symlink, "SYMLINK" },
|
||||
[FUSE_MKNOD] = { do_mknod, "MKNOD" },
|
||||
[FUSE_MKDIR] = { do_mkdir, "MKDIR" },
|
||||
[FUSE_UNLINK] = { do_unlink, "UNLINK" },
|
||||
[FUSE_RMDIR] = { do_rmdir, "RMDIR" },
|
||||
[FUSE_RENAME] = { do_rename, "RENAME" },
|
||||
[FUSE_LINK] = { do_link, "LINK" },
|
||||
[FUSE_OPEN] = { do_open, "OPEN" },
|
||||
[FUSE_READ] = { do_read, "READ" },
|
||||
[FUSE_WRITE] = { do_write, "WRITE" },
|
||||
[FUSE_STATFS] = { do_statfs, "STATFS" },
|
||||
[FUSE_RELEASE] = { do_release, "RELEASE" },
|
||||
[FUSE_FSYNC] = { do_fsync, "FSYNC" },
|
||||
[FUSE_SETXATTR] = { do_setxattr, "SETXATTR" },
|
||||
[FUSE_GETXATTR] = { do_getxattr, "GETXATTR" },
|
||||
[FUSE_LISTXATTR] = { do_listxattr, "LISTXATTR" },
|
||||
[FUSE_REMOVEXATTR] = { do_removexattr, "REMOVEXATTR" },
|
||||
[FUSE_FLUSH] = { do_flush, "FLUSH" },
|
||||
[FUSE_INIT] = { do_init, "INIT" },
|
||||
[FUSE_OPENDIR] = { do_opendir, "OPENDIR" },
|
||||
[FUSE_READDIR] = { do_readdir, "READDIR" },
|
||||
[FUSE_READDIRPLUS] = { do_readdir_plus, "READDIR_PLUS" },
|
||||
[FUSE_RELEASEDIR] = { do_releasedir, "RELEASEDIR" },
|
||||
[FUSE_FSYNCDIR] = { do_fsyncdir, "FSYNCDIR" },
|
||||
[FUSE_GETLK] = { do_getlk, "GETLK" },
|
||||
[FUSE_SETLK] = { do_setlk, "SETLK" },
|
||||
[FUSE_SETLKW] = { do_setlkw, "SETLKW" },
|
||||
[FUSE_ACCESS] = { do_access, "ACCESS" },
|
||||
[FUSE_CREATE] = { do_create, "CREATE" },
|
||||
[FUSE_INTERRUPT] = { do_interrupt, "INTERRUPT" },
|
||||
[FUSE_BMAP] = { do_bmap, "BMAP" },
|
||||
[FUSE_IOCTL] = { do_ioctl, "IOCTL" },
|
||||
[FUSE_POLL] = { do_poll, "POLL" },
|
||||
[FUSE_FALLOCATE] = { do_fallocate, "FALLOCATE" },
|
||||
[FUSE_DESTROY] = { do_destroy, "DESTROY" },
|
||||
[FUSE_NOTIFY_REPLY] = { (void *) 1, "NOTIFY_REPLY" },
|
||||
[FUSE_BATCH_FORGET] = { do_batch_forget, "BATCH_FORGET" },
|
||||
[FUSE_COPY_FILE_RANGE] = { do_copy_file_range, "COPY_FILE_RANGE" },
|
||||
[FUSE_LOOKUP] = { do_lookup, "LOOKUP" },
|
||||
[FUSE_FORGET] = { do_forget, "FORGET" },
|
||||
[FUSE_GETATTR] = { do_getattr, "GETATTR" },
|
||||
[FUSE_SETATTR] = { do_setattr, "SETATTR" },
|
||||
[FUSE_READLINK] = { do_readlink, "READLINK" },
|
||||
[FUSE_SYMLINK] = { do_symlink, "SYMLINK" },
|
||||
[FUSE_MKNOD] = { do_mknod, "MKNOD" },
|
||||
[FUSE_MKDIR] = { do_mkdir, "MKDIR" },
|
||||
[FUSE_UNLINK] = { do_unlink, "UNLINK" },
|
||||
[FUSE_RMDIR] = { do_rmdir, "RMDIR" },
|
||||
[FUSE_RENAME] = { do_rename, "RENAME" },
|
||||
[FUSE_LINK] = { do_link, "LINK" },
|
||||
[FUSE_OPEN] = { do_open, "OPEN" },
|
||||
[FUSE_READ] = { do_read, "READ" },
|
||||
[FUSE_WRITE] = { do_write, "WRITE" },
|
||||
[FUSE_STATFS] = { do_statfs, "STATFS" },
|
||||
[FUSE_RELEASE] = { do_release, "RELEASE" },
|
||||
[FUSE_FSYNC] = { do_fsync, "FSYNC" },
|
||||
[FUSE_SETXATTR] = { do_setxattr, "SETXATTR" },
|
||||
[FUSE_GETXATTR] = { do_getxattr, "GETXATTR" },
|
||||
[FUSE_LISTXATTR] = { do_listxattr, "LISTXATTR" },
|
||||
[FUSE_REMOVEXATTR] = { do_removexattr, "REMOVEXATTR" },
|
||||
[FUSE_FLUSH] = { do_flush, "FLUSH" },
|
||||
[FUSE_INIT] = { do_init, "INIT" },
|
||||
[FUSE_OPENDIR] = { do_opendir, "OPENDIR" },
|
||||
[FUSE_READDIR] = { do_readdir, "READDIR" },
|
||||
[FUSE_READDIRPLUS] = { do_readdir_plus, "READDIR_PLUS" },
|
||||
[FUSE_RELEASEDIR] = { do_releasedir, "RELEASEDIR" },
|
||||
[FUSE_FSYNCDIR] = { do_fsyncdir, "FSYNCDIR" },
|
||||
[FUSE_GETLK] = { do_getlk, "GETLK" },
|
||||
[FUSE_SETLK] = { do_setlk, "SETLK" },
|
||||
[FUSE_SETLKW] = { do_setlkw, "SETLKW" },
|
||||
[FUSE_ACCESS] = { do_access, "ACCESS" },
|
||||
[FUSE_CREATE] = { do_create, "CREATE" },
|
||||
[FUSE_INTERRUPT] = { do_interrupt, "INTERRUPT" },
|
||||
[FUSE_BMAP] = { do_bmap, "BMAP" },
|
||||
[FUSE_IOCTL] = { do_ioctl, "IOCTL" },
|
||||
[FUSE_POLL] = { do_poll, "POLL" },
|
||||
[FUSE_FALLOCATE] = { do_fallocate, "FALLOCATE" },
|
||||
[FUSE_DESTROY] = { do_destroy, "DESTROY" },
|
||||
[FUSE_NOTIFY_REPLY] = { (void *) 1, "NOTIFY_REPLY" },
|
||||
[FUSE_BATCH_FORGET] = { do_batch_forget, "BATCH_FORGET" },
|
||||
[FUSE_COPY_FILE_RANGE] = { do_copy_file_range, "COPY_FILE_RANGE" },
|
||||
};
|
||||
|
||||
#define FUSE_MAXOP (sizeof(fuse_ll_ops) / sizeof(fuse_ll_ops[0]))
|
||||
|
@ -2423,12 +2423,12 @@ fuse_ll_process_buf(void *data,
|
|||
if (req == NULL)
|
||||
{
|
||||
struct fuse_out_header out = {
|
||||
.unique = in->unique,
|
||||
.error = -ENOMEM,
|
||||
.unique = in->unique,
|
||||
.error = -ENOMEM,
|
||||
};
|
||||
struct iovec iov = {
|
||||
.iov_base = &out,
|
||||
.iov_len = sizeof(struct fuse_out_header),
|
||||
.iov_base = &out,
|
||||
.iov_len = sizeof(struct fuse_out_header),
|
||||
};
|
||||
|
||||
fuse_send_msg(f, ch, &iov, 1);
|
||||
|
@ -2510,42 +2510,42 @@ fuse_ll_process(void *data,
|
|||
struct fuse_chan *ch)
|
||||
{
|
||||
struct fuse_buf fbuf = {
|
||||
.mem = (void *) buf,
|
||||
.size = len,
|
||||
.mem = (void *) buf,
|
||||
.size = len,
|
||||
};
|
||||
|
||||
fuse_ll_process_buf(data, &fbuf, ch);
|
||||
}
|
||||
|
||||
enum {
|
||||
KEY_HELP,
|
||||
KEY_VERSION,
|
||||
KEY_HELP,
|
||||
KEY_VERSION,
|
||||
};
|
||||
|
||||
static const struct fuse_opt fuse_ll_opts[] =
|
||||
{
|
||||
{ "debug", offsetof(struct fuse_ll, debug), 1 },
|
||||
{ "-d", offsetof(struct fuse_ll, debug), 1 },
|
||||
{ "max_readahead=%u", offsetof(struct fuse_ll, conn.max_readahead), 0 },
|
||||
{ "max_background=%u", offsetof(struct fuse_ll, conn.max_background), 0 },
|
||||
{ "congestion_threshold=%u",
|
||||
offsetof(struct fuse_ll, conn.congestion_threshold), 0 },
|
||||
{ "no_remote_lock", offsetof(struct fuse_ll, no_remote_posix_lock), 1},
|
||||
{ "no_remote_lock", offsetof(struct fuse_ll, no_remote_flock), 1},
|
||||
{ "no_remote_flock", offsetof(struct fuse_ll, no_remote_flock), 1},
|
||||
{ "no_remote_posix_lock", offsetof(struct fuse_ll, no_remote_posix_lock), 1},
|
||||
{ "splice_write", offsetof(struct fuse_ll, splice_write), 1},
|
||||
{ "no_splice_write", offsetof(struct fuse_ll, no_splice_write), 1},
|
||||
{ "splice_move", offsetof(struct fuse_ll, splice_move), 1},
|
||||
{ "no_splice_move", offsetof(struct fuse_ll, no_splice_move), 1},
|
||||
{ "splice_read", offsetof(struct fuse_ll, splice_read), 1},
|
||||
{ "no_splice_read", offsetof(struct fuse_ll, no_splice_read), 1},
|
||||
FUSE_OPT_KEY("max_read=", FUSE_OPT_KEY_DISCARD),
|
||||
FUSE_OPT_KEY("-h", KEY_HELP),
|
||||
FUSE_OPT_KEY("--help", KEY_HELP),
|
||||
FUSE_OPT_KEY("-V", KEY_VERSION),
|
||||
FUSE_OPT_KEY("--version", KEY_VERSION),
|
||||
FUSE_OPT_END
|
||||
{ "debug", offsetof(struct fuse_ll, debug), 1 },
|
||||
{ "-d", offsetof(struct fuse_ll, debug), 1 },
|
||||
{ "max_readahead=%u", offsetof(struct fuse_ll, conn.max_readahead), 0 },
|
||||
{ "max_background=%u", offsetof(struct fuse_ll, conn.max_background), 0 },
|
||||
{ "congestion_threshold=%u",
|
||||
offsetof(struct fuse_ll, conn.congestion_threshold), 0 },
|
||||
{ "no_remote_lock", offsetof(struct fuse_ll, no_remote_posix_lock), 1},
|
||||
{ "no_remote_lock", offsetof(struct fuse_ll, no_remote_flock), 1},
|
||||
{ "no_remote_flock", offsetof(struct fuse_ll, no_remote_flock), 1},
|
||||
{ "no_remote_posix_lock", offsetof(struct fuse_ll, no_remote_posix_lock), 1},
|
||||
{ "splice_write", offsetof(struct fuse_ll, splice_write), 1},
|
||||
{ "no_splice_write", offsetof(struct fuse_ll, no_splice_write), 1},
|
||||
{ "splice_move", offsetof(struct fuse_ll, splice_move), 1},
|
||||
{ "no_splice_move", offsetof(struct fuse_ll, no_splice_move), 1},
|
||||
{ "splice_read", offsetof(struct fuse_ll, splice_read), 1},
|
||||
{ "no_splice_read", offsetof(struct fuse_ll, no_splice_read), 1},
|
||||
FUSE_OPT_KEY("max_read=", FUSE_OPT_KEY_DISCARD),
|
||||
FUSE_OPT_KEY("-h", KEY_HELP),
|
||||
FUSE_OPT_KEY("--help", KEY_HELP),
|
||||
FUSE_OPT_KEY("-V", KEY_VERSION),
|
||||
FUSE_OPT_KEY("--version", KEY_VERSION),
|
||||
FUSE_OPT_END
|
||||
};
|
||||
|
||||
static
|
||||
|
@ -2701,9 +2701,9 @@ fuse_ll_receive_buf(struct fuse_session *se,
|
|||
}
|
||||
|
||||
tmpbuf = (struct fuse_buf) {
|
||||
.size = res,
|
||||
.flags = FUSE_BUF_IS_FD,
|
||||
.fd = llp->pipe[0],
|
||||
.size = res,
|
||||
.flags = FUSE_BUF_IS_FD,
|
||||
.fd = llp->pipe[0],
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -2784,8 +2784,8 @@ fuse_lowlevel_new_common(struct fuse_args *args,
|
|||
struct fuse_ll *f;
|
||||
struct fuse_session *se;
|
||||
struct fuse_session_ops sop = {
|
||||
.process = fuse_ll_process,
|
||||
.destroy = fuse_ll_destroy,
|
||||
.process = fuse_ll_process,
|
||||
.destroy = fuse_ll_destroy,
|
||||
};
|
||||
|
||||
if (sizeof(struct fuse_lowlevel_ops) < op_size)
|
||||
|
|
Loading…
Reference in New Issue
Block a user