162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * VirtualBox Guest Shared Folders support: module header. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2006-2018 Oracle Corporation 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef VFSMOD_H 962306a36Sopenharmony_ci#define VFSMOD_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/backing-dev.h> 1262306a36Sopenharmony_ci#include <linux/idr.h> 1362306a36Sopenharmony_ci#include "shfl_hostintf.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define DIR_BUFFER_SIZE SZ_16K 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* The cast is to prevent assignment of void * to pointers of arbitrary type */ 1862306a36Sopenharmony_ci#define VBOXSF_SBI(sb) ((struct vboxsf_sbi *)(sb)->s_fs_info) 1962306a36Sopenharmony_ci#define VBOXSF_I(i) container_of(i, struct vboxsf_inode, vfs_inode) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistruct vboxsf_handle; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistruct vboxsf_options { 2462306a36Sopenharmony_ci unsigned long ttl; 2562306a36Sopenharmony_ci kuid_t uid; 2662306a36Sopenharmony_ci kgid_t gid; 2762306a36Sopenharmony_ci bool dmode_set; 2862306a36Sopenharmony_ci bool fmode_set; 2962306a36Sopenharmony_ci umode_t dmode; 3062306a36Sopenharmony_ci umode_t fmode; 3162306a36Sopenharmony_ci umode_t dmask; 3262306a36Sopenharmony_ci umode_t fmask; 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistruct vboxsf_fs_context { 3662306a36Sopenharmony_ci struct vboxsf_options o; 3762306a36Sopenharmony_ci char *nls_name; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/* per-shared folder information */ 4162306a36Sopenharmony_cistruct vboxsf_sbi { 4262306a36Sopenharmony_ci struct vboxsf_options o; 4362306a36Sopenharmony_ci struct shfl_fsobjinfo root_info; 4462306a36Sopenharmony_ci struct idr ino_idr; 4562306a36Sopenharmony_ci spinlock_t ino_idr_lock; /* This protects ino_idr */ 4662306a36Sopenharmony_ci struct nls_table *nls; 4762306a36Sopenharmony_ci u32 next_generation; 4862306a36Sopenharmony_ci u32 root; 4962306a36Sopenharmony_ci int bdi_id; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* per-inode information */ 5362306a36Sopenharmony_cistruct vboxsf_inode { 5462306a36Sopenharmony_ci /* some information was changed, update data on next revalidate */ 5562306a36Sopenharmony_ci int force_restat; 5662306a36Sopenharmony_ci /* list of open handles for this inode + lock protecting it */ 5762306a36Sopenharmony_ci struct list_head handle_list; 5862306a36Sopenharmony_ci /* This mutex protects handle_list accesses */ 5962306a36Sopenharmony_ci struct mutex handle_list_mutex; 6062306a36Sopenharmony_ci /* The VFS inode struct */ 6162306a36Sopenharmony_ci struct inode vfs_inode; 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistruct vboxsf_dir_info { 6562306a36Sopenharmony_ci struct list_head info_list; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistruct vboxsf_dir_buf { 6962306a36Sopenharmony_ci size_t entries; 7062306a36Sopenharmony_ci size_t free; 7162306a36Sopenharmony_ci size_t used; 7262306a36Sopenharmony_ci void *buf; 7362306a36Sopenharmony_ci struct list_head head; 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* globals */ 7762306a36Sopenharmony_ciextern const struct inode_operations vboxsf_dir_iops; 7862306a36Sopenharmony_ciextern const struct inode_operations vboxsf_lnk_iops; 7962306a36Sopenharmony_ciextern const struct inode_operations vboxsf_reg_iops; 8062306a36Sopenharmony_ciextern const struct file_operations vboxsf_dir_fops; 8162306a36Sopenharmony_ciextern const struct file_operations vboxsf_reg_fops; 8262306a36Sopenharmony_ciextern const struct address_space_operations vboxsf_reg_aops; 8362306a36Sopenharmony_ciextern const struct dentry_operations vboxsf_dentry_ops; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* from file.c */ 8662306a36Sopenharmony_cistruct vboxsf_handle *vboxsf_create_sf_handle(struct inode *inode, 8762306a36Sopenharmony_ci u64 handle, u32 access_flags); 8862306a36Sopenharmony_civoid vboxsf_release_sf_handle(struct inode *inode, struct vboxsf_handle *sf_handle); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* from utils.c */ 9162306a36Sopenharmony_cistruct inode *vboxsf_new_inode(struct super_block *sb); 9262306a36Sopenharmony_ciint vboxsf_init_inode(struct vboxsf_sbi *sbi, struct inode *inode, 9362306a36Sopenharmony_ci const struct shfl_fsobjinfo *info, bool reinit); 9462306a36Sopenharmony_ciint vboxsf_create_at_dentry(struct dentry *dentry, 9562306a36Sopenharmony_ci struct shfl_createparms *params); 9662306a36Sopenharmony_ciint vboxsf_stat(struct vboxsf_sbi *sbi, struct shfl_string *path, 9762306a36Sopenharmony_ci struct shfl_fsobjinfo *info); 9862306a36Sopenharmony_ciint vboxsf_stat_dentry(struct dentry *dentry, struct shfl_fsobjinfo *info); 9962306a36Sopenharmony_ciint vboxsf_inode_revalidate(struct dentry *dentry); 10062306a36Sopenharmony_ciint vboxsf_getattr(struct mnt_idmap *idmap, const struct path *path, 10162306a36Sopenharmony_ci struct kstat *kstat, u32 request_mask, 10262306a36Sopenharmony_ci unsigned int query_flags); 10362306a36Sopenharmony_ciint vboxsf_setattr(struct mnt_idmap *idmap, struct dentry *dentry, 10462306a36Sopenharmony_ci struct iattr *iattr); 10562306a36Sopenharmony_cistruct shfl_string *vboxsf_path_from_dentry(struct vboxsf_sbi *sbi, 10662306a36Sopenharmony_ci struct dentry *dentry); 10762306a36Sopenharmony_ciint vboxsf_nlscpy(struct vboxsf_sbi *sbi, char *name, size_t name_bound_len, 10862306a36Sopenharmony_ci const unsigned char *utf8_name, size_t utf8_len); 10962306a36Sopenharmony_cistruct vboxsf_dir_info *vboxsf_dir_info_alloc(void); 11062306a36Sopenharmony_civoid vboxsf_dir_info_free(struct vboxsf_dir_info *p); 11162306a36Sopenharmony_ciint vboxsf_dir_read_all(struct vboxsf_sbi *sbi, struct vboxsf_dir_info *sf_d, 11262306a36Sopenharmony_ci u64 handle); 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci/* from vboxsf_wrappers.c */ 11562306a36Sopenharmony_ciint vboxsf_connect(void); 11662306a36Sopenharmony_civoid vboxsf_disconnect(void); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciint vboxsf_create(u32 root, struct shfl_string *parsed_path, 11962306a36Sopenharmony_ci struct shfl_createparms *create_parms); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ciint vboxsf_close(u32 root, u64 handle); 12262306a36Sopenharmony_ciint vboxsf_remove(u32 root, struct shfl_string *parsed_path, u32 flags); 12362306a36Sopenharmony_ciint vboxsf_rename(u32 root, struct shfl_string *src_path, 12462306a36Sopenharmony_ci struct shfl_string *dest_path, u32 flags); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ciint vboxsf_read(u32 root, u64 handle, u64 offset, u32 *buf_len, u8 *buf); 12762306a36Sopenharmony_ciint vboxsf_write(u32 root, u64 handle, u64 offset, u32 *buf_len, u8 *buf); 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ciint vboxsf_dirinfo(u32 root, u64 handle, 13062306a36Sopenharmony_ci struct shfl_string *parsed_path, u32 flags, u32 index, 13162306a36Sopenharmony_ci u32 *buf_len, struct shfl_dirinfo *buf, u32 *file_count); 13262306a36Sopenharmony_ciint vboxsf_fsinfo(u32 root, u64 handle, u32 flags, 13362306a36Sopenharmony_ci u32 *buf_len, void *buf); 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ciint vboxsf_map_folder(struct shfl_string *folder_name, u32 *root); 13662306a36Sopenharmony_ciint vboxsf_unmap_folder(u32 root); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ciint vboxsf_readlink(u32 root, struct shfl_string *parsed_path, 13962306a36Sopenharmony_ci u32 buf_len, u8 *buf); 14062306a36Sopenharmony_ciint vboxsf_symlink(u32 root, struct shfl_string *new_path, 14162306a36Sopenharmony_ci struct shfl_string *old_path, struct shfl_fsobjinfo *buf); 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ciint vboxsf_set_utf8(void); 14462306a36Sopenharmony_ciint vboxsf_set_symlinks(void); 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#endif 147