Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: MIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * VirtualBox Guest Shared Folders support: Virtual File System.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Module initialization/finalization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * File system registration/deregistration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * Superblock reading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * Few utility functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  * Copyright (C) 2006-2018 Oracle Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/idr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/fs_parser.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/magic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/nls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <linux/statfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <linux/vbox_utils.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include "vfsmod.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define VBOXSF_SUPER_MAGIC 0x786f4256 /* 'VBox' little endian */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) static const unsigned char VBSF_MOUNT_SIGNATURE[4] = "\000\377\376\375";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) static int follow_symlinks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) module_param(follow_symlinks, int, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) MODULE_PARM_DESC(follow_symlinks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 		 "Let host resolve symlinks rather than showing them");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) static DEFINE_IDA(vboxsf_bdi_ida);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) static DEFINE_MUTEX(vboxsf_setup_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) static bool vboxsf_setup_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) static struct super_operations vboxsf_super_ops; /* forward declaration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) static struct kmem_cache *vboxsf_inode_cachep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) static char * const vboxsf_default_nls = CONFIG_NLS_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) enum  { opt_nls, opt_uid, opt_gid, opt_ttl, opt_dmode, opt_fmode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	opt_dmask, opt_fmask };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) static const struct fs_parameter_spec vboxsf_fs_parameters[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	fsparam_string	("nls",		opt_nls),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	fsparam_u32	("uid",		opt_uid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	fsparam_u32	("gid",		opt_gid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	fsparam_u32	("ttl",		opt_ttl),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	fsparam_u32oct	("dmode",	opt_dmode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	fsparam_u32oct	("fmode",	opt_fmode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	fsparam_u32oct	("dmask",	opt_dmask),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	fsparam_u32oct	("fmask",	opt_fmask),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	{}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) static int vboxsf_parse_param(struct fs_context *fc, struct fs_parameter *param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	struct vboxsf_fs_context *ctx = fc->fs_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	struct fs_parse_result result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	kuid_t uid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	kgid_t gid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	int opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	opt = fs_parse(fc, vboxsf_fs_parameters, param, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	if (opt < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		return opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	switch (opt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	case opt_nls:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 		if (ctx->nls_name || fc->purpose != FS_CONTEXT_FOR_MOUNT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 			vbg_err("vboxsf: Cannot reconfigure nls option\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		ctx->nls_name = param->string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		param->string = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	case opt_uid:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		uid = make_kuid(current_user_ns(), result.uint_32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		if (!uid_valid(uid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 		ctx->o.uid = uid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	case opt_gid:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		gid = make_kgid(current_user_ns(), result.uint_32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		if (!gid_valid(gid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 		ctx->o.gid = gid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	case opt_ttl:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		ctx->o.ttl = msecs_to_jiffies(result.uint_32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	case opt_dmode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 		if (result.uint_32 & ~0777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 		ctx->o.dmode = result.uint_32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 		ctx->o.dmode_set = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	case opt_fmode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 		if (result.uint_32 & ~0777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		ctx->o.fmode = result.uint_32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		ctx->o.fmode_set = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	case opt_dmask:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 		if (result.uint_32 & ~07777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 		ctx->o.dmask = result.uint_32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	case opt_fmask:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		if (result.uint_32 & ~07777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 		ctx->o.fmask = result.uint_32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static int vboxsf_fill_super(struct super_block *sb, struct fs_context *fc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	struct vboxsf_fs_context *ctx = fc->fs_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	struct shfl_string *folder_name, root_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	struct vboxsf_sbi *sbi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	struct dentry *droot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	struct inode *iroot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	char *nls_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	size_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	if (!fc->source)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	if (!sbi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	sbi->o = ctx->o;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	idr_init(&sbi->ino_idr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	spin_lock_init(&sbi->ino_idr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	sbi->next_generation = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	sbi->bdi_id = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	/* Load nls if not utf8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	nls_name = ctx->nls_name ? ctx->nls_name : vboxsf_default_nls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	if (strcmp(nls_name, "utf8") != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		if (nls_name == vboxsf_default_nls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 			sbi->nls = load_nls_default();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 			sbi->nls = load_nls(nls_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 		if (!sbi->nls) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 			vbg_err("vboxsf: Count not load '%s' nls\n", nls_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 			err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 			goto fail_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	sbi->bdi_id = ida_simple_get(&vboxsf_bdi_ida, 0, 0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	if (sbi->bdi_id < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		err = sbi->bdi_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 		goto fail_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	err = super_setup_bdi_name(sb, "vboxsf-%d", sbi->bdi_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 		goto fail_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	sb->s_bdi->ra_pages = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	sb->s_bdi->io_pages = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	/* Turn source into a shfl_string and map the folder */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	size = strlen(fc->source) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	folder_name = kmalloc(SHFLSTRING_HEADER_SIZE + size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	if (!folder_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 		err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 		goto fail_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	folder_name->size = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	folder_name->length = size - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	strlcpy(folder_name->string.utf8, fc->source, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	err = vboxsf_map_folder(folder_name, &sbi->root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	kfree(folder_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 		vbg_err("vboxsf: Host rejected mount of '%s' with error %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 			fc->source, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		goto fail_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	root_path.length = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	root_path.size = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	root_path.string.utf8[0] = '/';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	root_path.string.utf8[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	err = vboxsf_stat(sbi, &root_path, &sbi->root_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		goto fail_unmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	sb->s_magic = VBOXSF_SUPER_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	sb->s_blocksize = 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	sb->s_maxbytes = MAX_LFS_FILESIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	sb->s_op = &vboxsf_super_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	sb->s_d_op = &vboxsf_dentry_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	iroot = iget_locked(sb, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	if (!iroot) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 		err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		goto fail_unmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	vboxsf_init_inode(sbi, iroot, &sbi->root_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	unlock_new_inode(iroot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	droot = d_make_root(iroot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	if (!droot) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 		goto fail_unmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	sb->s_root = droot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	sb->s_fs_info = sbi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) fail_unmap:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	vboxsf_unmap_folder(sbi->root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) fail_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	if (sbi->bdi_id >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		ida_simple_remove(&vboxsf_bdi_ida, sbi->bdi_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	if (sbi->nls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 		unload_nls(sbi->nls);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	idr_destroy(&sbi->ino_idr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	kfree(sbi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) static void vboxsf_inode_init_once(void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	struct vboxsf_inode *sf_i = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	mutex_init(&sf_i->handle_list_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	inode_init_once(&sf_i->vfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) static struct inode *vboxsf_alloc_inode(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	struct vboxsf_inode *sf_i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	sf_i = kmem_cache_alloc(vboxsf_inode_cachep, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	if (!sf_i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	sf_i->force_restat = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	INIT_LIST_HEAD(&sf_i->handle_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	return &sf_i->vfs_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) static void vboxsf_free_inode(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	struct vboxsf_sbi *sbi = VBOXSF_SBI(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	spin_lock_irqsave(&sbi->ino_idr_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	idr_remove(&sbi->ino_idr, inode->i_ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	spin_unlock_irqrestore(&sbi->ino_idr_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	kmem_cache_free(vboxsf_inode_cachep, VBOXSF_I(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) static void vboxsf_put_super(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	struct vboxsf_sbi *sbi = VBOXSF_SBI(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	vboxsf_unmap_folder(sbi->root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	if (sbi->bdi_id >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 		ida_simple_remove(&vboxsf_bdi_ida, sbi->bdi_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	if (sbi->nls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 		unload_nls(sbi->nls);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	 * vboxsf_free_inode uses the idr, make sure all delayed rcu free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	 * inodes are flushed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	rcu_barrier();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	idr_destroy(&sbi->ino_idr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	kfree(sbi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) static int vboxsf_statfs(struct dentry *dentry, struct kstatfs *stat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	struct super_block *sb = dentry->d_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	struct shfl_volinfo shfl_volinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	struct vboxsf_sbi *sbi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	u32 buf_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	sbi = VBOXSF_SBI(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	buf_len = sizeof(shfl_volinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	err = vboxsf_fsinfo(sbi->root, 0, SHFL_INFO_GET | SHFL_INFO_VOLUME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 			    &buf_len, &shfl_volinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	stat->f_type = VBOXSF_SUPER_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	stat->f_bsize = shfl_volinfo.bytes_per_allocation_unit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	do_div(shfl_volinfo.total_allocation_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	       shfl_volinfo.bytes_per_allocation_unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	stat->f_blocks = shfl_volinfo.total_allocation_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	do_div(shfl_volinfo.available_allocation_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	       shfl_volinfo.bytes_per_allocation_unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	stat->f_bfree  = shfl_volinfo.available_allocation_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	stat->f_bavail = shfl_volinfo.available_allocation_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	stat->f_files = 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	 * Don't return 0 here since the guest may then think that it is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	 * possible to create any more files.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	stat->f_ffree = 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	stat->f_fsid.val[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	stat->f_fsid.val[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	stat->f_namelen = 255;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) static struct super_operations vboxsf_super_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	.alloc_inode	= vboxsf_alloc_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	.free_inode	= vboxsf_free_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	.put_super	= vboxsf_put_super,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	.statfs		= vboxsf_statfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) static int vboxsf_setup(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	mutex_lock(&vboxsf_setup_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	if (vboxsf_setup_done)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 		goto success;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	vboxsf_inode_cachep =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 		kmem_cache_create("vboxsf_inode_cache",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 				  sizeof(struct vboxsf_inode), 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 				  (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 				   SLAB_ACCOUNT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 				  vboxsf_inode_init_once);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	if (!vboxsf_inode_cachep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 		err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 		goto fail_nomem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 	err = vboxsf_connect();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 		vbg_err("vboxsf: err %d connecting to guest PCI-device\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 		vbg_err("vboxsf: make sure you are inside a VirtualBox VM\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 		vbg_err("vboxsf: and check dmesg for vboxguest errors\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 		goto fail_free_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	err = vboxsf_set_utf8();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 		vbg_err("vboxsf_setutf8 error %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 		goto fail_disconnect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	if (!follow_symlinks) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 		err = vboxsf_set_symlinks();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 			vbg_warn("vboxsf: Unable to show symlinks: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	vboxsf_setup_done = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) success:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	mutex_unlock(&vboxsf_setup_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) fail_disconnect:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	vboxsf_disconnect();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) fail_free_cache:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	kmem_cache_destroy(vboxsf_inode_cachep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) fail_nomem:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	mutex_unlock(&vboxsf_setup_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) static int vboxsf_parse_monolithic(struct fs_context *fc, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 	if (data && !memcmp(data, VBSF_MOUNT_SIGNATURE, 4)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 		vbg_err("vboxsf: Old binary mount data not supported, remove obsolete mount.vboxsf and/or update your VBoxService.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 	return generic_parse_monolithic(fc, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) static int vboxsf_get_tree(struct fs_context *fc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	err = vboxsf_setup();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 	return get_tree_nodev(fc, vboxsf_fill_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) static int vboxsf_reconfigure(struct fs_context *fc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 	struct vboxsf_sbi *sbi = VBOXSF_SBI(fc->root->d_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	struct vboxsf_fs_context *ctx = fc->fs_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	struct inode *iroot = fc->root->d_sb->s_root->d_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	/* Apply changed options to the root inode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	sbi->o = ctx->o;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 	vboxsf_init_inode(sbi, iroot, &sbi->root_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) static void vboxsf_free_fc(struct fs_context *fc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	struct vboxsf_fs_context *ctx = fc->fs_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 	kfree(ctx->nls_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	kfree(ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) static const struct fs_context_operations vboxsf_context_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 	.free			= vboxsf_free_fc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 	.parse_param		= vboxsf_parse_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 	.parse_monolithic	= vboxsf_parse_monolithic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 	.get_tree		= vboxsf_get_tree,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	.reconfigure		= vboxsf_reconfigure,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) static int vboxsf_init_fs_context(struct fs_context *fc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	struct vboxsf_fs_context *ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	if (!ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	current_uid_gid(&ctx->o.uid, &ctx->o.gid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	fc->fs_private = ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	fc->ops = &vboxsf_context_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) static struct file_system_type vboxsf_fs_type = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 	.owner			= THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	.name			= "vboxsf",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	.init_fs_context	= vboxsf_init_fs_context,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 	.kill_sb		= kill_anon_super
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) /* Module initialization/finalization handlers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) static int __init vboxsf_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 	return register_filesystem(&vboxsf_fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) static void __exit vboxsf_fini(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	unregister_filesystem(&vboxsf_fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	mutex_lock(&vboxsf_setup_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	if (vboxsf_setup_done) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 		vboxsf_disconnect();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 		 * Make sure all delayed rcu free inodes are flushed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 		 * before we destroy the cache.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 		rcu_barrier();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 		kmem_cache_destroy(vboxsf_inode_cachep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 	mutex_unlock(&vboxsf_setup_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) module_init(vboxsf_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) module_exit(vboxsf_fini);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) MODULE_DESCRIPTION("Oracle VM VirtualBox Module for Host File System Access");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) MODULE_AUTHOR("Oracle Corporation");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) MODULE_LICENSE("GPL v2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) MODULE_ALIAS_FS("vboxsf");