1*0fd16957SHans de Goede // SPDX-License-Identifier: MIT 2*0fd16957SHans de Goede /* 3*0fd16957SHans de Goede * VirtualBox Guest Shared Folders support: Regular file inode and file ops. 4*0fd16957SHans de Goede * 5*0fd16957SHans de Goede * Copyright (C) 2006-2018 Oracle Corporation 6*0fd16957SHans de Goede */ 7*0fd16957SHans de Goede 8*0fd16957SHans de Goede #include <linux/mm.h> 9*0fd16957SHans de Goede #include <linux/page-flags.h> 10*0fd16957SHans de Goede #include <linux/pagemap.h> 11*0fd16957SHans de Goede #include <linux/highmem.h> 12*0fd16957SHans de Goede #include <linux/sizes.h> 13*0fd16957SHans de Goede #include "vfsmod.h" 14*0fd16957SHans de Goede 15*0fd16957SHans de Goede struct vboxsf_handle { 16*0fd16957SHans de Goede u64 handle; 17*0fd16957SHans de Goede u32 root; 18*0fd16957SHans de Goede u32 access_flags; 19*0fd16957SHans de Goede struct kref refcount; 20*0fd16957SHans de Goede struct list_head head; 21*0fd16957SHans de Goede }; 22*0fd16957SHans de Goede 23*0fd16957SHans de Goede static int vboxsf_file_open(struct inode *inode, struct file *file) 24*0fd16957SHans de Goede { 25*0fd16957SHans de Goede struct vboxsf_inode *sf_i = VBOXSF_I(inode); 26*0fd16957SHans de Goede struct shfl_createparms params = {}; 27*0fd16957SHans de Goede struct vboxsf_handle *sf_handle; 28*0fd16957SHans de Goede u32 access_flags = 0; 29*0fd16957SHans de Goede int err; 30*0fd16957SHans de Goede 31*0fd16957SHans de Goede sf_handle = kmalloc(sizeof(*sf_handle), GFP_KERNEL); 32*0fd16957SHans de Goede if (!sf_handle) 33*0fd16957SHans de Goede return -ENOMEM; 34*0fd16957SHans de Goede 35*0fd16957SHans de Goede /* 36*0fd16957SHans de Goede * We check the value of params.handle afterwards to find out if 37*0fd16957SHans de Goede * the call succeeded or failed, as the API does not seem to cleanly 38*0fd16957SHans de Goede * distinguish error and informational messages. 39*0fd16957SHans de Goede * 40*0fd16957SHans de Goede * Furthermore, we must set params.handle to SHFL_HANDLE_NIL to 41*0fd16957SHans de Goede * make the shared folders host service use our mode parameter. 42*0fd16957SHans de Goede */ 43*0fd16957SHans de Goede params.handle = SHFL_HANDLE_NIL; 44*0fd16957SHans de Goede if (file->f_flags & O_CREAT) { 45*0fd16957SHans de Goede params.create_flags |= SHFL_CF_ACT_CREATE_IF_NEW; 46*0fd16957SHans de Goede /* 47*0fd16957SHans de Goede * We ignore O_EXCL, as the Linux kernel seems to call create 48*0fd16957SHans de Goede * beforehand itself, so O_EXCL should always fail. 49*0fd16957SHans de Goede */ 50*0fd16957SHans de Goede if (file->f_flags & O_TRUNC) 51*0fd16957SHans de Goede params.create_flags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS; 52*0fd16957SHans de Goede else 53*0fd16957SHans de Goede params.create_flags |= SHFL_CF_ACT_OPEN_IF_EXISTS; 54*0fd16957SHans de Goede } else { 55*0fd16957SHans de Goede params.create_flags |= SHFL_CF_ACT_FAIL_IF_NEW; 56*0fd16957SHans de Goede if (file->f_flags & O_TRUNC) 57*0fd16957SHans de Goede params.create_flags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS; 58*0fd16957SHans de Goede } 59*0fd16957SHans de Goede 60*0fd16957SHans de Goede switch (file->f_flags & O_ACCMODE) { 61*0fd16957SHans de Goede case O_RDONLY: 62*0fd16957SHans de Goede access_flags |= SHFL_CF_ACCESS_READ; 63*0fd16957SHans de Goede break; 64*0fd16957SHans de Goede 65*0fd16957SHans de Goede case O_WRONLY: 66*0fd16957SHans de Goede access_flags |= SHFL_CF_ACCESS_WRITE; 67*0fd16957SHans de Goede break; 68*0fd16957SHans de Goede 69*0fd16957SHans de Goede case O_RDWR: 70*0fd16957SHans de Goede access_flags |= SHFL_CF_ACCESS_READWRITE; 71*0fd16957SHans de Goede break; 72*0fd16957SHans de Goede 73*0fd16957SHans de Goede default: 74*0fd16957SHans de Goede WARN_ON(1); 75*0fd16957SHans de Goede } 76*0fd16957SHans de Goede 77*0fd16957SHans de Goede if (file->f_flags & O_APPEND) 78*0fd16957SHans de Goede access_flags |= SHFL_CF_ACCESS_APPEND; 79*0fd16957SHans de Goede 80*0fd16957SHans de Goede params.create_flags |= access_flags; 81*0fd16957SHans de Goede params.info.attr.mode = inode->i_mode; 82*0fd16957SHans de Goede 83*0fd16957SHans de Goede err = vboxsf_create_at_dentry(file_dentry(file), ¶ms); 84*0fd16957SHans de Goede if (err == 0 && params.handle == SHFL_HANDLE_NIL) 85*0fd16957SHans de Goede err = (params.result == SHFL_FILE_EXISTS) ? -EEXIST : -ENOENT; 86*0fd16957SHans de Goede if (err) { 87*0fd16957SHans de Goede kfree(sf_handle); 88*0fd16957SHans de Goede return err; 89*0fd16957SHans de Goede } 90*0fd16957SHans de Goede 91*0fd16957SHans de Goede /* the host may have given us different attr then requested */ 92*0fd16957SHans de Goede sf_i->force_restat = 1; 93*0fd16957SHans de Goede 94*0fd16957SHans de Goede /* init our handle struct and add it to the inode's handles list */ 95*0fd16957SHans de Goede sf_handle->handle = params.handle; 96*0fd16957SHans de Goede sf_handle->root = VBOXSF_SBI(inode->i_sb)->root; 97*0fd16957SHans de Goede sf_handle->access_flags = access_flags; 98*0fd16957SHans de Goede kref_init(&sf_handle->refcount); 99*0fd16957SHans de Goede 100*0fd16957SHans de Goede mutex_lock(&sf_i->handle_list_mutex); 101*0fd16957SHans de Goede list_add(&sf_handle->head, &sf_i->handle_list); 102*0fd16957SHans de Goede mutex_unlock(&sf_i->handle_list_mutex); 103*0fd16957SHans de Goede 104*0fd16957SHans de Goede file->private_data = sf_handle; 105*0fd16957SHans de Goede return 0; 106*0fd16957SHans de Goede } 107*0fd16957SHans de Goede 108*0fd16957SHans de Goede static void vboxsf_handle_release(struct kref *refcount) 109*0fd16957SHans de Goede { 110*0fd16957SHans de Goede struct vboxsf_handle *sf_handle = 111*0fd16957SHans de Goede container_of(refcount, struct vboxsf_handle, refcount); 112*0fd16957SHans de Goede 113*0fd16957SHans de Goede vboxsf_close(sf_handle->root, sf_handle->handle); 114*0fd16957SHans de Goede kfree(sf_handle); 115*0fd16957SHans de Goede } 116*0fd16957SHans de Goede 117*0fd16957SHans de Goede static int vboxsf_file_release(struct inode *inode, struct file *file) 118*0fd16957SHans de Goede { 119*0fd16957SHans de Goede struct vboxsf_inode *sf_i = VBOXSF_I(inode); 120*0fd16957SHans de Goede struct vboxsf_handle *sf_handle = file->private_data; 121*0fd16957SHans de Goede 122*0fd16957SHans de Goede /* 123*0fd16957SHans de Goede * When a file is closed on our (the guest) side, we want any subsequent 124*0fd16957SHans de Goede * accesses done on the host side to see all changes done from our side. 125*0fd16957SHans de Goede */ 126*0fd16957SHans de Goede filemap_write_and_wait(inode->i_mapping); 127*0fd16957SHans de Goede 128*0fd16957SHans de Goede mutex_lock(&sf_i->handle_list_mutex); 129*0fd16957SHans de Goede list_del(&sf_handle->head); 130*0fd16957SHans de Goede mutex_unlock(&sf_i->handle_list_mutex); 131*0fd16957SHans de Goede 132*0fd16957SHans de Goede kref_put(&sf_handle->refcount, vboxsf_handle_release); 133*0fd16957SHans de Goede return 0; 134*0fd16957SHans de Goede } 135*0fd16957SHans de Goede 136*0fd16957SHans de Goede /* 137*0fd16957SHans de Goede * Write back dirty pages now, because there may not be any suitable 138*0fd16957SHans de Goede * open files later 139*0fd16957SHans de Goede */ 140*0fd16957SHans de Goede static void vboxsf_vma_close(struct vm_area_struct *vma) 141*0fd16957SHans de Goede { 142*0fd16957SHans de Goede filemap_write_and_wait(vma->vm_file->f_mapping); 143*0fd16957SHans de Goede } 144*0fd16957SHans de Goede 145*0fd16957SHans de Goede static const struct vm_operations_struct vboxsf_file_vm_ops = { 146*0fd16957SHans de Goede .close = vboxsf_vma_close, 147*0fd16957SHans de Goede .fault = filemap_fault, 148*0fd16957SHans de Goede .map_pages = filemap_map_pages, 149*0fd16957SHans de Goede }; 150*0fd16957SHans de Goede 151*0fd16957SHans de Goede static int vboxsf_file_mmap(struct file *file, struct vm_area_struct *vma) 152*0fd16957SHans de Goede { 153*0fd16957SHans de Goede int err; 154*0fd16957SHans de Goede 155*0fd16957SHans de Goede err = generic_file_mmap(file, vma); 156*0fd16957SHans de Goede if (!err) 157*0fd16957SHans de Goede vma->vm_ops = &vboxsf_file_vm_ops; 158*0fd16957SHans de Goede 159*0fd16957SHans de Goede return err; 160*0fd16957SHans de Goede } 161*0fd16957SHans de Goede 162*0fd16957SHans de Goede /* 163*0fd16957SHans de Goede * Note that since we are accessing files on the host's filesystem, files 164*0fd16957SHans de Goede * may always be changed underneath us by the host! 165*0fd16957SHans de Goede * 166*0fd16957SHans de Goede * The vboxsf API between the guest and the host does not offer any functions 167*0fd16957SHans de Goede * to deal with this. There is no inode-generation to check for changes, no 168*0fd16957SHans de Goede * events / callback on changes and no way to lock files. 169*0fd16957SHans de Goede * 170*0fd16957SHans de Goede * To avoid returning stale data when a file gets *opened* on our (the guest) 171*0fd16957SHans de Goede * side, we do a "stat" on the host side, then compare the mtime with the 172*0fd16957SHans de Goede * last known mtime and invalidate the page-cache if they differ. 173*0fd16957SHans de Goede * This is done from vboxsf_inode_revalidate(). 174*0fd16957SHans de Goede * 175*0fd16957SHans de Goede * When reads are done through the read_iter fop, it is possible to do 176*0fd16957SHans de Goede * further cache revalidation then, there are 3 options to deal with this: 177*0fd16957SHans de Goede * 178*0fd16957SHans de Goede * 1) Rely solely on the revalidation done at open time 179*0fd16957SHans de Goede * 2) Do another "stat" and compare mtime again. Unfortunately the vboxsf 180*0fd16957SHans de Goede * host API does not allow stat on handles, so we would need to use 181*0fd16957SHans de Goede * file->f_path.dentry and the stat will then fail if the file was unlinked 182*0fd16957SHans de Goede * or renamed (and there is no thing like NFS' silly-rename). So we get: 183*0fd16957SHans de Goede * 2a) "stat" and compare mtime, on stat failure invalidate the cache 184*0fd16957SHans de Goede * 2b) "stat" and compare mtime, on stat failure do nothing 185*0fd16957SHans de Goede * 3) Simply always call invalidate_inode_pages2_range on the range of the read 186*0fd16957SHans de Goede * 187*0fd16957SHans de Goede * Currently we are keeping things KISS and using option 1. this allows 188*0fd16957SHans de Goede * directly using generic_file_read_iter without wrapping it. 189*0fd16957SHans de Goede * 190*0fd16957SHans de Goede * This means that only data written on the host side before open() on 191*0fd16957SHans de Goede * the guest side is guaranteed to be seen by the guest. If necessary 192*0fd16957SHans de Goede * we may provide other read-cache strategies in the future and make this 193*0fd16957SHans de Goede * configurable through a mount option. 194*0fd16957SHans de Goede */ 195*0fd16957SHans de Goede const struct file_operations vboxsf_reg_fops = { 196*0fd16957SHans de Goede .llseek = generic_file_llseek, 197*0fd16957SHans de Goede .read_iter = generic_file_read_iter, 198*0fd16957SHans de Goede .write_iter = generic_file_write_iter, 199*0fd16957SHans de Goede .mmap = vboxsf_file_mmap, 200*0fd16957SHans de Goede .open = vboxsf_file_open, 201*0fd16957SHans de Goede .release = vboxsf_file_release, 202*0fd16957SHans de Goede .fsync = noop_fsync, 203*0fd16957SHans de Goede .splice_read = generic_file_splice_read, 204*0fd16957SHans de Goede }; 205*0fd16957SHans de Goede 206*0fd16957SHans de Goede const struct inode_operations vboxsf_reg_iops = { 207*0fd16957SHans de Goede .getattr = vboxsf_getattr, 208*0fd16957SHans de Goede .setattr = vboxsf_setattr 209*0fd16957SHans de Goede }; 210*0fd16957SHans de Goede 211*0fd16957SHans de Goede static int vboxsf_readpage(struct file *file, struct page *page) 212*0fd16957SHans de Goede { 213*0fd16957SHans de Goede struct vboxsf_handle *sf_handle = file->private_data; 214*0fd16957SHans de Goede loff_t off = page_offset(page); 215*0fd16957SHans de Goede u32 nread = PAGE_SIZE; 216*0fd16957SHans de Goede u8 *buf; 217*0fd16957SHans de Goede int err; 218*0fd16957SHans de Goede 219*0fd16957SHans de Goede buf = kmap(page); 220*0fd16957SHans de Goede 221*0fd16957SHans de Goede err = vboxsf_read(sf_handle->root, sf_handle->handle, off, &nread, buf); 222*0fd16957SHans de Goede if (err == 0) { 223*0fd16957SHans de Goede memset(&buf[nread], 0, PAGE_SIZE - nread); 224*0fd16957SHans de Goede flush_dcache_page(page); 225*0fd16957SHans de Goede SetPageUptodate(page); 226*0fd16957SHans de Goede } else { 227*0fd16957SHans de Goede SetPageError(page); 228*0fd16957SHans de Goede } 229*0fd16957SHans de Goede 230*0fd16957SHans de Goede kunmap(page); 231*0fd16957SHans de Goede unlock_page(page); 232*0fd16957SHans de Goede return err; 233*0fd16957SHans de Goede } 234*0fd16957SHans de Goede 235*0fd16957SHans de Goede static struct vboxsf_handle *vboxsf_get_write_handle(struct vboxsf_inode *sf_i) 236*0fd16957SHans de Goede { 237*0fd16957SHans de Goede struct vboxsf_handle *h, *sf_handle = NULL; 238*0fd16957SHans de Goede 239*0fd16957SHans de Goede mutex_lock(&sf_i->handle_list_mutex); 240*0fd16957SHans de Goede list_for_each_entry(h, &sf_i->handle_list, head) { 241*0fd16957SHans de Goede if (h->access_flags == SHFL_CF_ACCESS_WRITE || 242*0fd16957SHans de Goede h->access_flags == SHFL_CF_ACCESS_READWRITE) { 243*0fd16957SHans de Goede kref_get(&h->refcount); 244*0fd16957SHans de Goede sf_handle = h; 245*0fd16957SHans de Goede break; 246*0fd16957SHans de Goede } 247*0fd16957SHans de Goede } 248*0fd16957SHans de Goede mutex_unlock(&sf_i->handle_list_mutex); 249*0fd16957SHans de Goede 250*0fd16957SHans de Goede return sf_handle; 251*0fd16957SHans de Goede } 252*0fd16957SHans de Goede 253*0fd16957SHans de Goede static int vboxsf_writepage(struct page *page, struct writeback_control *wbc) 254*0fd16957SHans de Goede { 255*0fd16957SHans de Goede struct inode *inode = page->mapping->host; 256*0fd16957SHans de Goede struct vboxsf_inode *sf_i = VBOXSF_I(inode); 257*0fd16957SHans de Goede struct vboxsf_handle *sf_handle; 258*0fd16957SHans de Goede loff_t off = page_offset(page); 259*0fd16957SHans de Goede loff_t size = i_size_read(inode); 260*0fd16957SHans de Goede u32 nwrite = PAGE_SIZE; 261*0fd16957SHans de Goede u8 *buf; 262*0fd16957SHans de Goede int err; 263*0fd16957SHans de Goede 264*0fd16957SHans de Goede if (off + PAGE_SIZE > size) 265*0fd16957SHans de Goede nwrite = size & ~PAGE_MASK; 266*0fd16957SHans de Goede 267*0fd16957SHans de Goede sf_handle = vboxsf_get_write_handle(sf_i); 268*0fd16957SHans de Goede if (!sf_handle) 269*0fd16957SHans de Goede return -EBADF; 270*0fd16957SHans de Goede 271*0fd16957SHans de Goede buf = kmap(page); 272*0fd16957SHans de Goede err = vboxsf_write(sf_handle->root, sf_handle->handle, 273*0fd16957SHans de Goede off, &nwrite, buf); 274*0fd16957SHans de Goede kunmap(page); 275*0fd16957SHans de Goede 276*0fd16957SHans de Goede kref_put(&sf_handle->refcount, vboxsf_handle_release); 277*0fd16957SHans de Goede 278*0fd16957SHans de Goede if (err == 0) { 279*0fd16957SHans de Goede ClearPageError(page); 280*0fd16957SHans de Goede /* mtime changed */ 281*0fd16957SHans de Goede sf_i->force_restat = 1; 282*0fd16957SHans de Goede } else { 283*0fd16957SHans de Goede ClearPageUptodate(page); 284*0fd16957SHans de Goede } 285*0fd16957SHans de Goede 286*0fd16957SHans de Goede unlock_page(page); 287*0fd16957SHans de Goede return err; 288*0fd16957SHans de Goede } 289*0fd16957SHans de Goede 290*0fd16957SHans de Goede static int vboxsf_write_end(struct file *file, struct address_space *mapping, 291*0fd16957SHans de Goede loff_t pos, unsigned int len, unsigned int copied, 292*0fd16957SHans de Goede struct page *page, void *fsdata) 293*0fd16957SHans de Goede { 294*0fd16957SHans de Goede struct inode *inode = mapping->host; 295*0fd16957SHans de Goede struct vboxsf_handle *sf_handle = file->private_data; 296*0fd16957SHans de Goede unsigned int from = pos & ~PAGE_MASK; 297*0fd16957SHans de Goede u32 nwritten = len; 298*0fd16957SHans de Goede u8 *buf; 299*0fd16957SHans de Goede int err; 300*0fd16957SHans de Goede 301*0fd16957SHans de Goede /* zero the stale part of the page if we did a short copy */ 302*0fd16957SHans de Goede if (!PageUptodate(page) && copied < len) 303*0fd16957SHans de Goede zero_user(page, from + copied, len - copied); 304*0fd16957SHans de Goede 305*0fd16957SHans de Goede buf = kmap(page); 306*0fd16957SHans de Goede err = vboxsf_write(sf_handle->root, sf_handle->handle, 307*0fd16957SHans de Goede pos, &nwritten, buf + from); 308*0fd16957SHans de Goede kunmap(page); 309*0fd16957SHans de Goede 310*0fd16957SHans de Goede if (err) { 311*0fd16957SHans de Goede nwritten = 0; 312*0fd16957SHans de Goede goto out; 313*0fd16957SHans de Goede } 314*0fd16957SHans de Goede 315*0fd16957SHans de Goede /* mtime changed */ 316*0fd16957SHans de Goede VBOXSF_I(inode)->force_restat = 1; 317*0fd16957SHans de Goede 318*0fd16957SHans de Goede if (!PageUptodate(page) && nwritten == PAGE_SIZE) 319*0fd16957SHans de Goede SetPageUptodate(page); 320*0fd16957SHans de Goede 321*0fd16957SHans de Goede pos += nwritten; 322*0fd16957SHans de Goede if (pos > inode->i_size) 323*0fd16957SHans de Goede i_size_write(inode, pos); 324*0fd16957SHans de Goede 325*0fd16957SHans de Goede out: 326*0fd16957SHans de Goede unlock_page(page); 327*0fd16957SHans de Goede put_page(page); 328*0fd16957SHans de Goede 329*0fd16957SHans de Goede return nwritten; 330*0fd16957SHans de Goede } 331*0fd16957SHans de Goede 332*0fd16957SHans de Goede /* 333*0fd16957SHans de Goede * Note simple_write_begin does not read the page from disk on partial writes 334*0fd16957SHans de Goede * this is ok since vboxsf_write_end only writes the written parts of the 335*0fd16957SHans de Goede * page and it does not call SetPageUptodate for partial writes. 336*0fd16957SHans de Goede */ 337*0fd16957SHans de Goede const struct address_space_operations vboxsf_reg_aops = { 338*0fd16957SHans de Goede .readpage = vboxsf_readpage, 339*0fd16957SHans de Goede .writepage = vboxsf_writepage, 340*0fd16957SHans de Goede .set_page_dirty = __set_page_dirty_nobuffers, 341*0fd16957SHans de Goede .write_begin = simple_write_begin, 342*0fd16957SHans de Goede .write_end = vboxsf_write_end, 343*0fd16957SHans de Goede }; 344*0fd16957SHans de Goede 345*0fd16957SHans de Goede static const char *vboxsf_get_link(struct dentry *dentry, struct inode *inode, 346*0fd16957SHans de Goede struct delayed_call *done) 347*0fd16957SHans de Goede { 348*0fd16957SHans de Goede struct vboxsf_sbi *sbi = VBOXSF_SBI(inode->i_sb); 349*0fd16957SHans de Goede struct shfl_string *path; 350*0fd16957SHans de Goede char *link; 351*0fd16957SHans de Goede int err; 352*0fd16957SHans de Goede 353*0fd16957SHans de Goede if (!dentry) 354*0fd16957SHans de Goede return ERR_PTR(-ECHILD); 355*0fd16957SHans de Goede 356*0fd16957SHans de Goede path = vboxsf_path_from_dentry(sbi, dentry); 357*0fd16957SHans de Goede if (IS_ERR(path)) 358*0fd16957SHans de Goede return ERR_CAST(path); 359*0fd16957SHans de Goede 360*0fd16957SHans de Goede link = kzalloc(PATH_MAX, GFP_KERNEL); 361*0fd16957SHans de Goede if (!link) { 362*0fd16957SHans de Goede __putname(path); 363*0fd16957SHans de Goede return ERR_PTR(-ENOMEM); 364*0fd16957SHans de Goede } 365*0fd16957SHans de Goede 366*0fd16957SHans de Goede err = vboxsf_readlink(sbi->root, path, PATH_MAX, link); 367*0fd16957SHans de Goede __putname(path); 368*0fd16957SHans de Goede if (err) { 369*0fd16957SHans de Goede kfree(link); 370*0fd16957SHans de Goede return ERR_PTR(err); 371*0fd16957SHans de Goede } 372*0fd16957SHans de Goede 373*0fd16957SHans de Goede set_delayed_call(done, kfree_link, link); 374*0fd16957SHans de Goede return link; 375*0fd16957SHans de Goede } 376*0fd16957SHans de Goede 377*0fd16957SHans de Goede const struct inode_operations vboxsf_lnk_iops = { 378*0fd16957SHans de Goede .get_link = vboxsf_get_link 379*0fd16957SHans de Goede }; 380