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