aboutsummaryrefslogtreecommitdiff
path: root/tools/virtiofsd/fuse_i.h
blob: 1126723d18561c3d552bbf59c7b7f207030e908c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
 * FUSE: Filesystem in Userspace
 * Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>
 *
 * This program can be distributed under the terms of the GNU LGPLv2.
 * See the file COPYING.LIB
 */

#ifndef FUSE_I_H
#define FUSE_I_H

#define FUSE_USE_VERSION 31
#include "fuse.h"
#include "fuse_lowlevel.h"

struct fv_VuDev;
struct fv_QueueInfo;

struct fuse_req {
    struct fuse_session *se;
    uint64_t unique;
    int ctr;
    pthread_mutex_t lock;
    struct fuse_ctx ctx;
    struct fuse_chan *ch;
    int interrupted;
    unsigned int ioctl_64bit:1;
    union {
        struct {
            uint64_t unique;
        } i;
        struct {
            fuse_interrupt_func_t func;
            void *data;
        } ni;
    } u;
    struct fuse_req *next;
    struct fuse_req *prev;
};

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 *);
    struct fuse_notify_req *next;
    struct fuse_notify_req *prev;
};

struct fuse_session {
    char *mountpoint;
    volatile int exited;
    int fd;
    int debug;
    int deny_others;
    struct fuse_lowlevel_ops op;
    int got_init;
    struct cuse_data *cuse_data;
    void *userdata;
    uid_t owner;
    struct fuse_conn_info conn;
    struct fuse_req list;
    struct fuse_req interrupts;
    pthread_mutex_t lock;
    int got_destroy;
    int broken_splice_nonblock;
    uint64_t notify_ctr;
    struct fuse_notify_req notify_list;
    size_t bufsize;
    int error;
    char *vu_socket_path;
    int   vu_socketfd;
    struct fv_VuDev *virtio_dev;
};

struct fuse_chan {
    pthread_mutex_t lock;
    int ctr;
    int fd;
    struct fv_QueueInfo *qi;
};

/**
 * Filesystem module
 *
 * Filesystem modules are registered with the FUSE_REGISTER_MODULE()
 * macro.
 *
 */
struct fuse_module {
    char *name;
    fuse_module_factory_t factory;
    struct fuse_module *next;
    struct fusemod_so *so;
    int ctr;
};

int fuse_send_reply_iov_nofree(fuse_req_t req, int error, struct iovec *iov,
                               int count);
void fuse_free_req(fuse_req_t req);

void fuse_session_process_buf_int(struct fuse_session *se,
                                  const struct fuse_buf *buf,
                                  struct fuse_chan *ch);


#define FUSE_MAX_MAX_PAGES 256
#define FUSE_DEFAULT_MAX_PAGES_PER_REQ 32

/* room needed in buffer to accommodate header */
#define FUSE_BUFFER_HEADER_SIZE 0x1000

#endif