18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: MIT */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * VirtualBox Guest Shared Folders support: module header. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2006-2018 Oracle Corporation 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef VFSMOD_H 98c2ecf20Sopenharmony_ci#define VFSMOD_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/backing-dev.h> 128c2ecf20Sopenharmony_ci#include <linux/idr.h> 138c2ecf20Sopenharmony_ci#include "shfl_hostintf.h" 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define DIR_BUFFER_SIZE SZ_16K 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci/* The cast is to prevent assignment of void * to pointers of arbitrary type */ 188c2ecf20Sopenharmony_ci#define VBOXSF_SBI(sb) ((struct vboxsf_sbi *)(sb)->s_fs_info) 198c2ecf20Sopenharmony_ci#define VBOXSF_I(i) container_of(i, struct vboxsf_inode, vfs_inode) 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistruct vboxsf_handle; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistruct vboxsf_options { 248c2ecf20Sopenharmony_ci unsigned long ttl; 258c2ecf20Sopenharmony_ci kuid_t uid; 268c2ecf20Sopenharmony_ci kgid_t gid; 278c2ecf20Sopenharmony_ci bool dmode_set; 288c2ecf20Sopenharmony_ci bool fmode_set; 298c2ecf20Sopenharmony_ci umode_t dmode; 308c2ecf20Sopenharmony_ci umode_t fmode; 318c2ecf20Sopenharmony_ci umode_t dmask; 328c2ecf20Sopenharmony_ci umode_t fmask; 338c2ecf20Sopenharmony_ci}; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistruct vboxsf_fs_context { 368c2ecf20Sopenharmony_ci struct vboxsf_options o; 378c2ecf20Sopenharmony_ci char *nls_name; 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci/* per-shared folder information */ 418c2ecf20Sopenharmony_cistruct vboxsf_sbi { 428c2ecf20Sopenharmony_ci struct vboxsf_options o; 438c2ecf20Sopenharmony_ci struct shfl_fsobjinfo root_info; 448c2ecf20Sopenharmony_ci struct idr ino_idr; 458c2ecf20Sopenharmony_ci spinlock_t ino_idr_lock; /* This protects ino_idr */ 468c2ecf20Sopenharmony_ci struct nls_table *nls; 478c2ecf20Sopenharmony_ci u32 next_generation; 488c2ecf20Sopenharmony_ci u32 root; 498c2ecf20Sopenharmony_ci int bdi_id; 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci/* per-inode information */ 538c2ecf20Sopenharmony_cistruct vboxsf_inode { 548c2ecf20Sopenharmony_ci /* some information was changed, update data on next revalidate */ 558c2ecf20Sopenharmony_ci int force_restat; 568c2ecf20Sopenharmony_ci /* list of open handles for this inode + lock protecting it */ 578c2ecf20Sopenharmony_ci struct list_head handle_list; 588c2ecf20Sopenharmony_ci /* This mutex protects handle_list accesses */ 598c2ecf20Sopenharmony_ci struct mutex handle_list_mutex; 608c2ecf20Sopenharmony_ci /* The VFS inode struct */ 618c2ecf20Sopenharmony_ci struct inode vfs_inode; 628c2ecf20Sopenharmony_ci}; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cistruct vboxsf_dir_info { 658c2ecf20Sopenharmony_ci struct list_head info_list; 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistruct vboxsf_dir_buf { 698c2ecf20Sopenharmony_ci size_t entries; 708c2ecf20Sopenharmony_ci size_t free; 718c2ecf20Sopenharmony_ci size_t used; 728c2ecf20Sopenharmony_ci void *buf; 738c2ecf20Sopenharmony_ci struct list_head head; 748c2ecf20Sopenharmony_ci}; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/* globals */ 778c2ecf20Sopenharmony_ciextern const struct inode_operations vboxsf_dir_iops; 788c2ecf20Sopenharmony_ciextern const struct inode_operations vboxsf_lnk_iops; 798c2ecf20Sopenharmony_ciextern const struct inode_operations vboxsf_reg_iops; 808c2ecf20Sopenharmony_ciextern const struct file_operations vboxsf_dir_fops; 818c2ecf20Sopenharmony_ciextern const struct file_operations vboxsf_reg_fops; 828c2ecf20Sopenharmony_ciextern const struct address_space_operations vboxsf_reg_aops; 838c2ecf20Sopenharmony_ciextern const struct dentry_operations vboxsf_dentry_ops; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci/* from file.c */ 868c2ecf20Sopenharmony_cistruct vboxsf_handle *vboxsf_create_sf_handle(struct inode *inode, 878c2ecf20Sopenharmony_ci u64 handle, u32 access_flags); 888c2ecf20Sopenharmony_civoid vboxsf_release_sf_handle(struct inode *inode, struct vboxsf_handle *sf_handle); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci/* from utils.c */ 918c2ecf20Sopenharmony_cistruct inode *vboxsf_new_inode(struct super_block *sb); 928c2ecf20Sopenharmony_civoid vboxsf_init_inode(struct vboxsf_sbi *sbi, struct inode *inode, 938c2ecf20Sopenharmony_ci const struct shfl_fsobjinfo *info); 948c2ecf20Sopenharmony_ciint vboxsf_create_at_dentry(struct dentry *dentry, 958c2ecf20Sopenharmony_ci struct shfl_createparms *params); 968c2ecf20Sopenharmony_ciint vboxsf_stat(struct vboxsf_sbi *sbi, struct shfl_string *path, 978c2ecf20Sopenharmony_ci struct shfl_fsobjinfo *info); 988c2ecf20Sopenharmony_ciint vboxsf_stat_dentry(struct dentry *dentry, struct shfl_fsobjinfo *info); 998c2ecf20Sopenharmony_ciint vboxsf_inode_revalidate(struct dentry *dentry); 1008c2ecf20Sopenharmony_ciint vboxsf_getattr(const struct path *path, struct kstat *kstat, 1018c2ecf20Sopenharmony_ci u32 request_mask, unsigned int query_flags); 1028c2ecf20Sopenharmony_ciint vboxsf_setattr(struct dentry *dentry, struct iattr *iattr); 1038c2ecf20Sopenharmony_cistruct shfl_string *vboxsf_path_from_dentry(struct vboxsf_sbi *sbi, 1048c2ecf20Sopenharmony_ci struct dentry *dentry); 1058c2ecf20Sopenharmony_ciint vboxsf_nlscpy(struct vboxsf_sbi *sbi, char *name, size_t name_bound_len, 1068c2ecf20Sopenharmony_ci const unsigned char *utf8_name, size_t utf8_len); 1078c2ecf20Sopenharmony_cistruct vboxsf_dir_info *vboxsf_dir_info_alloc(void); 1088c2ecf20Sopenharmony_civoid vboxsf_dir_info_free(struct vboxsf_dir_info *p); 1098c2ecf20Sopenharmony_ciint vboxsf_dir_read_all(struct vboxsf_sbi *sbi, struct vboxsf_dir_info *sf_d, 1108c2ecf20Sopenharmony_ci u64 handle); 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci/* from vboxsf_wrappers.c */ 1138c2ecf20Sopenharmony_ciint vboxsf_connect(void); 1148c2ecf20Sopenharmony_civoid vboxsf_disconnect(void); 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ciint vboxsf_create(u32 root, struct shfl_string *parsed_path, 1178c2ecf20Sopenharmony_ci struct shfl_createparms *create_parms); 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ciint vboxsf_close(u32 root, u64 handle); 1208c2ecf20Sopenharmony_ciint vboxsf_remove(u32 root, struct shfl_string *parsed_path, u32 flags); 1218c2ecf20Sopenharmony_ciint vboxsf_rename(u32 root, struct shfl_string *src_path, 1228c2ecf20Sopenharmony_ci struct shfl_string *dest_path, u32 flags); 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ciint vboxsf_read(u32 root, u64 handle, u64 offset, u32 *buf_len, u8 *buf); 1258c2ecf20Sopenharmony_ciint vboxsf_write(u32 root, u64 handle, u64 offset, u32 *buf_len, u8 *buf); 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ciint vboxsf_dirinfo(u32 root, u64 handle, 1288c2ecf20Sopenharmony_ci struct shfl_string *parsed_path, u32 flags, u32 index, 1298c2ecf20Sopenharmony_ci u32 *buf_len, struct shfl_dirinfo *buf, u32 *file_count); 1308c2ecf20Sopenharmony_ciint vboxsf_fsinfo(u32 root, u64 handle, u32 flags, 1318c2ecf20Sopenharmony_ci u32 *buf_len, void *buf); 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ciint vboxsf_map_folder(struct shfl_string *folder_name, u32 *root); 1348c2ecf20Sopenharmony_ciint vboxsf_unmap_folder(u32 root); 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ciint vboxsf_readlink(u32 root, struct shfl_string *parsed_path, 1378c2ecf20Sopenharmony_ci u32 buf_len, u8 *buf); 1388c2ecf20Sopenharmony_ciint vboxsf_symlink(u32 root, struct shfl_string *new_path, 1398c2ecf20Sopenharmony_ci struct shfl_string *old_path, struct shfl_fsobjinfo *buf); 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ciint vboxsf_set_utf8(void); 1428c2ecf20Sopenharmony_ciint vboxsf_set_symlinks(void); 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci#endif 145