From e2abcdca396661cbe0ae2ddb13d5c2b85682c13a Mon Sep 17 00:00:00 2001 From: Cem Keylan Date: Fri, 16 Oct 2020 17:41:25 +0300 Subject: initial commit --- sys/sys/fusebuf.h | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 sys/sys/fusebuf.h (limited to 'sys/sys/fusebuf.h') diff --git a/sys/sys/fusebuf.h b/sys/sys/fusebuf.h new file mode 100644 index 0000000..8706605 --- /dev/null +++ b/sys/sys/fusebuf.h @@ -0,0 +1,148 @@ +/* $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_ */ -- cgit v1.2.3