regops.c revision 94c634ca5c75b1f49fa94d7ece217fd16e458731
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * vboxvfs -- VirtualBox Guest Additions for Linux:
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * Regular file inode and file operations
c97989161fbe75bc14cea477a5443bbf474dd3advboxsync * Copyright (C) 2006-2007 innotek GmbH
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * available from http://www.virtualbox.org. This file is free software;
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * you can redistribute it and/or modify it under the terms of the GNU
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * General Public License as published by the Free Software Foundation,
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync * Limitations: only COW memory mapping is supported
13fdd42f1fc3e519650037a920e6a54c24973866vboxsyncsf_reg_read_aux (const char *caller, struct sf_glob_info *sf_g,
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync struct sf_reg_info *sf_r, void *buf, uint32_t *nread,
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync int rc = vboxCallRead (&client_handle, &sf_g->map, sf_r->handle,
e7aa635d70dd0cdf083287ec896fe8cca2775466vboxsync LogFunc(("vboxCallRead failed. caller=%s, rc=%Vrc\n",
13fdd42f1fc3e519650037a920e6a54c24973866vboxsyncsf_reg_read (struct file *file, char *buf, size_t size, loff_t *off)
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync struct sf_glob_info *sf_g = GET_GLOB_INFO (inode->i_sb);
e7aa635d70dd0cdf083287ec896fe8cca2775466vboxsync LogFunc(("read from non regular file %d\n", inode->i_mode));
10cc687667528f8e56827010e11a48ac1b0f0eb5vboxsync LogRelFunc(("could not allocate bounce buffer memory %d bytes\n", CHUNK_SIZE));
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync err = sf_reg_read_aux (__func__, sf_g, sf_r, tmp, &nread, pos);
13fdd42f1fc3e519650037a920e6a54c24973866vboxsyncsf_reg_write (struct file *file, const char *buf, size_t size, loff_t *off)
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync struct sf_inode_info *sf_i = GET_INODE_INFO (inode);
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync struct sf_glob_info *sf_g = GET_GLOB_INFO (inode->i_sb);
e7aa635d70dd0cdf083287ec896fe8cca2775466vboxsync LogFunc(("write to non regular file %d\n", inode->i_mode));
10cc687667528f8e56827010e11a48ac1b0f0eb5vboxsync LogRelFunc(("could not allocate bounce buffer memory %d\n", CHUNK_SIZE));
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync rc = vboxCallWrite (&client_handle, &sf_g->map, sf_r->handle,
13fdd42f1fc3e519650037a920e6a54c24973866vboxsyncsf_reg_open (struct inode *inode, struct file *file)
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync struct sf_glob_info *sf_g = GET_GLOB_INFO (inode->i_sb);
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync struct sf_inode_info *sf_i = GET_INODE_INFO (inode);
e7aa635d70dd0cdf083287ec896fe8cca2775466vboxsync /* We check this afterwards to find out if the call succeeded
e7aa635d70dd0cdf083287ec896fe8cca2775466vboxsync or failed, as the API does not seem to cleanly distinguish
e7aa635d70dd0cdf083287ec896fe8cca2775466vboxsync error and informational messages. */
27a3e4f5c969628986850d19c8bd11a5e6798838vboxsync /* We ignore O_EXCL, as the Linux kernel seems to call create
27a3e4f5c969628986850d19c8bd11a5e6798838vboxsync beforehand itself, so O_EXCL should always fail. */
cf3bdb86f7f5127c75dc4881649667e4d169e97cvboxsync params.CreateFlags |= ( SHFL_CF_ACT_OVERWRITE_IF_EXISTS
cf3bdb86f7f5127c75dc4881649667e4d169e97cvboxsync params.CreateFlags |= ( SHFL_CF_ACT_OVERWRITE_IF_EXISTS
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync if (!(params.CreateFlags & SHFL_CF_ACCESS_READWRITE)) {
e7aa635d70dd0cdf083287ec896fe8cca2775466vboxsync LogFunc(("sf_reg_open: calling vboxCallCreate, file %s, flags=%d, %#x\n",
e7aa635d70dd0cdf083287ec896fe8cca2775466vboxsync sf_i->path->String.utf8 , file->f_flags, params.CreateFlags));
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync rc = vboxCallCreate (&client_handle, &sf_g->map, sf_i->path, ¶ms);
e7aa635d70dd0cdf083287ec896fe8cca2775466vboxsync LogFunc(("vboxCallCreate failed flags=%d,%#x rc=%Vrc\n",
13fdd42f1fc3e519650037a920e6a54c24973866vboxsyncsf_reg_release (struct inode *inode, struct file *file)
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync rc = vboxCallClose (&client_handle, &sf_g->map, sf_r->handle);
13fdd42f1fc3e519650037a920e6a54c24973866vboxsyncstatic struct page *
13fdd42f1fc3e519650037a920e6a54c24973866vboxsyncsf_reg_nopage (struct vm_area_struct *vma, unsigned long vaddr, int unused)
13fdd42f1fc3e519650037a920e6a54c24973866vboxsyncsf_reg_nopage (struct vm_area_struct *vma, unsigned long vaddr, int *type)
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync struct sf_glob_info *sf_g = GET_GLOB_INFO (inode->i_sb);
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync off = (vaddr - vma->vm_start) + (vma->vm_pgoff << PAGE_SHIFT);
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync err = sf_reg_read_aux (__func__, sf_g, sf_r, buf, &nread, off);
13fdd42f1fc3e519650037a920e6a54c24973866vboxsync clear_user_page (page_address (page), vaddr, page);
13fdd42f1fc3e519650037a920e6a54c24973866vboxsyncsf_reg_mmap (struct file *file, struct vm_area_struct *vma)
94c634ca5c75b1f49fa94d7ece217fd16e458731vboxsync# if LINUX_VERSION_CODE >= KERNEL_VERSION (2, 6, 23)