VirtualBox

Changeset 38901 in vbox


Ignore:
Timestamp:
Sep 29, 2011 2:29:44 PM (13 years ago)
Author:
vboxsync
Message:

Additions/solaris/SharedFolders: readonly MMAP support.

Location:
trunk/src/VBox/Additions/solaris/SharedFolders
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/solaris/SharedFolders/vboxfs_vnode.c

    r38854 r38901  
    9797#include "vboxfs_vfs.h"
    9898
     99#define VBOXVFS_WITH_MMAP
     100
    99101static struct vnodeops *sffs_ops = NULL;
    100102
     
    212214                vp->v_vfsp = node->sf_sffs->sf_vfsp;
    213215                vn_setops(vp, sffs_ops);
    214                 vp->v_flag = VNOSWAP | VNOMAP;  /* @todo -XXX- remove VNOMAP when ro-mmap is working*/
     216                vp->v_flag = VNOSWAP;
     217#ifndef VBOXVFS_WITH_MMAP
     218                vp->v_flag |= VNOMAP;
     219#endif
    215220                vn_exists(vp);
    216221                vp->v_data = node;
     
    14051410        }
    14061411
    1407 #if 0
     1412#ifdef VBOXVFS_WITH_MMAP
    14081413        if (vn_vfswlock(vp)) {
    14091414                VN_RELE(vp);
     
    14571462
    14581463
    1459 #if 0
     1464#ifdef VBOXVFS_WITH_MMAP
    14601465static caddr_t
    14611466sffs_page_map(
     
    14871492 * the file data into it.
    14881493 */
    1489 int
     1494static int
    14901495sffs_readpages(
    14911496        vnode_t         *dvp,
     
    15091514        ASSERT(node->sf_file);
    15101515
    1511         cmn_err(CE_NOTE, "sffs_readpages\n");
    15121516        if (pagelistsize == PAGESIZE)
    15131517        {
    15141518                io_off = off;
    15151519                io_len = PAGESIZE;
    1516 
    1517                 cmn_err(CE_NOTE, "sffs_readpages io_off=%lld io_len=%lld\n", (u_longlong_t)io_off, (u_longlong_t)io_len);
    1518 
    15191520                ppages = page_create_va(dvp, io_off, io_len, PG_WAIT | PG_EXCL, segp, addr);
    15201521        }
     
    15251526        if (!ppages)
    15261527        {
    1527                 cmn_err(CE_NOTE, "sffs_readpages nothing done\n");
    15281528                *pagelist = NULL;
    15291529                return (0);
     
    15391539                ASSERT3U(io_off, ==, pcur->p_offset);
    15401540
    1541                 cmn_err(CE_NOTE, "sffs_readpages page-by-page reading io_off=%lld\n", (u_longlong_t)io_off);
    15421541                caddr_t virtaddr = sffs_page_map(pcur, segaccess);
    15431542                uint32_t bytes = PAGESIZE;
    15441543                error = sfprov_read(node->sf_file, virtaddr, io_off, &bytes);
    15451544                sffs_page_unmap(pcur, virtaddr);
    1546                 if (error != 0 || bytes < PAGESIZE)
     1545                if (error != 0)
    15471546                {
     1547                        cmn_err(CE_WARN, "sffs_readpages: sfprov_read() failed. error=%d bytes=%ld\n", error, bytes);
    15481548                        /* Get rid of all kluster pages read & bail.  */
    15491549                        pvn_read_done(ppages,  B_ERROR);
     
    15591559        pvn_plist_init(ppages, pagelist, pagelistsize, off, io_len, segaccess);
    15601560        ASSERT(pagelist == NULL || (*pagelist)->p_offset == off);
    1561         cmn_err(CE_NOTE, "sffs_readpages done\n");
    1562 
    15631561        return (0);
    15641562}
     
    16311629                }
    16321630
    1633                 cmn_err(CE_NOTE, "sffs_getpage addr=%p len=%lld off=%lld\n", addr, (u_longlong_t)len, (u_longlong_t)off);
    16341631                while (*pagelist)
    16351632                {
     
    16611658        *pagelist = NULL;
    16621659        mutex_exit(&sffs_lock);
    1663         cmn_err(CE_NOTE,  "sffs_getpage done\n");
    16641660        return (error);
    16651661}
     
    16841680         */
    16851681        return (ENOSYS);
     1682}
     1683
     1684
     1685/*ARGSUSED*/
     1686static int
     1687sffs_discardpage(
     1688        vnode_t         *dvp,
     1689        page_t          *ppage,
     1690        u_offset_t      *poff,
     1691        size_t          *plen,
     1692        int                     flags,
     1693        cred_t          *pcred)
     1694{
     1695        /*
     1696         * We don't support PROT_WRITE mmaps. Just pretend we're done writing back
     1697         * to the disk while unmounting/closing the node and discarding the mapped pages.
     1698         */
     1699        pvn_write_done(ppage, B_INVAL | B_ERROR | B_FORCE);
     1700        return (0);
    16861701}
    16871702
     
    17951810
    17961811        ASSERT(node);
    1797         ASMAtomicAddU64(&node->sf_mapcnt, npages);
    17981812        return (0);
    17991813}
     
    18231837                return (ENOSYS);
    18241838
    1825         ASSERT(node->sf_mapcnt >= npages);
    1826         ASMAtomicSubU64(&node->sf_mapcnt, npages);
    18271839        return (0);
    18281840}
    1829 #endif
     1841#endif /* VBOXVFS_WITH_MMAP */
    18301842
    18311843
     
    20042016        }
    20052017
    2006         /*
    2007          * There should never be cached data, since we don't support mmap().
    2008          */
    2009         if (vn_has_cached_data(vp))
     2018        if (vn_has_cached_data(vp)) {
     2019#ifdef VBOXVFS_WITH_MMAP
     2020                /* We're fine with releasing the vnode lock here as we should be covered by the sffs_lock */
     2021                mutex_exit(&vp->v_lock);
     2022                pvn_vplist_dirty(vp, 0 /* offset */, sffs_discardpage, B_INVAL, cr);
     2023                mutex_enter(&vp->v_lock);
     2024#else
    20102025                panic("sffs_inactive() found cached data");
     2026#endif
     2027        }
    20112028
    20122029        /*
     
    21372154        VOPNAME_WRITE,          sffs_write,
    21382155
    2139 # if 0
     2156# ifdef VBOXVFS_WITH_MMAP
    21402157        VOPNAME_MAP,            sffs_map,
    21412158        VOPNAME_ADDMAP,         sffs_addmap,
     
    21682185        VOPNAME_WRITE,          { .vop_write = sffs_write },
    21692186
    2170 # if 0
     2187# ifdef VBOXVFS_WITH_MMAP
    21712188        VOPNAME_MAP,            { .vop_map = sffs_map },
    21722189        VOPNAME_ADDMAP,         { .vop_addmap = sffs_addmap },
  • trunk/src/VBox/Additions/solaris/SharedFolders/vboxfs_vnode.h

    r37806 r38901  
    6161        sffs_dirents_t  *sf_dir_list;   /* list of entries for this directory */
    6262        sffs_stats_t    *sf_dir_stats;  /* file attrs for the above entries */
    63 #if 0
    64     volatile uint64_t   sf_mapcnt;  /* number of mapped pages */
    65 #endif
    6663} sfnode_t;
    6764
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette