root/fs/fuse/args.h
/* SPDX-License-Identifier: GPL-2.0 */

#ifndef _FS_FUSE_ARGS_H
#define _FS_FUSE_ARGS_H

#include <linux/types.h>

struct fuse_mount;

/** One input argument of a request */
struct fuse_in_arg {
        unsigned size;
        const void *value;
};

/** One output argument of a request */
struct fuse_arg {
        unsigned size;
        void *value;
};

struct fuse_args {
        u64 nodeid;
        u32 opcode;
        u32 uid;
        u32 gid;
        u32 pid;
        u8 in_numargs;
        u8 out_numargs;
        u8 ext_idx;
        bool force:1;
        bool noreply:1;
        bool nocreds:1;
        bool in_pages:1;
        bool out_pages:1;
        bool user_pages:1;
        bool out_argvar:1;
        bool page_zeroing:1;
        bool page_replace:1;
        bool may_block:1;
        bool is_ext:1;
        bool is_pinned:1;
        bool invalidate_vmap:1;
        bool abort_on_kill:1;
        struct fuse_in_arg in_args[4];
        struct fuse_arg out_args[2];
        void (*end)(struct fuse_args *args, int error);
        /* Used for kvec iter backed by vmalloc address */
        void *vmap_base;
};

/** FUSE folio descriptor */
struct fuse_folio_desc {
        unsigned int length;
        unsigned int offset;
};

struct fuse_args_pages {
        struct fuse_args args;
        struct folio **folios;
        struct fuse_folio_desc *descs;
        unsigned int num_folios;
};

#endif /* _FS_FUSE_ARGS_H */