Browse Source

fuse_lowlevel.cpp

Antonio SJ Musumeci 1 month ago
parent
commit
34ee3707a5
  1. 2
      libfuse/include/fuse_kernel.h
  2. 3
      libfuse/include/fuse_lowlevel.h
  3. 155
      libfuse/lib/debug.cpp
  4. 0
      libfuse/lib/debug.hpp
  5. 178
      libfuse/lib/fuse_lowlevel.cpp

2
libfuse/include/fuse_kernel.h

@ -442,7 +442,7 @@ struct fuse_file_lock {
#define FUSE_HANDLE_KILLPRIV_V2 (1 << 28) #define FUSE_HANDLE_KILLPRIV_V2 (1 << 28)
#define FUSE_SETXATTR_EXT (1 << 29) #define FUSE_SETXATTR_EXT (1 << 29)
#define FUSE_INIT_EXT (1 << 30) #define FUSE_INIT_EXT (1 << 30)
#define FUSE_INIT_RESERVED (1 << 31) #define FUSE_INIT_RESERVED (1ULL << 31)
/* bits 32..63 get shifted down 32 bits into the flags2 field */ /* bits 32..63 get shifted down 32 bits into the flags2 field */
#define FUSE_SECURITY_CTX (1ULL << 32) #define FUSE_SECURITY_CTX (1ULL << 32)
#define FUSE_HAS_INODE_DAX (1ULL << 33) #define FUSE_HAS_INODE_DAX (1ULL << 33)

3
libfuse/include/fuse_lowlevel.h

@ -151,6 +151,7 @@ struct fuse_lowlevel_ops
void (*link)(fuse_req_t req, struct fuse_in_header *hdr); void (*link)(fuse_req_t req, struct fuse_in_header *hdr);
void (*listxattr)(fuse_req_t req, struct fuse_in_header *hdr); void (*listxattr)(fuse_req_t req, struct fuse_in_header *hdr);
void (*lookup)(fuse_req_t req, struct fuse_in_header *hdr); void (*lookup)(fuse_req_t req, struct fuse_in_header *hdr);
void (*lseek)(fuse_req_t req, struct fuse_in_header *hdr);
void (*mkdir)(fuse_req_t req, struct fuse_in_header *hdr); void (*mkdir)(fuse_req_t req, struct fuse_in_header *hdr);
void (*mknod)(fuse_req_t req, struct fuse_in_header *hdr); void (*mknod)(fuse_req_t req, struct fuse_in_header *hdr);
void (*open)(fuse_req_t req, struct fuse_in_header *hdr); void (*open)(fuse_req_t req, struct fuse_in_header *hdr);
@ -165,6 +166,7 @@ struct fuse_lowlevel_ops
void (*removemapping)(fuse_req_t req, const struct fuse_in_header *hdr); void (*removemapping)(fuse_req_t req, const struct fuse_in_header *hdr);
void (*removexattr)(fuse_req_t req, const struct fuse_in_header *hdr); void (*removexattr)(fuse_req_t req, const struct fuse_in_header *hdr);
void (*rename)(fuse_req_t req, struct fuse_in_header *hdr); void (*rename)(fuse_req_t req, struct fuse_in_header *hdr);
void (*rename2)(fuse_req_t req, struct fuse_in_header *hdr);
void (*retrieve_reply)(fuse_req_t req, void *cookie, uint64_t ino, off_t offset); void (*retrieve_reply)(fuse_req_t req, void *cookie, uint64_t ino, off_t offset);
void (*rmdir)(fuse_req_t req, struct fuse_in_header *hdr); void (*rmdir)(fuse_req_t req, struct fuse_in_header *hdr);
void (*setattr)(fuse_req_t req, struct fuse_in_header *hdr); void (*setattr)(fuse_req_t req, struct fuse_in_header *hdr);
@ -172,6 +174,7 @@ struct fuse_lowlevel_ops
void (*setupmapping)(fuse_req_t req, const struct fuse_in_header *hdr); void (*setupmapping)(fuse_req_t req, const struct fuse_in_header *hdr);
void (*setxattr)(fuse_req_t req, struct fuse_in_header *hdr); void (*setxattr)(fuse_req_t req, struct fuse_in_header *hdr);
void (*statfs)(fuse_req_t req, struct fuse_in_header *hdr); void (*statfs)(fuse_req_t req, struct fuse_in_header *hdr);
void (*statx)(fuse_req_t req, struct fuse_in_header *hdr);
void (*symlink)(fuse_req_t req, struct fuse_in_header *hdr); void (*symlink)(fuse_req_t req, struct fuse_in_header *hdr);
void (*syncfs)(fuse_req_t req, const struct fuse_in_header *hdr); void (*syncfs)(fuse_req_t req, const struct fuse_in_header *hdr);
void (*tmpfile)(fuse_req_t req, const struct fuse_in_header *hdr); void (*tmpfile)(fuse_req_t req, const struct fuse_in_header *hdr);

155
libfuse/lib/debug.c → libfuse/lib/debug.cpp

@ -16,7 +16,9 @@
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE #define _GNU_SOURCE
#endif
#include "fuse_kernel.h" #include "fuse_kernel.h"
@ -211,7 +213,7 @@ void
debug_open_flags(const uint32_t flags_) debug_open_flags(const uint32_t flags_)
{ {
fprintf(stderr,"%s, ",open_accmode_to_str(flags_)); fprintf(stderr,"%s, ",open_accmode_to_str(flags_));
for(int i = 0; i < (sizeof(flags_) * 8); i++) for(size_t i = 0; i < (sizeof(flags_) * 8); i++)
{ {
const char *str; const char *str;
@ -256,7 +258,7 @@ debug_fuse_open_out(const struct fuse_open_out *arg_)
" open_flags=0x%X (", " open_flags=0x%X (",
arg_->fh, arg_->fh,
arg_->open_flags); arg_->open_flags);
for(int i = 0; i < (sizeof(arg_->open_flags) * 8); i++) for(size_t i = 0; i < (sizeof(arg_->open_flags) * 8); i++)
{ {
const char *str; const char *str;
@ -276,7 +278,7 @@ static
void void
debug_fuse_lookup(const void *arg_) debug_fuse_lookup(const void *arg_)
{ {
const char *name = arg_; const char *name = (const char*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_lookup:" "fuse_lookup:"
@ -290,7 +292,7 @@ static
void void
debug_fuse_getattr_in(const void *arg_) debug_fuse_getattr_in(const void *arg_)
{ {
const struct fuse_getattr_in *arg = arg_; const struct fuse_getattr_in *arg = (const fuse_getattr_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_getattr_in:" "fuse_getattr_in:"
@ -304,7 +306,7 @@ static
void void
debug_fuse_setattr_in(const void *arg_) debug_fuse_setattr_in(const void *arg_)
{ {
const struct fuse_setattr_in *arg = arg_; const struct fuse_setattr_in *arg = (const fuse_setattr_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_setattr_in:" "fuse_setattr_in:"
@ -342,7 +344,7 @@ static
void void
debug_fuse_access_in(const void *arg_) debug_fuse_access_in(const void *arg_)
{ {
const struct fuse_access_in *arg = arg_; const struct fuse_access_in *arg = (const fuse_access_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_access_in:" "fuse_access_in:"
@ -356,7 +358,7 @@ static
void void
debug_fuse_mknod_in(const void *arg_) debug_fuse_mknod_in(const void *arg_)
{ {
const struct fuse_mknod_in *arg = arg_; const struct fuse_mknod_in *arg = (const fuse_mknod_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_mknod_in:" "fuse_mknod_in:"
@ -374,7 +376,7 @@ static
void void
debug_fuse_mkdir_in(const void *arg_) debug_fuse_mkdir_in(const void *arg_)
{ {
const struct fuse_mkdir_in *arg = arg_; const struct fuse_mkdir_in *arg = (const fuse_mkdir_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_mkdir_in:" "fuse_mkdir_in:"
@ -392,7 +394,7 @@ static
void void
debug_fuse_unlink(const void *arg_) debug_fuse_unlink(const void *arg_)
{ {
const char *name = arg_; const char *name = (const char*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_unlink:" "fuse_unlink:"
@ -406,7 +408,7 @@ static
void void
debug_fuse_rmdir(const void *arg_) debug_fuse_rmdir(const void *arg_)
{ {
const char *name = arg_; const char *name = (const char*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_mkdir:" "fuse_mkdir:"
@ -423,7 +425,7 @@ debug_fuse_symlink(const void *arg_)
const char *name; const char *name;
const char *linkname; const char *linkname;
name = arg_; name = (const char*)arg_;
linkname = (name + (strlen(name) + 1)); linkname = (name + (strlen(name) + 1));
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
@ -442,7 +444,7 @@ debug_fuse_rename_in(const void *arg_)
{ {
const char *oldname; const char *oldname;
const char *newname; const char *newname;
const struct fuse_rename_in *arg = arg_; const struct fuse_rename_in *arg = (const fuse_rename_in*)arg_;
oldname = PARAM(arg); oldname = PARAM(arg);
newname = (oldname + strlen(oldname) + 1); newname = (oldname + strlen(oldname) + 1);
@ -464,7 +466,7 @@ void
debug_fuse_link_in(const void *arg_) debug_fuse_link_in(const void *arg_)
{ {
const char *name; const char *name;
const struct fuse_link_in *arg = arg_; const struct fuse_link_in *arg = (const fuse_link_in*)arg_;
name = PARAM(arg); name = PARAM(arg);
@ -483,7 +485,7 @@ void
debug_fuse_create_in(const void *arg_) debug_fuse_create_in(const void *arg_)
{ {
const char *name; const char *name;
const struct fuse_create_in *arg = arg_; const struct fuse_create_in *arg = (const fuse_create_in*)arg_;
name = PARAM(arg); name = PARAM(arg);
@ -505,7 +507,7 @@ static
void void
debug_fuse_open_in(const void *arg_) debug_fuse_open_in(const void *arg_)
{ {
const struct fuse_open_in *arg = arg_; const struct fuse_open_in *arg = (const fuse_open_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_open_in:" "fuse_open_in:"
@ -519,7 +521,7 @@ static
void void
debug_fuse_read_in(const void *arg_) debug_fuse_read_in(const void *arg_)
{ {
const struct fuse_read_in *arg = arg_; const struct fuse_read_in *arg = (const fuse_read_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_read_in:" "fuse_read_in:"
@ -544,7 +546,7 @@ static
void void
debug_fuse_write_in(const void *arg_) debug_fuse_write_in(const void *arg_)
{ {
const struct fuse_write_in *arg = arg_; const struct fuse_write_in *arg = (const fuse_write_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_write_in:" "fuse_write_in:"
@ -563,7 +565,7 @@ debug_fuse_write_in(const void *arg_)
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"); write_flags=0x%X (", "); write_flags=0x%X (",
arg->write_flags); arg->write_flags);
for(int i = 0; i < (sizeof(arg->write_flags) * 8); i++) for(size_t i = 0; i < (sizeof(arg->write_flags) * 8); i++)
{ {
const char *str; const char *str;
@ -583,7 +585,7 @@ static
void void
debug_fuse_flush_in(const void *arg_) debug_fuse_flush_in(const void *arg_)
{ {
const struct fuse_flush_in *arg = arg_; const struct fuse_flush_in *arg = (const fuse_flush_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_flush_in:" "fuse_flush_in:"
@ -599,7 +601,7 @@ static
void void
debug_fuse_release_in(const void *arg_) debug_fuse_release_in(const void *arg_)
{ {
const struct fuse_release_in *arg = arg_; const struct fuse_release_in *arg = (const fuse_release_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_release_in:" "fuse_release_in:"
@ -620,7 +622,7 @@ static
void void
debug_fuse_fsync_in(const void *arg_) debug_fuse_fsync_in(const void *arg_)
{ {
const struct fuse_fsync_in *arg = arg_; const struct fuse_fsync_in *arg = (const fuse_fsync_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_fsync_in:" "fuse_fsync_in:"
@ -638,7 +640,7 @@ debug_fuse_setxattr_in(const void *arg_)
{ {
const char *name; const char *name;
const char *value; const char *value;
const struct fuse_setxattr_in *arg = arg_; const struct fuse_setxattr_in *arg = (const fuse_setxattr_in*)arg_;
name = PARAM(arg); name = PARAM(arg);
value = (name + strlen(name) + 1); value = (name + strlen(name) + 1);
@ -662,7 +664,7 @@ void
debug_fuse_getxattr_in(const void *arg_) debug_fuse_getxattr_in(const void *arg_)
{ {
const char *name; const char *name;
const struct fuse_getxattr_in *arg = arg_; const struct fuse_getxattr_in *arg = (const fuse_getxattr_in*)arg_;
name = PARAM(arg); name = PARAM(arg);
@ -680,7 +682,7 @@ static
void void
debug_fuse_listxattr(const void *arg_) debug_fuse_listxattr(const void *arg_)
{ {
const struct fuse_getxattr_in *arg = arg_; const struct fuse_getxattr_in *arg = (const fuse_getxattr_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_listxattr:" "fuse_listxattr:"
@ -694,7 +696,7 @@ static
void void
debug_fuse_removexattr(const void *arg_) debug_fuse_removexattr(const void *arg_)
{ {
const char *name = arg_; const char *name = (const char*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_removexattr:" "fuse_removexattr:"
@ -708,7 +710,7 @@ static
void void
debug_fuse_fallocate_in(const void *arg_) debug_fuse_fallocate_in(const void *arg_)
{ {
const struct fuse_fallocate_in *arg = arg_; const struct fuse_fallocate_in *arg = (const fuse_fallocate_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_fallocate_in:" "fuse_fallocate_in:"
@ -945,7 +947,7 @@ static
void void
debug_fuse_interrupt_in(const void *arg_) debug_fuse_interrupt_in(const void *arg_)
{ {
const struct fuse_interrupt_in *arg = arg_; const struct fuse_interrupt_in *arg = (const fuse_interrupt_in*)arg_;
fprintf(g_OUTPUT, fprintf(g_OUTPUT,
"fuse_interrupt_in:" "fuse_interrupt_in:"
@ -962,53 +964,54 @@ opcode_name(enum fuse_opcode op_)
{ {
static const char *names[] = static const char *names[] =
{ {
[FUSE_LOOKUP] = "LOOKUP", "INVALID",
[FUSE_FORGET] = "FORGET", "LOOKUP",
[FUSE_GETATTR] = "GETATTR", "FORGET",
[FUSE_SETATTR] = "SETATTR", "GETATTR",
[FUSE_READLINK] = "READLINK", "SETATTR",
[FUSE_SYMLINK] = "SYMLINK", "READLINK",
[FUSE_MKNOD] = "MKNOD", "SYMLINK",
[FUSE_MKDIR] = "MKDIR", "MKNOD",
[FUSE_UNLINK] = "UNLINK", "MKDIR",
[FUSE_RMDIR] = "RMDIR", "UNLINK",
[FUSE_RENAME] = "RENAME", "RMDIR",
[FUSE_LINK] = "LINK", "RENAME",
[FUSE_OPEN] = "OPEN", "LINK",
[FUSE_READ] = "READ", "OPEN",
[FUSE_WRITE] = "WRITE", "READ",
[FUSE_STATFS] = "STATFS", "WRITE",
[FUSE_RELEASE] = "RELEASE", "STATFS",
[FUSE_FSYNC] = "FSYNC", "RELEASE",
[FUSE_SETXATTR] = "SETXATTR", "FSYNC",
[FUSE_GETXATTR] = "GETXATTR", "SETXATTR",
[FUSE_LISTXATTR] = "LISTXATTR", "GETXATTR",
[FUSE_REMOVEXATTR] = "REMOVEXATTR", "LISTXATTR",
[FUSE_FLUSH] = "FLUSH", "REMOVEXATTR",
[FUSE_INIT] = "INIT", "FLUSH",
[FUSE_OPENDIR] = "OPENDIR", "INIT",
[FUSE_READDIR] = "READDIR", "OPENDIR",
[FUSE_RELEASEDIR] = "RELEASEDIR", "READDIR",
[FUSE_FSYNCDIR] = "FSYNCDIR", "RELEASEDIR",
[FUSE_GETLK] = "GETLK", "FSYNCDIR",
[FUSE_SETLK] = "SETLK", "GETLK",
[FUSE_SETLKW] = "SETLKW", "SETLK",
[FUSE_ACCESS] = "ACCESS", "SETLKW",
[FUSE_CREATE] = "CREATE", "ACCESS",
[FUSE_INTERRUPT] = "INTERRUPT", "CREATE",
[FUSE_BMAP] = "BMAP", "INTERRUPT",
[FUSE_DESTROY] = "DESTROY", "BMAP",
[FUSE_IOCTL] = "IOCTL", "DESTROY",
[FUSE_POLL] = "POLL", "IOCTL",
[FUSE_NOTIFY_REPLY] = "NOTIFY_REPLY", "POLL",
[FUSE_BATCH_FORGET] = "BATCH_FORGET", "NOTIFY_REPLY",
[FUSE_FALLOCATE] = "FALLOCATE", "BATCH_FORGET",
[FUSE_READDIRPLUS] = "READDIRPLUS", "FALLOCATE",
[FUSE_RENAME2] = "RENAME2", "READDIRPLUS",
[FUSE_LSEEK] = "LSEEK", "RENAME2",
[FUSE_COPY_FILE_RANGE] = "COPY_FILE_RANGE", "LSEEK",
[FUSE_SETUPMAPPING] = "SETUPMAPPING", "COPY_FILE_RANGE",
[FUSE_REMOVEMAPPING] = "REMOVEMAPPING" "SETUPMAPPING",
"REMOVEMAPPING"
}; };
if(op_ >= (sizeof(names) / sizeof(names[0]))) if(op_ >= (sizeof(names) / sizeof(names[0])))
@ -1030,7 +1033,7 @@ debug_fuse_in_header(const struct fuse_in_header *hdr_)
" gid=%u;" " gid=%u;"
" pid=%u; || ", " pid=%u; || ",
hdr_->unique, hdr_->unique,
opcode_name(hdr_->opcode), opcode_name((fuse_opcode)hdr_->opcode),
hdr_->opcode, hdr_->opcode,
hdr_->nodeid, hdr_->nodeid,
hdr_->uid, hdr_->uid,
@ -1043,7 +1046,7 @@ debug_fuse_in_header(const struct fuse_in_header *hdr_)
debug_fuse_lookup(arg); debug_fuse_lookup(arg);
break; break;
case FUSE_INIT: case FUSE_INIT:
debug_fuse_init_in(arg); debug_fuse_init_in((const fuse_init_in*)arg);
break; break;
case FUSE_GETATTR: case FUSE_GETATTR:
debug_fuse_getattr_in(arg); debug_fuse_getattr_in(arg);

0
libfuse/lib/debug.h → libfuse/lib/debug.hpp

178
libfuse/lib/fuse_lowlevel.c → libfuse/lib/fuse_lowlevel.cpp

@ -6,12 +6,14 @@
See the file COPYING.LIB See the file COPYING.LIB
*/ */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE #define _GNU_SOURCE
#endif
#include "lfmp.h" #include "lfmp.h"
#include "config.h" #include "config.h"
#include "debug.h" #include "debug.hpp"
#include "fuse_i.h" #include "fuse_i.h"
#include "fuse_kernel.h" #include "fuse_kernel.h"
#include "fuse_opt.h" #include "fuse_opt.h"
@ -41,7 +43,7 @@
#define OFFSET_MAX 0x7fffffffffffffffLL #define OFFSET_MAX 0x7fffffffffffffffLL
#define container_of(ptr, type, member) ({ \ #define container_of(ptr, type, member) ({ \
const typeof( ((type*)0)->member ) *__mptr = (ptr); \ const decltype( ((type*)0)->member ) *__mptr = (ptr); \
(type *)( (char*)__mptr - offsetof(type,member) );}) (type *)( (char*)__mptr - offsetof(type,member) );})
static size_t pagesize; static size_t pagesize;
@ -135,7 +137,7 @@ fuse_send_msg(struct fuse_ll *f,
int count) int count)
{ {
int rv; int rv;
struct fuse_out_header *out = iov[0].iov_base; struct fuse_out_header *out = (fuse_out_header*)iov[0].iov_base;
out->len = iov_length(iov, count); out->len = iov_length(iov, count);
@ -410,7 +412,7 @@ fuse_send_data_iov_fallback(struct fuse_ll *f,
return -ENOMEM; return -ENOMEM;
mem_buf.buf[0].mem = msgbuf->mem; mem_buf.buf[0].mem = msgbuf->mem;
res = fuse_buf_copy(&mem_buf, buf, 0); res = fuse_buf_copy(&mem_buf, buf, (fuse_buf_copy_flags)0);
if(res < 0) if(res < 0)
{ {
msgbuf_free(msgbuf); msgbuf_free(msgbuf);
@ -550,7 +552,7 @@ fuse_ioctl_iovec_copy(const struct iovec *iov,
struct fuse_ioctl_iovec *fiov; struct fuse_ioctl_iovec *fiov;
size_t i; size_t i;
fiov = malloc(sizeof(fiov[0]) * count); fiov = (fuse_ioctl_iovec*)malloc(sizeof(fiov[0]) * count);
if(!fiov) if(!fiov)
return NULL; return NULL;
@ -683,7 +685,7 @@ fuse_reply_ioctl_iov(fuse_req_t req,
struct fuse_ioctl_out arg = {0}; struct fuse_ioctl_out arg = {0};
int res; int res;
padded_iov = malloc((count + 2) * sizeof(struct iovec)); padded_iov = (iovec*)malloc((count + 2) * sizeof(struct iovec));
if(padded_iov == NULL) if(padded_iov == NULL)
return fuse_reply_err(req, ENOMEM); return fuse_reply_err(req, ENOMEM);
@ -896,7 +898,7 @@ do_readdir(fuse_req_t req,
static static
void void
do_readdir_plus(fuse_req_t req_, do_readdirplus(fuse_req_t req_,
struct fuse_in_header *hdr_) struct fuse_in_header *hdr_)
{ {
req_->f->op.readdir_plus(req_,hdr_); req_->f->op.readdir_plus(req_,hdr_);
@ -1403,6 +1405,33 @@ do_tmpfile(fuse_req_t req_,
req_->f->op.tmpfile(req_,hdr_); req_->f->op.tmpfile(req_,hdr_);
} }
static
void
do_statx(fuse_req_t req_,
struct fuse_in_header *hdr_)
{
printf("statx\n");
req_->f->op.statx(req_,hdr_);
}
static
void
do_rename2(fuse_req_t req_,
struct fuse_in_header *hdr_)
{
printf("rename2\n");
req_->f->op.rename2(req_,hdr_);
}
static
void
do_lseek(fuse_req_t req_,
struct fuse_in_header *hdr_)
{
printf("lseek\n");
req_->f->op.lseek(req_,hdr_);
}
static static
int int
send_notify_iov(struct fuse_ll *f, send_notify_iov(struct fuse_ll *f,
@ -1624,7 +1653,7 @@ fuse_lowlevel_notify_retrieve(struct fuse_chan *ch,
if(f->conn.proto_minor < 15) if(f->conn.proto_minor < 15)
return -ENOSYS; return -ENOSYS;
rreq = malloc(sizeof(*rreq)); rreq = (fuse_retrieve_req*)malloc(sizeof(*rreq));
if(rreq == NULL) if(rreq == NULL)
return -ENOMEM; return -ENOMEM;
@ -1668,61 +1697,66 @@ fuse_req_ctx(fuse_req_t req)
return &req->ctx; return &req->ctx;
} }
static struct { typedef void (*fuse_ll_func)(fuse_req_t, struct fuse_in_header *);
void (*func)(fuse_req_t, struct fuse_in_header *); const
const char *name; fuse_ll_func
} fuse_ll_ops[] = fuse_ll_funcs[] =
{ {
[FUSE_LOOKUP] = { do_lookup, "LOOKUP" }, NULL,
[FUSE_FORGET] = { do_forget, "FORGET" }, do_lookup,
[FUSE_GETATTR] = { do_getattr, "GETATTR" }, do_forget,
[FUSE_SETATTR] = { do_setattr, "SETATTR" }, do_getattr,
[FUSE_READLINK] = { do_readlink, "READLINK" }, do_setattr,
[FUSE_SYMLINK] = { do_symlink, "SYMLINK" }, do_readlink,
[FUSE_MKNOD] = { do_mknod, "MKNOD" }, do_symlink,
[FUSE_MKDIR] = { do_mkdir, "MKDIR" }, do_mknod,
[FUSE_UNLINK] = { do_unlink, "UNLINK" }, do_mkdir,
[FUSE_RMDIR] = { do_rmdir, "RMDIR" }, do_unlink,
[FUSE_RENAME] = { do_rename, "RENAME" }, do_rmdir,
[FUSE_LINK] = { do_link, "LINK" }, do_rename,
[FUSE_OPEN] = { do_open, "OPEN" }, do_link,
[FUSE_READ] = { do_read, "READ" }, do_open,
[FUSE_WRITE] = { do_write, "WRITE" }, do_read,
[FUSE_STATFS] = { do_statfs, "STATFS" }, do_write,
[FUSE_RELEASE] = { do_release, "RELEASE" }, do_statfs,
[FUSE_FSYNC] = { do_fsync, "FSYNC" }, do_release,
[FUSE_SETXATTR] = { do_setxattr, "SETXATTR" }, do_fsync,
[FUSE_GETXATTR] = { do_getxattr, "GETXATTR" }, do_setxattr,
[FUSE_LISTXATTR] = { do_listxattr, "LISTXATTR" }, do_getxattr,
[FUSE_REMOVEXATTR] = { do_removexattr, "REMOVEXATTR" }, do_listxattr,
[FUSE_FLUSH] = { do_flush, "FLUSH" }, do_removexattr,
[FUSE_INIT] = { do_init, "INIT" }, do_flush,
[FUSE_OPENDIR] = { do_opendir, "OPENDIR" }, do_init,
[FUSE_READDIR] = { do_readdir, "READDIR" }, do_opendir,
[FUSE_READDIRPLUS] = { do_readdir_plus, "READDIR_PLUS" }, do_readdir,
[FUSE_RELEASEDIR] = { do_releasedir, "RELEASEDIR" }, do_releasedir,
[FUSE_FSYNCDIR] = { do_fsyncdir, "FSYNCDIR" }, do_fsyncdir,
[FUSE_GETLK] = { do_getlk, "GETLK" }, do_getlk,
[FUSE_SETLK] = { do_setlk, "SETLK" }, do_setlk,
[FUSE_SETLKW] = { do_setlkw, "SETLKW" }, do_setlkw,
[FUSE_ACCESS] = { do_access, "ACCESS" }, do_access,
[FUSE_CREATE] = { do_create, "CREATE" }, do_create,
[FUSE_INTERRUPT] = { do_interrupt, "INTERRUPT" }, do_interrupt,
[FUSE_BMAP] = { do_bmap, "BMAP" }, do_bmap,
[FUSE_IOCTL] = { do_ioctl, "IOCTL" }, do_destroy,
[FUSE_POLL] = { do_poll, "POLL" }, do_ioctl,
[FUSE_FALLOCATE] = { do_fallocate, "FALLOCATE" }, do_poll,
[FUSE_DESTROY] = { do_destroy, "DESTROY" }, do_notify_reply,
[FUSE_NOTIFY_REPLY] = { do_notify_reply, "NOTIFY_REPLY" }, do_batch_forget,
[FUSE_BATCH_FORGET] = { do_batch_forget, "BATCH_FORGET" }, do_fallocate,
[FUSE_COPY_FILE_RANGE] = { do_copy_file_range, "COPY_FILE_RANGE" }, do_readdirplus,
[FUSE_SETUPMAPPING] = { do_setupmapping, "SETUPMAPPING" }, do_rename2,
[FUSE_REMOVEMAPPING] = { do_removemapping, "REMOVEMAPPING" }, do_lseek,
[FUSE_SYNCFS] = { do_syncfs, "SYNCFS" }, do_copy_file_range,
[FUSE_TMPFILE] = { do_tmpfile, "TMPFILE" } do_setupmapping,
do_removemapping,
do_syncfs,
do_tmpfile,
do_statx
}; };
#define FUSE_MAXOP (sizeof(fuse_ll_ops) / sizeof(fuse_ll_ops[0])) #define FUSE_MAXOPS (sizeof(fuse_ll_funcs) / sizeof(fuse_ll_funcs[0]))
enum { enum {
KEY_HELP, KEY_HELP,
@ -1816,7 +1850,7 @@ fuse_ll_destroy(void *data)
f->op.destroy(f->userdata); f->op.destroy(f->userdata);
} }
llp = pthread_getspecific(f->pipe_key); llp = (fuse_ll_pipe*)pthread_getspecific(f->pipe_key);
if(llp != NULL) if(llp != NULL)
fuse_ll_pipe_free(llp); fuse_ll_pipe_free(llp);
pthread_key_delete(f->pipe_key); pthread_key_delete(f->pipe_key);
@ -1830,7 +1864,7 @@ static
void void
fuse_ll_pipe_destructor(void *data) fuse_ll_pipe_destructor(void *data)
{ {
struct fuse_ll_pipe *llp = data; struct fuse_ll_pipe *llp = (fuse_ll_pipe*)data;
fuse_ll_pipe_free(llp); fuse_ll_pipe_free(llp);
} }
@ -1872,7 +1906,7 @@ fuse_ll_buf_receive_read(struct fuse_session *se_,
if(rv == -1) if(rv == -1)
return -errno; return -errno;
if(rv < sizeof(struct fuse_in_header)) if(rv < (int)sizeof(struct fuse_in_header))
{ {
fprintf(stderr, "short read from fuse device\n"); fprintf(stderr, "short read from fuse device\n");
return -EIO; return -EIO;
@ -1905,12 +1939,12 @@ fuse_ll_buf_process_read(struct fuse_session *se_,
req->ch = se_->ch; req->ch = se_->ch;
err = ENOSYS; err = ENOSYS;
if(in->opcode >= FUSE_MAXOP) if(in->opcode >= FUSE_MAXOPS)
goto reply_err; goto reply_err;
if(fuse_ll_ops[in->opcode].func == NULL) if(fuse_ll_funcs[in->opcode] == NULL)
goto reply_err; goto reply_err;
fuse_ll_ops[in->opcode].func(req, in); fuse_ll_funcs[in->opcode](req, in);
return; return;
@ -1943,12 +1977,12 @@ fuse_ll_buf_process_read_init(struct fuse_session *se_,
err = EIO; err = EIO;
if(in->opcode != FUSE_INIT) if(in->opcode != FUSE_INIT)
goto reply_err; goto reply_err;
if(fuse_ll_ops[in->opcode].func == NULL) if(fuse_ll_funcs[in->opcode] == NULL)
goto reply_err; goto reply_err;
se_->process_buf = fuse_ll_buf_process_read; se_->process_buf = fuse_ll_buf_process_read;
fuse_ll_ops[in->opcode].func(req, in); fuse_ll_funcs[in->opcode](req, in);
return; return;
@ -2007,9 +2041,9 @@ fuse_lowlevel_new_common(struct fuse_args *args,
f->userdata = userdata; f->userdata = userdata;
se = fuse_session_new(f, se = fuse_session_new(f,
fuse_ll_buf_receive_read, (void*)fuse_ll_buf_receive_read,
fuse_ll_buf_process_read_init, (void*)fuse_ll_buf_process_read_init,
fuse_ll_destroy); (void*)fuse_ll_destroy);
if(!se) if(!se)
goto out_key_destroy; goto out_key_destroy;
|||||||
100:0
Loading…
Cancel
Save