^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");