xref: /kernel/linux/linux-5.10/fs/vboxsf/vfsmod.h (revision 8c2ecf20)
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