1*4882a593Smuzhiyun /* SPDX-License-Identifier: MIT */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * VirtualBox Guest Shared Folders support: module header. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2006-2018 Oracle Corporation 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef VFSMOD_H 9*4882a593Smuzhiyun #define VFSMOD_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/backing-dev.h> 12*4882a593Smuzhiyun #include <linux/idr.h> 13*4882a593Smuzhiyun #include "shfl_hostintf.h" 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define DIR_BUFFER_SIZE SZ_16K 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* The cast is to prevent assignment of void * to pointers of arbitrary type */ 18*4882a593Smuzhiyun #define VBOXSF_SBI(sb) ((struct vboxsf_sbi *)(sb)->s_fs_info) 19*4882a593Smuzhiyun #define VBOXSF_I(i) container_of(i, struct vboxsf_inode, vfs_inode) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct vboxsf_handle; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun struct vboxsf_options { 24*4882a593Smuzhiyun unsigned long ttl; 25*4882a593Smuzhiyun kuid_t uid; 26*4882a593Smuzhiyun kgid_t gid; 27*4882a593Smuzhiyun bool dmode_set; 28*4882a593Smuzhiyun bool fmode_set; 29*4882a593Smuzhiyun umode_t dmode; 30*4882a593Smuzhiyun umode_t fmode; 31*4882a593Smuzhiyun umode_t dmask; 32*4882a593Smuzhiyun umode_t fmask; 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct vboxsf_fs_context { 36*4882a593Smuzhiyun struct vboxsf_options o; 37*4882a593Smuzhiyun char *nls_name; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* per-shared folder information */ 41*4882a593Smuzhiyun struct vboxsf_sbi { 42*4882a593Smuzhiyun struct vboxsf_options o; 43*4882a593Smuzhiyun struct shfl_fsobjinfo root_info; 44*4882a593Smuzhiyun struct idr ino_idr; 45*4882a593Smuzhiyun spinlock_t ino_idr_lock; /* This protects ino_idr */ 46*4882a593Smuzhiyun struct nls_table *nls; 47*4882a593Smuzhiyun u32 next_generation; 48*4882a593Smuzhiyun u32 root; 49*4882a593Smuzhiyun int bdi_id; 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* per-inode information */ 53*4882a593Smuzhiyun struct vboxsf_inode { 54*4882a593Smuzhiyun /* some information was changed, update data on next revalidate */ 55*4882a593Smuzhiyun int force_restat; 56*4882a593Smuzhiyun /* list of open handles for this inode + lock protecting it */ 57*4882a593Smuzhiyun struct list_head handle_list; 58*4882a593Smuzhiyun /* This mutex protects handle_list accesses */ 59*4882a593Smuzhiyun struct mutex handle_list_mutex; 60*4882a593Smuzhiyun /* The VFS inode struct */ 61*4882a593Smuzhiyun struct inode vfs_inode; 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct vboxsf_dir_info { 65*4882a593Smuzhiyun struct list_head info_list; 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct vboxsf_dir_buf { 69*4882a593Smuzhiyun size_t entries; 70*4882a593Smuzhiyun size_t free; 71*4882a593Smuzhiyun size_t used; 72*4882a593Smuzhiyun void *buf; 73*4882a593Smuzhiyun struct list_head head; 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* globals */ 77*4882a593Smuzhiyun extern const struct inode_operations vboxsf_dir_iops; 78*4882a593Smuzhiyun extern const struct inode_operations vboxsf_lnk_iops; 79*4882a593Smuzhiyun extern const struct inode_operations vboxsf_reg_iops; 80*4882a593Smuzhiyun extern const struct file_operations vboxsf_dir_fops; 81*4882a593Smuzhiyun extern const struct file_operations vboxsf_reg_fops; 82*4882a593Smuzhiyun extern const struct address_space_operations vboxsf_reg_aops; 83*4882a593Smuzhiyun extern const struct dentry_operations vboxsf_dentry_ops; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* from file.c */ 86*4882a593Smuzhiyun struct vboxsf_handle *vboxsf_create_sf_handle(struct inode *inode, 87*4882a593Smuzhiyun u64 handle, u32 access_flags); 88*4882a593Smuzhiyun void vboxsf_release_sf_handle(struct inode *inode, struct vboxsf_handle *sf_handle); 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* from utils.c */ 91*4882a593Smuzhiyun struct inode *vboxsf_new_inode(struct super_block *sb); 92*4882a593Smuzhiyun void vboxsf_init_inode(struct vboxsf_sbi *sbi, struct inode *inode, 93*4882a593Smuzhiyun const struct shfl_fsobjinfo *info); 94*4882a593Smuzhiyun int vboxsf_create_at_dentry(struct dentry *dentry, 95*4882a593Smuzhiyun struct shfl_createparms *params); 96*4882a593Smuzhiyun int vboxsf_stat(struct vboxsf_sbi *sbi, struct shfl_string *path, 97*4882a593Smuzhiyun struct shfl_fsobjinfo *info); 98*4882a593Smuzhiyun int vboxsf_stat_dentry(struct dentry *dentry, struct shfl_fsobjinfo *info); 99*4882a593Smuzhiyun int vboxsf_inode_revalidate(struct dentry *dentry); 100*4882a593Smuzhiyun int vboxsf_getattr(const struct path *path, struct kstat *kstat, 101*4882a593Smuzhiyun u32 request_mask, unsigned int query_flags); 102*4882a593Smuzhiyun int vboxsf_setattr(struct dentry *dentry, struct iattr *iattr); 103*4882a593Smuzhiyun struct shfl_string *vboxsf_path_from_dentry(struct vboxsf_sbi *sbi, 104*4882a593Smuzhiyun struct dentry *dentry); 105*4882a593Smuzhiyun int vboxsf_nlscpy(struct vboxsf_sbi *sbi, char *name, size_t name_bound_len, 106*4882a593Smuzhiyun const unsigned char *utf8_name, size_t utf8_len); 107*4882a593Smuzhiyun struct vboxsf_dir_info *vboxsf_dir_info_alloc(void); 108*4882a593Smuzhiyun void vboxsf_dir_info_free(struct vboxsf_dir_info *p); 109*4882a593Smuzhiyun int vboxsf_dir_read_all(struct vboxsf_sbi *sbi, struct vboxsf_dir_info *sf_d, 110*4882a593Smuzhiyun u64 handle); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* from vboxsf_wrappers.c */ 113*4882a593Smuzhiyun int vboxsf_connect(void); 114*4882a593Smuzhiyun void vboxsf_disconnect(void); 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun int vboxsf_create(u32 root, struct shfl_string *parsed_path, 117*4882a593Smuzhiyun struct shfl_createparms *create_parms); 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun int vboxsf_close(u32 root, u64 handle); 120*4882a593Smuzhiyun int vboxsf_remove(u32 root, struct shfl_string *parsed_path, u32 flags); 121*4882a593Smuzhiyun int vboxsf_rename(u32 root, struct shfl_string *src_path, 122*4882a593Smuzhiyun struct shfl_string *dest_path, u32 flags); 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun int vboxsf_read(u32 root, u64 handle, u64 offset, u32 *buf_len, u8 *buf); 125*4882a593Smuzhiyun int vboxsf_write(u32 root, u64 handle, u64 offset, u32 *buf_len, u8 *buf); 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun int vboxsf_dirinfo(u32 root, u64 handle, 128*4882a593Smuzhiyun struct shfl_string *parsed_path, u32 flags, u32 index, 129*4882a593Smuzhiyun u32 *buf_len, struct shfl_dirinfo *buf, u32 *file_count); 130*4882a593Smuzhiyun int vboxsf_fsinfo(u32 root, u64 handle, u32 flags, 131*4882a593Smuzhiyun u32 *buf_len, void *buf); 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun int vboxsf_map_folder(struct shfl_string *folder_name, u32 *root); 134*4882a593Smuzhiyun int vboxsf_unmap_folder(u32 root); 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun int vboxsf_readlink(u32 root, struct shfl_string *parsed_path, 137*4882a593Smuzhiyun u32 buf_len, u8 *buf); 138*4882a593Smuzhiyun int vboxsf_symlink(u32 root, struct shfl_string *new_path, 139*4882a593Smuzhiyun struct shfl_string *old_path, struct shfl_fsobjinfo *buf); 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun int vboxsf_set_utf8(void); 142*4882a593Smuzhiyun int vboxsf_set_symlinks(void); 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #endif 145