149 lines
4.4 KiB
C
149 lines
4.4 KiB
C
/* $OpenBSD: fusebuf.h,v 1.13 2018/06/19 11:27:54 helg Exp $ */
|
|
/*
|
|
* Copyright (c) 2013 Sylvestre Gallon
|
|
* Copyright (c) 2013 Martin Pieuchot
|
|
*
|
|
* Permission to use, copy, modify, and 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 _SYS_FUSEBUF_H_
|
|
#define _SYS_FUSEBUF_H_
|
|
|
|
/*
|
|
* Fusebufs are of a single size, 4096 bytes.
|
|
*/
|
|
#define FUSEBUFSIZE (sizeof(struct fusebuf))
|
|
#define FUSEBUFMAXSIZE (4096*1024)
|
|
|
|
/* header at beginning of each fusebuf: */
|
|
struct fb_hdr {
|
|
SIMPLEQ_ENTRY(fusebuf) fh_next; /* next buffer in chain */
|
|
size_t fh_len; /* Amount of data */
|
|
int fh_err; /* errno to pass back */
|
|
int fh_type; /* type of data */
|
|
ino_t fh_ino; /* Inode of this fusebuf */
|
|
uint64_t fh_uuid; /* Uuid to track the answer */
|
|
pid_t fh_tid; /* calling proc thread id */
|
|
uid_t fh_uid; /* calling proc uid */
|
|
gid_t fh_gid; /* calling proc gid */
|
|
mode_t fh_umask; /* calling proc umask */
|
|
};
|
|
|
|
/* header for fuse file operations (like read/write/mkdir): */
|
|
struct fb_io {
|
|
uint64_t fi_fd; /* fd where the io is performed */
|
|
ino_t fi_ino; /* ino for the io */
|
|
off_t fi_off; /* offset for the io */
|
|
size_t fi_len; /* Length of data */
|
|
mode_t fi_mode; /* mode for fd */
|
|
uint32_t fi_flags; /* flags on transfer */
|
|
dev_t fi_rdev; /* dev for mknod */
|
|
};
|
|
|
|
/*
|
|
* An operation is issued by the kernel through fuse(4) when the
|
|
* userland file system needs to execute an action (mkdir(2),
|
|
* link(2), etc).
|
|
*
|
|
* F_databuf can be superior to FUSELEN for fusefs_read, fusefs_writes and
|
|
* fusefs_readdir. If it is the case the transfer will be split in N
|
|
* fusebuf with a changing offset in FD_io.
|
|
*
|
|
* When the userland file system answers to this operation it uses
|
|
* the same ID (fh_uuid).
|
|
*/
|
|
struct fusebuf {
|
|
struct fb_hdr fb_hdr;
|
|
union {
|
|
struct statvfs FD_stat; /* vfs statfs */
|
|
struct stat FD_attr; /* for attr vnops */
|
|
struct fb_io FD_io; /* for file io vnops */
|
|
} FD;
|
|
uint8_t *fb_dat; /* data's */
|
|
};
|
|
|
|
#define fb_next fb_hdr.fh_next
|
|
#define fb_len fb_hdr.fh_len
|
|
#define fb_err fb_hdr.fh_err
|
|
#define fb_type fb_hdr.fh_type
|
|
#define fb_ino fb_hdr.fh_ino
|
|
#define fb_uuid fb_hdr.fh_uuid
|
|
#define fb_tid fb_hdr.fh_tid
|
|
#define fb_uid fb_hdr.fh_uid
|
|
#define fb_gid fb_hdr.fh_gid
|
|
#define fb_umask fb_hdr.fh_umask
|
|
|
|
#define fb_stat FD.FD_stat
|
|
#define fb_attr FD.FD_attr
|
|
#define fb_io_fd FD.FD_io.fi_fd
|
|
#define fb_io_ino FD.FD_io.fi_ino
|
|
#define fb_io_off FD.FD_io.fi_off
|
|
#define fb_io_len FD.FD_io.fi_len
|
|
#define fb_io_mode FD.FD_io.fi_mode
|
|
#define fb_io_flags FD.FD_io.fi_flags
|
|
#define fb_io_rdev FD.FD_io.fi_rdev
|
|
|
|
/*
|
|
* Macros for type conversion
|
|
* fbtod(fb,t) - convert fusebuf pointer to data pointer of correct
|
|
* type
|
|
*/
|
|
#define fbtod(fb,t) ((t)((fb)->fb_dat))
|
|
|
|
/* flags needed by setattr */
|
|
#define FUSE_FATTR_MODE (1 << 0)
|
|
#define FUSE_FATTR_UID (1 << 1)
|
|
#define FUSE_FATTR_GID (1 << 2)
|
|
#define FUSE_FATTR_SIZE (1 << 3)
|
|
#define FUSE_FATTR_ATIME (1 << 4)
|
|
#define FUSE_FATTR_MTIME (1 << 5)
|
|
#define FUSE_FATTR_FH (1 << 6)
|
|
|
|
/* fusebuf types */
|
|
#define FBT_LOOKUP 0
|
|
#define FBT_GETATTR 1
|
|
#define FBT_SETATTR 2
|
|
#define FBT_READLINK 3
|
|
#define FBT_SYMLINK 4
|
|
#define FBT_MKNOD 5
|
|
#define FBT_MKDIR 6
|
|
#define FBT_UNLINK 7
|
|
#define FBT_RMDIR 8
|
|
#define FBT_RENAME 9
|
|
#define FBT_LINK 10
|
|
#define FBT_OPEN 11
|
|
#define FBT_READ 12
|
|
#define FBT_WRITE 13
|
|
#define FBT_STATFS 14
|
|
#define FBT_RELEASE 16
|
|
#define FBT_FSYNC 17
|
|
#define FBT_FLUSH 18
|
|
#define FBT_INIT 19
|
|
#define FBT_OPENDIR 20
|
|
#define FBT_READDIR 21
|
|
#define FBT_RELEASEDIR 22
|
|
#define FBT_FSYNCDIR 23
|
|
#define FBT_ACCESS 24
|
|
#define FBT_DESTROY 26
|
|
#define FBT_RECLAIM 27
|
|
|
|
#ifdef _KERNEL
|
|
|
|
/* fusebuf prototypes */
|
|
struct fusebuf *fb_setup(size_t, ino_t, int, struct proc *);
|
|
int fb_queue(dev_t, struct fusebuf *);
|
|
void fb_delete(struct fusebuf *);
|
|
|
|
#endif /* _KERNEL */
|
|
#endif /* _SYS_FUSEBUF_H_ */
|