VirtualBox

Ignore:
Timestamp:
Jul 8, 2008 6:23:10 AM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
32975
Message:

Solaris vboxvfs bits.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/solaris/SharedFolders/vboxvfs.h

    r10140 r10347  
    6262    int             Gid;
    6363    vfs_t           *pVFS;
    64     vnode_t         *pVNodeDev;
    6564    vboxvfs_vnode_t *pVNodeRoot;
    6665    kmutex_t        MtxFS;
  • trunk/src/VBox/Additions/solaris/SharedFolders/vboxvfs_vfsops.c

    r10338 r10347  
    2121#include <sys/mount.h>
    2222#include <sys/policy.h>
     23#include <sys/atomic.h>
     24#include <sys/sysmacros.h>
    2325#include <sys/ddi.h>
    2426#include <sys/sunddi.h>
     
    121123*   Global Variables                                                           *
    122124*******************************************************************************/
    123 /** Opaque pointer to list of states. */
    124 static void *g_pVBoxVFSState;
    125125/** GCC C++ hack. */
    126126unsigned __gxx_personality_v0 = 0xdecea5ed;
     
    131131/** The file system type identifier. */
    132132static int g_VBoxVFSType;
     133/** Major number of this module */
     134static major_t g_VBoxVFSMajor;
     135/** Minor instance number */
     136static minor_t g_VBoxVFSMinor;
     137/** Minor lock mutex protection */
     138static kmutex_t g_VBoxVFSMinorMtx;
    133139
    134140
     
    205211                    if (!rc)
    206212                    {
    207                         LogFlow((DEVICE_NAME ":Successfully loaded vboxvfs.\n"));
    208                         return 0;
     213                        /* Get a free major number. */
     214                        g_VBoxVFSMajor = getudev();
     215                        if (g_VBoxVFSMajor != (major_t)-1)
     216                        {
     217                            /* Initialize minor mutex here. */
     218                            mutex_init(&g_VBoxVFSMinorMtx, "VBoxVFSMinorMtx", MUTEX_DEFAULT, NULL);
     219                            LogFlow((DEVICE_NAME ":Successfully loaded vboxvfs.\n"));
     220                            return 0;
     221                        }
     222                        else
     223                        {
     224                            LogRel((DEVICE_NAME ":getudev failed.\n"));
     225                            rc = EMFILE;
     226                        }
    209227                    }
    210228                    else
     
    273291
    274292    mutex_enter(&pVNode->v_lock);
    275     if (   !(pMount->flags & MS_REMOUNT)
    276         && !(pMount->flags & MS_OVERLAY)
    277         && (pVNode->v_count > 1 || (pVNode->v_flag & VROOT)))
     293    if (   !(pMount->flags & MS_OVERLAY)
     294        &&  (pVNode->v_count > 1 || (pVNode->v_flag & VROOT)))
    278295    {
    279296        LogRel((DEVICE_NAME ":VBoxVFS_Mount: device busy.\n"));
     
    311328    if (!rc)
    312329    {
    313         /* Get the vnode for the special file for storing the device identifier and path. */
    314         rc = lookupname(PathName.pn_path, AddrSpace, FOLLOW, NULLVPP, &pVNodeSpec);
    315         if (!rc)
    316         {
    317             /* Check if user has permission to use the special file for mounting. */
    318             rc = vboxvfs_CheckMountPerm(pVFS, pMount, pVNodeSpec, pCred);
    319             VN_RELE(pVNodeSpec);
    320             if (!rc)
    321             {
    322                 Dev = pVNodeSpec->v_rdev;
    323                 memcpy(pszShare, PathName.pn_path, strlen(PathName.pn_path));
    324                 cbShare = strlen(pszShare);
    325             }
    326             else
    327                 LogRel((DEVICE_NAME ":VBoxVFS_Mount: invalid permissions to mount %s.rc=%d\n", pszShare, rc));
    328             rc = EPERM;
    329         }
     330        /* Get an available minor instance number for this mount. */
     331        mutex_enter(&g_VBoxVFSMinorMtx);
     332        do
     333        {
     334            atomic_add_32_nv(&g_VBoxVFSMinor, 1) & L_MAXMIN32;
     335            Dev = makedevice(g_VBoxVFSMajor, g_VBoxVFSMinor);
     336        } while (vfs_devismounted(Dev));
     337        mutex_exit(&g_VBoxVFSMinorMtx);
     338
     339        cbShare = strlen(PathName.pn_path);
     340        pszShare = RTMemAlloc(cbShare);
     341        if (pszShare)
     342            memcpy(pszShare, PathName.pn_path, cbShare);
    330343        else
    331             LogRel((DEVICE_NAME ":VBoxVFS_Mount: failed to lookup sharename.rc=%d\n", rc));
     344        {
     345            LogRel((DEVICE_NAME ":VBoxVFS_Mount: failed to alloc %d bytes for sharename.\n", cbShare));
     346            rc = ENOMEM;
     347        }
     348    }
     349    else
     350    {
     351        LogRel((DEVICE_NAME ":VBoxVFS_Mount: failed to get sharename.rc=%d\n", rc));
    332352        rc = EINVAL;
    333353    }
    334     else
    335     {
    336         LogRel((DEVICE_NAME ":VBoxVFS_Mount: failed to get special file path.rc=%d\n", rc));
    337         rc = EINVAL;
    338     }
    339354    pn_free(&PathName);
    340355
    341356    if (rc)
    342         return rc;
    343 
    344     /* Get VNode of the special file being mounted. */
    345     pVNodeDev = makespecvp(Dev, VBLK);
    346     if (!IS_SWAPVP(pVNodeDev))
    347     {
    348         /* Open the vnode for mounting. */
    349         rc = VOP_OPEN(&pVNodeDev, (pVFS->vfs_flag & VFS_RDONLY) ? FREAD : FREAD | FWRITE, pCred, NULL);
    350         if (rc)
    351         {
    352             LogRel((DEVICE_NAME ":VBoxVFS_Mount: failed to mount.\n"));
    353             rc = EINVAL;
    354         }
    355     }
    356     else
    357     {
    358         LogRel((DEVICE_NAME ":VBoxVFS_Mount: cannot mount from swap.\n"));
    359         rc = EINVAL;
    360     }
    361     if (!rc)
    362     {
    363         VN_RELE(pVNodeDev);
     357    {
     358        if (pszShare)
     359            RTMemFree(pszShare);
    364360        return rc;
    365361    }
     
    410406    pVBoxVFSGlobalInfo->Gid = Gid;
    411407    pVBoxVFSGlobalInfo->pVFS = pVFS;
    412     pVBoxVFSGlobalInfo->pVNodeDev = pVNodeDev;
    413408    pVFS->vfs_data = pVBoxVFSGlobalInfo;
    414409    pVFS->vfs_fstype = g_VBoxVFSType;
     
    464459    /* Undo work in reverse. */
    465460mntError1:
    466     /* Just release the mount location. */
    467     VOP_CLOSE(pVNodeDev, (pVFS->vfs_flag & VFS_RDONLY) ? FREAD : FREAD | FWRITE, 1, (offset_t)0, pCred, NULL);
    468     VN_RELE(pVNodeDev);
     461    RTMemFree(pszShare);
    469462    return rc;
    470463}
Note: See TracChangeset for help on using the changeset viewer.

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