xref: /openbmc/linux/fs/vboxsf/file.c (revision 02f840f90764f22f5c898901849bdbf0cee752ba)
10fd16957SHans de Goede // SPDX-License-Identifier: MIT
20fd16957SHans de Goede /*
30fd16957SHans de Goede  * VirtualBox Guest Shared Folders support: Regular file inode and file ops.
40fd16957SHans de Goede  *
50fd16957SHans de Goede  * Copyright (C) 2006-2018 Oracle Corporation
60fd16957SHans de Goede  */
70fd16957SHans de Goede 
80fd16957SHans de Goede #include <linux/mm.h>
90fd16957SHans de Goede #include <linux/page-flags.h>
100fd16957SHans de Goede #include <linux/pagemap.h>
110fd16957SHans de Goede #include <linux/highmem.h>
120fd16957SHans de Goede #include <linux/sizes.h>
130fd16957SHans de Goede #include "vfsmod.h"
140fd16957SHans de Goede 
150fd16957SHans de Goede struct vboxsf_handle {
160fd16957SHans de Goede 	u64 handle;
170fd16957SHans de Goede 	u32 root;
180fd16957SHans de Goede 	u32 access_flags;
190fd16957SHans de Goede 	struct kref refcount;
200fd16957SHans de Goede 	struct list_head head;
210fd16957SHans de Goede };
220fd16957SHans de Goede 
23*02f840f9SHans de Goede struct vboxsf_handle *vboxsf_create_sf_handle(struct inode *inode,
24*02f840f9SHans de Goede 					      u64 handle, u32 access_flags)
250fd16957SHans de Goede {
260fd16957SHans de Goede 	struct vboxsf_inode *sf_i = VBOXSF_I(inode);
27*02f840f9SHans de Goede 	struct vboxsf_handle *sf_handle;
28*02f840f9SHans de Goede 
29*02f840f9SHans de Goede 	sf_handle = kmalloc(sizeof(*sf_handle), GFP_KERNEL);
30*02f840f9SHans de Goede 	if (!sf_handle)
31*02f840f9SHans de Goede 		return ERR_PTR(-ENOMEM);
32*02f840f9SHans de Goede 
33*02f840f9SHans de Goede 	/* the host may have given us different attr then requested */
34*02f840f9SHans de Goede 	sf_i->force_restat = 1;
35*02f840f9SHans de Goede 
36*02f840f9SHans de Goede 	/* init our handle struct and add it to the inode's handles list */
37*02f840f9SHans de Goede 	sf_handle->handle = handle;
38*02f840f9SHans de Goede 	sf_handle->root = VBOXSF_SBI(inode->i_sb)->root;
39*02f840f9SHans de Goede 	sf_handle->access_flags = access_flags;
40*02f840f9SHans de Goede 	kref_init(&sf_handle->refcount);
41*02f840f9SHans de Goede 
42*02f840f9SHans de Goede 	mutex_lock(&sf_i->handle_list_mutex);
43*02f840f9SHans de Goede 	list_add(&sf_handle->head, &sf_i->handle_list);
44*02f840f9SHans de Goede 	mutex_unlock(&sf_i->handle_list_mutex);
45*02f840f9SHans de Goede 
46*02f840f9SHans de Goede 	return sf_handle;
47*02f840f9SHans de Goede }
48*02f840f9SHans de Goede 
49*02f840f9SHans de Goede static int vboxsf_file_open(struct inode *inode, struct file *file)
50*02f840f9SHans de Goede {
51*02f840f9SHans de Goede 	struct vboxsf_sbi *sbi = VBOXSF_SBI(inode->i_sb);
520fd16957SHans de Goede 	struct shfl_createparms params = {};
530fd16957SHans de Goede 	struct vboxsf_handle *sf_handle;
540fd16957SHans de Goede 	u32 access_flags = 0;
550fd16957SHans de Goede 	int err;
560fd16957SHans de Goede 
570fd16957SHans de Goede 	/*
580fd16957SHans de Goede 	 * We check the value of params.handle afterwards to find out if
590fd16957SHans de Goede 	 * the call succeeded or failed, as the API does not seem to cleanly
600fd16957SHans de Goede 	 * distinguish error and informational messages.
610fd16957SHans de Goede 	 *
620fd16957SHans de Goede 	 * Furthermore, we must set params.handle to SHFL_HANDLE_NIL to
630fd16957SHans de Goede 	 * make the shared folders host service use our mode parameter.
640fd16957SHans de Goede 	 */
650fd16957SHans de Goede 	params.handle = SHFL_HANDLE_NIL;
660fd16957SHans de Goede 	if (file->f_flags & O_CREAT) {
670fd16957SHans de Goede 		params.create_flags |= SHFL_CF_ACT_CREATE_IF_NEW;
680fd16957SHans de Goede 		/*
690fd16957SHans de Goede 		 * We ignore O_EXCL, as the Linux kernel seems to call create
700fd16957SHans de Goede 		 * beforehand itself, so O_EXCL should always fail.
710fd16957SHans de Goede 		 */
720fd16957SHans de Goede 		if (file->f_flags & O_TRUNC)
730fd16957SHans de Goede 			params.create_flags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS;
740fd16957SHans de Goede 		else
750fd16957SHans de Goede 			params.create_flags |= SHFL_CF_ACT_OPEN_IF_EXISTS;
760fd16957SHans de Goede 	} else {
770fd16957SHans de Goede 		params.create_flags |= SHFL_CF_ACT_FAIL_IF_NEW;
780fd16957SHans de Goede 		if (file->f_flags & O_TRUNC)
790fd16957SHans de Goede 			params.create_flags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS;
800fd16957SHans de Goede 	}
810fd16957SHans de Goede 
820fd16957SHans de Goede 	switch (file->f_flags & O_ACCMODE) {
830fd16957SHans de Goede 	case O_RDONLY:
840fd16957SHans de Goede 		access_flags |= SHFL_CF_ACCESS_READ;
850fd16957SHans de Goede 		break;
860fd16957SHans de Goede 
870fd16957SHans de Goede 	case O_WRONLY:
880fd16957SHans de Goede 		access_flags |= SHFL_CF_ACCESS_WRITE;
890fd16957SHans de Goede 		break;
900fd16957SHans de Goede 
910fd16957SHans de Goede 	case O_RDWR:
920fd16957SHans de Goede 		access_flags |= SHFL_CF_ACCESS_READWRITE;
930fd16957SHans de Goede 		break;
940fd16957SHans de Goede 
950fd16957SHans de Goede 	default:
960fd16957SHans de Goede 		WARN_ON(1);
970fd16957SHans de Goede 	}
980fd16957SHans de Goede 
990fd16957SHans de Goede 	if (file->f_flags & O_APPEND)
1000fd16957SHans de Goede 		access_flags |= SHFL_CF_ACCESS_APPEND;
1010fd16957SHans de Goede 
1020fd16957SHans de Goede 	params.create_flags |= access_flags;
1030fd16957SHans de Goede 	params.info.attr.mode = inode->i_mode;
1040fd16957SHans de Goede 
1050fd16957SHans de Goede 	err = vboxsf_create_at_dentry(file_dentry(file), &params);
1060fd16957SHans de Goede 	if (err == 0 && params.handle == SHFL_HANDLE_NIL)
1070fd16957SHans de Goede 		err = (params.result == SHFL_FILE_EXISTS) ? -EEXIST : -ENOENT;
108*02f840f9SHans de Goede 	if (err)
1090fd16957SHans de Goede 		return err;
110*02f840f9SHans de Goede 
111*02f840f9SHans de Goede 	sf_handle = vboxsf_create_sf_handle(inode, params.handle, access_flags);
112*02f840f9SHans de Goede 	if (IS_ERR(sf_handle)) {
113*02f840f9SHans de Goede 		vboxsf_close(sbi->root, params.handle);
114*02f840f9SHans de Goede 		return PTR_ERR(sf_handle);
1150fd16957SHans de Goede 	}
1160fd16957SHans de Goede 
1170fd16957SHans de Goede 	file->private_data = sf_handle;
1180fd16957SHans de Goede 	return 0;
1190fd16957SHans de Goede }
1200fd16957SHans de Goede 
1210fd16957SHans de Goede static void vboxsf_handle_release(struct kref *refcount)
1220fd16957SHans de Goede {
1230fd16957SHans de Goede 	struct vboxsf_handle *sf_handle =
1240fd16957SHans de Goede 		container_of(refcount, struct vboxsf_handle, refcount);
1250fd16957SHans de Goede 
1260fd16957SHans de Goede 	vboxsf_close(sf_handle->root, sf_handle->handle);
1270fd16957SHans de Goede 	kfree(sf_handle);
1280fd16957SHans de Goede }
1290fd16957SHans de Goede 
130*02f840f9SHans de Goede void vboxsf_release_sf_handle(struct inode *inode, struct vboxsf_handle *sf_handle)
1310fd16957SHans de Goede {
1320fd16957SHans de Goede 	struct vboxsf_inode *sf_i = VBOXSF_I(inode);
1330fd16957SHans de Goede 
1340fd16957SHans de Goede 	mutex_lock(&sf_i->handle_list_mutex);
1350fd16957SHans de Goede 	list_del(&sf_handle->head);
1360fd16957SHans de Goede 	mutex_unlock(&sf_i->handle_list_mutex);
1370fd16957SHans de Goede 
1380fd16957SHans de Goede 	kref_put(&sf_handle->refcount, vboxsf_handle_release);
139*02f840f9SHans de Goede }
140*02f840f9SHans de Goede 
141*02f840f9SHans de Goede static int vboxsf_file_release(struct inode *inode, struct file *file)
142*02f840f9SHans de Goede {
143*02f840f9SHans de Goede 	/*
144*02f840f9SHans de Goede 	 * When a file is closed on our (the guest) side, we want any subsequent
145*02f840f9SHans de Goede 	 * accesses done on the host side to see all changes done from our side.
146*02f840f9SHans de Goede 	 */
147*02f840f9SHans de Goede 	filemap_write_and_wait(inode->i_mapping);
148*02f840f9SHans de Goede 
149*02f840f9SHans de Goede 	vboxsf_release_sf_handle(inode, file->private_data);
1500fd16957SHans de Goede 	return 0;
1510fd16957SHans de Goede }
1520fd16957SHans de Goede 
1530fd16957SHans de Goede /*
1540fd16957SHans de Goede  * Write back dirty pages now, because there may not be any suitable
1550fd16957SHans de Goede  * open files later
1560fd16957SHans de Goede  */
1570fd16957SHans de Goede static void vboxsf_vma_close(struct vm_area_struct *vma)
1580fd16957SHans de Goede {
1590fd16957SHans de Goede 	filemap_write_and_wait(vma->vm_file->f_mapping);
1600fd16957SHans de Goede }
1610fd16957SHans de Goede 
1620fd16957SHans de Goede static const struct vm_operations_struct vboxsf_file_vm_ops = {
1630fd16957SHans de Goede 	.close		= vboxsf_vma_close,
1640fd16957SHans de Goede 	.fault		= filemap_fault,
1650fd16957SHans de Goede 	.map_pages	= filemap_map_pages,
1660fd16957SHans de Goede };
1670fd16957SHans de Goede 
1680fd16957SHans de Goede static int vboxsf_file_mmap(struct file *file, struct vm_area_struct *vma)
1690fd16957SHans de Goede {
1700fd16957SHans de Goede 	int err;
1710fd16957SHans de Goede 
1720fd16957SHans de Goede 	err = generic_file_mmap(file, vma);
1730fd16957SHans de Goede 	if (!err)
1740fd16957SHans de Goede 		vma->vm_ops = &vboxsf_file_vm_ops;
1750fd16957SHans de Goede 
1760fd16957SHans de Goede 	return err;
1770fd16957SHans de Goede }
1780fd16957SHans de Goede 
1790fd16957SHans de Goede /*
1800fd16957SHans de Goede  * Note that since we are accessing files on the host's filesystem, files
1810fd16957SHans de Goede  * may always be changed underneath us by the host!
1820fd16957SHans de Goede  *
1830fd16957SHans de Goede  * The vboxsf API between the guest and the host does not offer any functions
1840fd16957SHans de Goede  * to deal with this. There is no inode-generation to check for changes, no
1850fd16957SHans de Goede  * events / callback on changes and no way to lock files.
1860fd16957SHans de Goede  *
1870fd16957SHans de Goede  * To avoid returning stale data when a file gets *opened* on our (the guest)
1880fd16957SHans de Goede  * side, we do a "stat" on the host side, then compare the mtime with the
1890fd16957SHans de Goede  * last known mtime and invalidate the page-cache if they differ.
1900fd16957SHans de Goede  * This is done from vboxsf_inode_revalidate().
1910fd16957SHans de Goede  *
1920fd16957SHans de Goede  * When reads are done through the read_iter fop, it is possible to do
1930fd16957SHans de Goede  * further cache revalidation then, there are 3 options to deal with this:
1940fd16957SHans de Goede  *
1950fd16957SHans de Goede  * 1)  Rely solely on the revalidation done at open time
1960fd16957SHans de Goede  * 2)  Do another "stat" and compare mtime again. Unfortunately the vboxsf
1970fd16957SHans de Goede  *     host API does not allow stat on handles, so we would need to use
1980fd16957SHans de Goede  *     file->f_path.dentry and the stat will then fail if the file was unlinked
1990fd16957SHans de Goede  *     or renamed (and there is no thing like NFS' silly-rename). So we get:
2000fd16957SHans de Goede  * 2a) "stat" and compare mtime, on stat failure invalidate the cache
2010fd16957SHans de Goede  * 2b) "stat" and compare mtime, on stat failure do nothing
2020fd16957SHans de Goede  * 3)  Simply always call invalidate_inode_pages2_range on the range of the read
2030fd16957SHans de Goede  *
2040fd16957SHans de Goede  * Currently we are keeping things KISS and using option 1. this allows
2050fd16957SHans de Goede  * directly using generic_file_read_iter without wrapping it.
2060fd16957SHans de Goede  *
2070fd16957SHans de Goede  * This means that only data written on the host side before open() on
2080fd16957SHans de Goede  * the guest side is guaranteed to be seen by the guest. If necessary
2090fd16957SHans de Goede  * we may provide other read-cache strategies in the future and make this
2100fd16957SHans de Goede  * configurable through a mount option.
2110fd16957SHans de Goede  */
2120fd16957SHans de Goede const struct file_operations vboxsf_reg_fops = {
2130fd16957SHans de Goede 	.llseek = generic_file_llseek,
2140fd16957SHans de Goede 	.read_iter = generic_file_read_iter,
2150fd16957SHans de Goede 	.write_iter = generic_file_write_iter,
2160fd16957SHans de Goede 	.mmap = vboxsf_file_mmap,
2170fd16957SHans de Goede 	.open = vboxsf_file_open,
2180fd16957SHans de Goede 	.release = vboxsf_file_release,
2190fd16957SHans de Goede 	.fsync = noop_fsync,
2200fd16957SHans de Goede 	.splice_read = generic_file_splice_read,
2210fd16957SHans de Goede };
2220fd16957SHans de Goede 
2230fd16957SHans de Goede const struct inode_operations vboxsf_reg_iops = {
2240fd16957SHans de Goede 	.getattr = vboxsf_getattr,
2250fd16957SHans de Goede 	.setattr = vboxsf_setattr
2260fd16957SHans de Goede };
2270fd16957SHans de Goede 
2280fd16957SHans de Goede static int vboxsf_readpage(struct file *file, struct page *page)
2290fd16957SHans de Goede {
2300fd16957SHans de Goede 	struct vboxsf_handle *sf_handle = file->private_data;
2310fd16957SHans de Goede 	loff_t off = page_offset(page);
2320fd16957SHans de Goede 	u32 nread = PAGE_SIZE;
2330fd16957SHans de Goede 	u8 *buf;
2340fd16957SHans de Goede 	int err;
2350fd16957SHans de Goede 
2360fd16957SHans de Goede 	buf = kmap(page);
2370fd16957SHans de Goede 
2380fd16957SHans de Goede 	err = vboxsf_read(sf_handle->root, sf_handle->handle, off, &nread, buf);
2390fd16957SHans de Goede 	if (err == 0) {
2400fd16957SHans de Goede 		memset(&buf[nread], 0, PAGE_SIZE - nread);
2410fd16957SHans de Goede 		flush_dcache_page(page);
2420fd16957SHans de Goede 		SetPageUptodate(page);
2430fd16957SHans de Goede 	} else {
2440fd16957SHans de Goede 		SetPageError(page);
2450fd16957SHans de Goede 	}
2460fd16957SHans de Goede 
2470fd16957SHans de Goede 	kunmap(page);
2480fd16957SHans de Goede 	unlock_page(page);
2490fd16957SHans de Goede 	return err;
2500fd16957SHans de Goede }
2510fd16957SHans de Goede 
2520fd16957SHans de Goede static struct vboxsf_handle *vboxsf_get_write_handle(struct vboxsf_inode *sf_i)
2530fd16957SHans de Goede {
2540fd16957SHans de Goede 	struct vboxsf_handle *h, *sf_handle = NULL;
2550fd16957SHans de Goede 
2560fd16957SHans de Goede 	mutex_lock(&sf_i->handle_list_mutex);
2570fd16957SHans de Goede 	list_for_each_entry(h, &sf_i->handle_list, head) {
2580fd16957SHans de Goede 		if (h->access_flags == SHFL_CF_ACCESS_WRITE ||
2590fd16957SHans de Goede 		    h->access_flags == SHFL_CF_ACCESS_READWRITE) {
2600fd16957SHans de Goede 			kref_get(&h->refcount);
2610fd16957SHans de Goede 			sf_handle = h;
2620fd16957SHans de Goede 			break;
2630fd16957SHans de Goede 		}
2640fd16957SHans de Goede 	}
2650fd16957SHans de Goede 	mutex_unlock(&sf_i->handle_list_mutex);
2660fd16957SHans de Goede 
2670fd16957SHans de Goede 	return sf_handle;
2680fd16957SHans de Goede }
2690fd16957SHans de Goede 
2700fd16957SHans de Goede static int vboxsf_writepage(struct page *page, struct writeback_control *wbc)
2710fd16957SHans de Goede {
2720fd16957SHans de Goede 	struct inode *inode = page->mapping->host;
2730fd16957SHans de Goede 	struct vboxsf_inode *sf_i = VBOXSF_I(inode);
2740fd16957SHans de Goede 	struct vboxsf_handle *sf_handle;
2750fd16957SHans de Goede 	loff_t off = page_offset(page);
2760fd16957SHans de Goede 	loff_t size = i_size_read(inode);
2770fd16957SHans de Goede 	u32 nwrite = PAGE_SIZE;
2780fd16957SHans de Goede 	u8 *buf;
2790fd16957SHans de Goede 	int err;
2800fd16957SHans de Goede 
2810fd16957SHans de Goede 	if (off + PAGE_SIZE > size)
2820fd16957SHans de Goede 		nwrite = size & ~PAGE_MASK;
2830fd16957SHans de Goede 
2840fd16957SHans de Goede 	sf_handle = vboxsf_get_write_handle(sf_i);
2850fd16957SHans de Goede 	if (!sf_handle)
2860fd16957SHans de Goede 		return -EBADF;
2870fd16957SHans de Goede 
2880fd16957SHans de Goede 	buf = kmap(page);
2890fd16957SHans de Goede 	err = vboxsf_write(sf_handle->root, sf_handle->handle,
2900fd16957SHans de Goede 			   off, &nwrite, buf);
2910fd16957SHans de Goede 	kunmap(page);
2920fd16957SHans de Goede 
2930fd16957SHans de Goede 	kref_put(&sf_handle->refcount, vboxsf_handle_release);
2940fd16957SHans de Goede 
2950fd16957SHans de Goede 	if (err == 0) {
2960fd16957SHans de Goede 		ClearPageError(page);
2970fd16957SHans de Goede 		/* mtime changed */
2980fd16957SHans de Goede 		sf_i->force_restat = 1;
2990fd16957SHans de Goede 	} else {
3000fd16957SHans de Goede 		ClearPageUptodate(page);
3010fd16957SHans de Goede 	}
3020fd16957SHans de Goede 
3030fd16957SHans de Goede 	unlock_page(page);
3040fd16957SHans de Goede 	return err;
3050fd16957SHans de Goede }
3060fd16957SHans de Goede 
3070fd16957SHans de Goede static int vboxsf_write_end(struct file *file, struct address_space *mapping,
3080fd16957SHans de Goede 			    loff_t pos, unsigned int len, unsigned int copied,
3090fd16957SHans de Goede 			    struct page *page, void *fsdata)
3100fd16957SHans de Goede {
3110fd16957SHans de Goede 	struct inode *inode = mapping->host;
3120fd16957SHans de Goede 	struct vboxsf_handle *sf_handle = file->private_data;
3130fd16957SHans de Goede 	unsigned int from = pos & ~PAGE_MASK;
3140fd16957SHans de Goede 	u32 nwritten = len;
3150fd16957SHans de Goede 	u8 *buf;
3160fd16957SHans de Goede 	int err;
3170fd16957SHans de Goede 
3180fd16957SHans de Goede 	/* zero the stale part of the page if we did a short copy */
3190fd16957SHans de Goede 	if (!PageUptodate(page) && copied < len)
3200fd16957SHans de Goede 		zero_user(page, from + copied, len - copied);
3210fd16957SHans de Goede 
3220fd16957SHans de Goede 	buf = kmap(page);
3230fd16957SHans de Goede 	err = vboxsf_write(sf_handle->root, sf_handle->handle,
3240fd16957SHans de Goede 			   pos, &nwritten, buf + from);
3250fd16957SHans de Goede 	kunmap(page);
3260fd16957SHans de Goede 
3270fd16957SHans de Goede 	if (err) {
3280fd16957SHans de Goede 		nwritten = 0;
3290fd16957SHans de Goede 		goto out;
3300fd16957SHans de Goede 	}
3310fd16957SHans de Goede 
3320fd16957SHans de Goede 	/* mtime changed */
3330fd16957SHans de Goede 	VBOXSF_I(inode)->force_restat = 1;
3340fd16957SHans de Goede 
3350fd16957SHans de Goede 	if (!PageUptodate(page) && nwritten == PAGE_SIZE)
3360fd16957SHans de Goede 		SetPageUptodate(page);
3370fd16957SHans de Goede 
3380fd16957SHans de Goede 	pos += nwritten;
3390fd16957SHans de Goede 	if (pos > inode->i_size)
3400fd16957SHans de Goede 		i_size_write(inode, pos);
3410fd16957SHans de Goede 
3420fd16957SHans de Goede out:
3430fd16957SHans de Goede 	unlock_page(page);
3440fd16957SHans de Goede 	put_page(page);
3450fd16957SHans de Goede 
3460fd16957SHans de Goede 	return nwritten;
3470fd16957SHans de Goede }
3480fd16957SHans de Goede 
3490fd16957SHans de Goede /*
3500fd16957SHans de Goede  * Note simple_write_begin does not read the page from disk on partial writes
3510fd16957SHans de Goede  * this is ok since vboxsf_write_end only writes the written parts of the
3520fd16957SHans de Goede  * page and it does not call SetPageUptodate for partial writes.
3530fd16957SHans de Goede  */
3540fd16957SHans de Goede const struct address_space_operations vboxsf_reg_aops = {
3550fd16957SHans de Goede 	.readpage = vboxsf_readpage,
3560fd16957SHans de Goede 	.writepage = vboxsf_writepage,
3570fd16957SHans de Goede 	.set_page_dirty = __set_page_dirty_nobuffers,
3580fd16957SHans de Goede 	.write_begin = simple_write_begin,
3590fd16957SHans de Goede 	.write_end = vboxsf_write_end,
3600fd16957SHans de Goede };
3610fd16957SHans de Goede 
3620fd16957SHans de Goede static const char *vboxsf_get_link(struct dentry *dentry, struct inode *inode,
3630fd16957SHans de Goede 				   struct delayed_call *done)
3640fd16957SHans de Goede {
3650fd16957SHans de Goede 	struct vboxsf_sbi *sbi = VBOXSF_SBI(inode->i_sb);
3660fd16957SHans de Goede 	struct shfl_string *path;
3670fd16957SHans de Goede 	char *link;
3680fd16957SHans de Goede 	int err;
3690fd16957SHans de Goede 
3700fd16957SHans de Goede 	if (!dentry)
3710fd16957SHans de Goede 		return ERR_PTR(-ECHILD);
3720fd16957SHans de Goede 
3730fd16957SHans de Goede 	path = vboxsf_path_from_dentry(sbi, dentry);
3740fd16957SHans de Goede 	if (IS_ERR(path))
3750fd16957SHans de Goede 		return ERR_CAST(path);
3760fd16957SHans de Goede 
3770fd16957SHans de Goede 	link = kzalloc(PATH_MAX, GFP_KERNEL);
3780fd16957SHans de Goede 	if (!link) {
3790fd16957SHans de Goede 		__putname(path);
3800fd16957SHans de Goede 		return ERR_PTR(-ENOMEM);
3810fd16957SHans de Goede 	}
3820fd16957SHans de Goede 
3830fd16957SHans de Goede 	err = vboxsf_readlink(sbi->root, path, PATH_MAX, link);
3840fd16957SHans de Goede 	__putname(path);
3850fd16957SHans de Goede 	if (err) {
3860fd16957SHans de Goede 		kfree(link);
3870fd16957SHans de Goede 		return ERR_PTR(err);
3880fd16957SHans de Goede 	}
3890fd16957SHans de Goede 
3900fd16957SHans de Goede 	set_delayed_call(done, kfree_link, link);
3910fd16957SHans de Goede 	return link;
3920fd16957SHans de Goede }
3930fd16957SHans de Goede 
3940fd16957SHans de Goede const struct inode_operations vboxsf_lnk_iops = {
3950fd16957SHans de Goede 	.get_link = vboxsf_get_link
3960fd16957SHans de Goede };
397