VirtualBox

Changeset 77054 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Jan 30, 2019 5:40:43 PM (6 years ago)
Author:
vboxsync
Message:

linux/vboxsf: Started converting the code to use the more efficient interfaces in VBoxGuestLibSharedFoldersInline.h. Some minor fixes and cleanups. bugref:9172

Location:
trunk/src/VBox/Additions
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibSharedFolders.c

    r76553 r77054  
    6666
    6767
    68 /** @todo We only need HGCM, not physical memory, so other guests should also
    69  *        switch to calling vbglR0HGCMInit() and vbglR0HGCMTerminate() instead
    70  *        of VbglR0SfInit() and VbglR0SfTerm(). */
    71 #ifndef RT_OS_LINUX
    7268DECLVBGL(int) VbglR0SfInit(void)
    7369{
     
    7975    VbglR0TerminateClient();
    8076}
    81 #endif
    8277
    8378DECLVBGL(int) VbglR0SfConnect(PVBGLSFCLIENT pClient)
  • trunk/src/VBox/Additions/linux/sharedfolders/Makefile.module

    r76733 r77054  
    2929        regops.o \
    3030        utils.o \
     31        VBoxGuestR0LibGenericRequest.o \
    3132        VBoxGuestR0LibHGCM.o \
    3233        VBoxGuestR0LibIdc.o \
    3334        VBoxGuestR0LibIdc-unix.o \
     35        VBoxGuestR0LibInit.o \
     36        VBoxGuestR0LibPhysHeap.o \
    3437        VBoxGuestR0LibSharedFolders.o
    3538ifeq ($(BUILD_TARGET_ARCH),x86)
     
    6265 MOD_DEFS += -DRT_ARCH_X86
    6366endif
     67ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     68 MOD_DEFS += -DVBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     69endif
    6470
    6571ifeq ($(KERN_VERSION), 24)
     
    8692 endif
    8793endif
     94ifdef VBOX_NO_OMIT_FRAME_POINTER
     95 MOD_CFLAGS += -fno-omit-frame-pointer
     96endif
    8897
    8998MOD_CLEAN = . linux r0drv r0drv/linux
  • trunk/src/VBox/Additions/linux/sharedfolders/dirops.c

    r76744 r77054  
    3232#include <iprt/err.h>
    3333
     34/** Reads or re-reads a directory.
     35 *
     36 * @note As suggested a couple of other places, we should probably stop
     37 *       reading in the whole directory on open.
     38 */
     39static int sf_dir_open_worker(struct sf_glob_info *sf_g, struct sf_dir_info *sf_d,
     40                              struct sf_inode_info *sf_i, const char *pszCaller)
     41{
     42    int rc;
     43    int err;
     44#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     45    SHFLCREATEPARMS CreateParms;
     46    SHFLCREATEPARMS *pCreateParms = &CreateParms;
     47#else
     48    union SfDirOpenCloseReq
     49    {
     50        VBOXSFCREATEREQ Create;
     51        VBOXSFCLOSEREQ  Close;
     52    } *pReq;
     53    SHFLCREATEPARMS *pCreateParms;
     54#endif
     55
     56#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     57    pReq = (union SfDirOpenCloseReq *)VbglR0PhysHeapAlloc(RT_UOFFSETOF(VBOXSFCREATEREQ, StrPath.String)
     58                                                          + sf_i->path->u16Size);
     59    if (pReq) {
     60            memcpy(&pReq->Create.StrPath, sf_i->path, SHFLSTRING_HEADER_SIZE + sf_i->path->u16Size);
     61            pCreateParms = &pReq->Create.CreateParms;
     62    } else {
     63            LogRelMaxFunc(64, ("failed to allocate %zu bytes for '%s' [caller: %s]\n",
     64                               RT_UOFFSETOF(VBOXSFCREATEREQ, StrPath.String) + sf_i->path->u16Size,
     65                               sf_i->path->String.ach, pszCaller));
     66            return -ENOMEM;
     67    }
     68#endif
     69
     70    RT_ZERO(*pCreateParms);
     71    pCreateParms->Handle = SHFL_HANDLE_NIL;
     72    pCreateParms->CreateFlags = SHFL_CF_DIRECTORY
     73                              | SHFL_CF_ACT_OPEN_IF_EXISTS
     74                              | SHFL_CF_ACT_FAIL_IF_NEW
     75                              | SHFL_CF_ACCESS_READ;
     76
     77#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     78    LogFunc(("calling VbglR0SfCreate, folder %s, flags %#x [caller: %s]\n",
     79             sf_i->path->String.utf8, pCreateParms->CreateFlags, pszCaller));
     80    rc = VbglR0SfCreate(&client_handle, &sf_g->map, sf_i->path, pCreateParms);
     81#else
     82    LogFunc(("calling VbglR0SfHostReqCreate on folder %s, flags %#x [caller: %s]\n",
     83             sf_i->path->String.utf8, pCreateParms->CreateFlags, pszCaller));
     84    rc = VbglR0SfHostReqCreate(sf_g->map.root, &pReq->Create);
     85#endif
     86    if (RT_SUCCESS(rc)) {
     87            if (pCreateParms->Result == SHFL_FILE_EXISTS) {
     88
     89                    /** @todo We could refresh the inode information here since SHFL_FN_CREATE
     90                     * returns updated object information. */
     91
     92                    /** @todo Touch the dentries from here to the mount root since a successful
     93                     * open means that the whole path is valid.  I believe CIFS does this. */
     94
     95                    /** @todo Reading all entries upon opening the directory doesn't seem like
     96                     * a good idea. */
     97                    sf_dir_info_empty(sf_d);
     98                    err = sf_dir_read_all(sf_g, sf_i, sf_d, pCreateParms->Handle);
     99            } else
     100                    err = -ENOENT;
     101
     102#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     103            rc = VbglR0SfClose(&client_handle, &sf_g->map, pCreateParms->Handle);
     104            if (RT_FAILURE(rc))
     105                    LogFunc(("VbglR0SfClose(%s) after err=%d failed rc=%Rrc caller=%s\n",
     106                             sf_i->path->String.utf8, err, rc, pszCaller));
     107#else
     108            AssertCompile(RTASSERT_OFFSET_OF(VBOXSFCREATEREQ, CreateParms.Handle) > sizeof(VBOXSFCLOSEREQ)); /* no aliasing issues */
     109            if (pCreateParms->Handle != SHFL_HANDLE_NIL)
     110            {
     111                rc = VbglR0SfHostReqClose(sf_g->map.root, &pReq->Close, pCreateParms->Handle);
     112                if (RT_FAILURE(rc))
     113                        LogFunc(("VbglR0SfHostReqCloseSimple(%s) after err=%d failed rc=%Rrc caller=%s\n",
     114                                 sf_i->path->String.utf8, err, rc, pszCaller));
     115            }
     116#endif
     117    } else
     118            err = -EPERM;
     119
     120#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     121    VbglR0PhysHeapFree(pReq);
     122#endif
     123
     124    return err;
     125}
     126
    34127/**
    35128 * Open a directory. Read the complete content into a buffer.
     
    41134static int sf_dir_open(struct inode *inode, struct file *file)
    42135{
    43         int rc;
    44136        int err;
    45137        struct sf_glob_info *sf_g = GET_GLOB_INFO(inode->i_sb);
    46138        struct sf_dir_info *sf_d;
    47139        struct sf_inode_info *sf_i = GET_INODE_INFO(inode);
    48         SHFLCREATEPARMS params;
    49140
    50141        TRACE();
     
    53144
    54145        if (file->private_data) {
    55                 LogFunc(("sf_dir_open() called on already opened directory '%s'\n", sf_i->path->String.utf8));
     146                LogFunc(("called on already opened directory '%s'!\n", sf_i->path->String.ach));
    56147                return 0;
    57148        }
     
    59150        sf_d = sf_dir_info_alloc();
    60151        if (!sf_d) {
    61                 LogRelFunc(("could not allocate directory info for '%s'\n",
    62                             sf_i->path->String.utf8));
     152                LogRelFunc(("could not allocate directory info for '%s'\n", sf_i->path->String.ach));
    63153                return -ENOMEM;
    64154        }
    65155
    66         RT_ZERO(params);
    67         params.Handle = SHFL_HANDLE_NIL;
    68         params.CreateFlags = 0
    69             | SHFL_CF_DIRECTORY
    70             | SHFL_CF_ACT_OPEN_IF_EXISTS
    71             | SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_READ;
    72 
    73         LogFunc(("sf_dir_open(): calling VbglR0SfCreate, folder %s, flags %#x\n", sf_i->path->String.utf8, params.CreateFlags));
    74         rc = VbglR0SfCreate(&client_handle, &sf_g->map, sf_i->path, &params);
    75         if (RT_SUCCESS(rc)) {
    76                 if (params.Result == SHFL_FILE_EXISTS) {
    77                         err = sf_dir_read_all(sf_g, sf_i, sf_d, params.Handle);
    78                         if (!err)
    79                                 file->private_data = sf_d;
    80                 } else
    81                         err = -ENOENT;
    82 
    83                 rc = VbglR0SfClose(&client_handle, &sf_g->map, params.Handle);
    84                 if (RT_FAILURE(rc))
    85                         LogFunc(("sf_dir_open(): VbglR0SfClose(%s) after err=%d failed rc=%Rrc\n", sf_i->path->String.utf8, err, rc));
    86         } else
    87                 err = -EPERM;
    88 
    89         if (err)
     156        err = sf_dir_open_worker(sf_g, sf_d, sf_i, "sf_dir_open");
     157        if (!err)
     158                file->private_data = sf_d;
     159        else
    90160                sf_dir_info_free(sf_d);
    91161
     
    178248
    179249        if (sf_i->force_reread) {
    180                 int rc;
    181                 int err;
    182                 SHFLCREATEPARMS params;
    183 
    184                 RT_ZERO(params);
    185                 params.Handle = SHFL_HANDLE_NIL;
    186                 params.CreateFlags = 0
    187                     | SHFL_CF_DIRECTORY
    188                     | SHFL_CF_ACT_OPEN_IF_EXISTS
    189                     | SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_READ;
    190 
    191                 LogFunc(("sf_getdent: calling VbglR0SfCreate, folder %s, flags %#x\n", sf_i->path->String.utf8, params.CreateFlags));
    192                 rc = VbglR0SfCreate(&client_handle, &sf_g->map, sf_i->path,
    193                                     &params);
    194                 if (RT_FAILURE(rc)) {
    195                         LogFunc(("VbglR0SfCreate(%s) failed rc=%Rrc\n",
    196                                  sf_i->path->String.utf8, rc));
    197                         return -EPERM;
    198                 }
    199 
    200                 if (params.Result != SHFL_FILE_EXISTS) {
    201                         LogFunc(("directory %s does not exist\n",
    202                                  sf_i->path->String.utf8));
    203                         sf_dir_info_free(sf_d);
    204                         return -ENOENT;
    205                 }
    206 
    207                 sf_dir_info_empty(sf_d);
    208                 err = sf_dir_read_all(sf_g, sf_i, sf_d, params.Handle);
    209                 rc = VbglR0SfClose(&client_handle, &sf_g->map, params.Handle);
    210                 if (RT_FAILURE(rc))
    211                         LogFunc(("VbglR0SfClose(%s) failed rc=%Rrc\n",
    212                                  sf_i->path->String.utf8, rc));
    213                 if (err)
     250                int err = sf_dir_open_worker(sf_g, sf_d, sf_i, "sf_getdent");
     251                if (!err) {
     252                        sf_i->force_reread = 0;
     253                } else {
     254                        if (err == -ENOENT) {
     255                                sf_dir_info_free(sf_d);
     256                                dir->private_data = NULL;
     257                        }
    214258                        return err;
    215 
    216                 sf_i->force_reread = 0;
     259                }
    217260        }
    218261
     
    233276                        size_t size;
    234277
    235                         size =
    236                             offsetof(SHFLDIRINFO,
    237                                      name.String) + info->name.u16Size;
    238                         info = (SHFLDIRINFO *) ((uintptr_t) info + size);
     278                        size = offsetof(SHFLDIRINFO, name.String)
     279                             + info->name.u16Size;
     280                        info = (SHFLDIRINFO *)((uintptr_t)info + size);
    239281                }
    240282
     
    322364                }
    323365#else
    324                 err =
    325                     filldir(opaque, d_name, strlen(d_name), dir->f_pos,
    326                             fake_ino, d_type);
     366                err = filldir(opaque, d_name, strlen(d_name),
     367                              dir->f_pos, fake_ino, d_type);
    327368                if (err) {
    328369                        LogFunc(("filldir returned error %d\n", err));
     
    535576{
    536577        int rc, err;
    537         SHFLCREATEPARMS params;
    538         SHFLSTRING *path;
    539578        struct sf_inode_info *sf_i = GET_INODE_INFO(parent);
    540579        struct sf_glob_info *sf_g = GET_GLOB_INFO(parent->i_sb);
     580        SHFLSTRING *path;
     581#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     582        SHFLCREATEPARMS CreateParms;
     583        SHFLCREATEPARMS *pCreateParms = &CreateParms;
     584#else
     585        union CreateAuxReq
     586        {
     587            VBOXSFCREATEREQ Create;
     588            VBOXSFCLOSEREQ  Close;
     589        } *pReq;
     590        SHFLCREATEPARMS *pCreateParms;
     591#endif
    541592
    542593        TRACE();
     
    548599                goto fail0;
    549600
    550         RT_ZERO(params);
    551         params.Handle = SHFL_HANDLE_NIL;
    552         params.CreateFlags = 0
    553             | SHFL_CF_ACT_CREATE_IF_NEW
    554             | SHFL_CF_ACT_FAIL_IF_EXISTS
    555             | SHFL_CF_ACCESS_READWRITE | (fDirectory ? SHFL_CF_DIRECTORY : 0);
    556         params.Info.Attr.fMode = 0
    557             | (fDirectory ? RTFS_TYPE_DIRECTORY : RTFS_TYPE_FILE)
    558             | (mode & S_IRWXUGO);
    559         params.Info.Attr.enmAdditional = RTFSOBJATTRADD_NOTHING;
    560 
    561         LogFunc(("sf_create_aux: calling VbglR0SfCreate, folder %s, flags %#x\n", path->String.utf8, params.CreateFlags));
    562         rc = VbglR0SfCreate(&client_handle, &sf_g->map, path, &params);
     601#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     602        /** @todo combine with sf_path_from_dentry? */
     603        pReq = (union CreateAuxReq *)VbglR0PhysHeapAlloc(RT_UOFFSETOF(VBOXSFCREATEREQ, StrPath.String) + path->u16Size);
     604        if (pReq) {
     605                memcpy(&pReq->Create.StrPath, path, SHFLSTRING_HEADER_SIZE + path->u16Size);
     606                pCreateParms = &pReq->Create.CreateParms;
     607        } else {
     608                err = -ENOMEM;
     609                goto fail1;
     610        }
     611#endif
     612
     613        RT_ZERO(*pCreateParms);
     614        pCreateParms->Handle = SHFL_HANDLE_NIL;
     615        pCreateParms->CreateFlags = SHFL_CF_ACT_CREATE_IF_NEW
     616                                  | SHFL_CF_ACT_FAIL_IF_EXISTS
     617                                  | SHFL_CF_ACCESS_READWRITE
     618                                  | (fDirectory ? SHFL_CF_DIRECTORY : 0);
     619        pCreateParms->Info.Attr.fMode = (fDirectory ? RTFS_TYPE_DIRECTORY : RTFS_TYPE_FILE)
     620                                      | (mode & S_IRWXUGO);
     621        pCreateParms->Info.Attr.enmAdditional = RTFSOBJATTRADD_NOTHING;
     622
     623#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     624        LogFunc(("calling VbglR0SfCreate, folder %s, flags %#x\n", path->String.utf8, pCreateParms->CreateFlags));
     625        rc = VbglR0SfCreate(&client_handle, &sf_g->map, path, pCreateParms);
     626#else
     627        LogFunc(("calling VbglR0SfHostReqCreate, folder %s, flags %#x\n", path->String.ach, pCreateParms->CreateFlags));
     628        rc = VbglR0SfHostReqCreate(sf_g->map.root, &pReq->Create);
     629#endif
    563630        if (RT_FAILURE(rc)) {
    564631                if (rc == VERR_WRITE_PROTECT) {
    565632                        err = -EROFS;
    566                         goto fail1;
     633                        goto fail2;
    567634                }
    568635                err = -EPROTO;
    569                 LogFunc(("(%d): VbglR0SfCreate(%s) failed rc=%Rrc\n",
     636                LogFunc(("(%d): SHFL_FN_CREATE(%s) failed rc=%Rrc\n",
    570637                         fDirectory, sf_i->path->String.utf8, rc));
    571                 goto fail1;
    572         }
    573 
    574         if (params.Result != SHFL_FILE_CREATED) {
     638                goto fail2;
     639        }
     640
     641        if (pCreateParms->Result != SHFL_FILE_CREATED) {
    575642                err = -EPERM;
    576643                LogFunc(("(%d): could not create file %s result=%d\n",
    577                          fDirectory, sf_i->path->String.utf8, params.Result));
    578                 goto fail1;
    579         }
    580 
    581         err = sf_instantiate(parent, dentry, path, &params.Info,
    582                              fDirectory ? SHFL_HANDLE_NIL : params.Handle);
     644                         fDirectory, sf_i->path->String.utf8, pCreateParms->Result));
     645                goto fail2;
     646        }
     647
     648        err = sf_instantiate(parent, dentry, path, &pCreateParms->Info,
     649                             fDirectory ? SHFL_HANDLE_NIL : pCreateParms->Handle);
    583650        if (err) {
    584651                LogFunc(("(%d): could not instantiate dentry for %s err=%d\n",
    585652                         fDirectory, sf_i->path->String.utf8, err));
    586                 goto fail2;
     653                goto fail3;
    587654        }
    588655
     
    593660         */
    594661        if (fDirectory) {
    595                 rc = VbglR0SfClose(&client_handle, &sf_g->map, params.Handle);
     662#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     663                rc = VbglR0SfClose(&client_handle, &sf_g->map, pCreateParms->Handle);
    596664                if (RT_FAILURE(rc))
    597665                        LogFunc(("(%d): VbglR0SfClose failed rc=%Rrc\n",
    598666                                 fDirectory, rc));
     667#else
     668                AssertCompile(RTASSERT_OFFSET_OF(VBOXSFCREATEREQ, CreateParms.Handle) > sizeof(VBOXSFCLOSEREQ)); /* no aliasing issues */
     669                rc = VbglR0SfHostReqClose(sf_g->map.root, &pReq->Close, pCreateParms->Handle);
     670                if (RT_FAILURE(rc))
     671                        LogFunc(("(%d): VbglR0SfHostReqClose failed rc=%Rrc\n", fDirectory, rc));
     672#endif
    599673        }
    600674
    601675        sf_i->force_restat = 1;
     676#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     677        VbglR0PhysHeapFree(pReq);
     678#endif
    602679        return 0;
    603680
    604  fail2:
    605         rc = VbglR0SfClose(&client_handle, &sf_g->map, params.Handle);
     681 fail3:
     682#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     683        rc = VbglR0SfClose(&client_handle, &sf_g->map, pCreateParms->Handle);
    606684        if (RT_FAILURE(rc))
    607685                LogFunc(("(%d): VbglR0SfClose failed rc=%Rrc\n", fDirectory,
    608686                         rc));
    609 
     687#else
     688        rc = VbglR0SfHostReqClose(sf_g->map.root, &pReq->Close, pCreateParms->Handle);
     689        if (RT_FAILURE(rc))
     690                LogFunc(("(%d): VbglR0SfHostReqCloseSimple failed rc=%Rrc\n", fDirectory, rc));
     691#endif
     692 fail2:
     693#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     694        VbglR0PhysHeapFree(pReq);
     695#endif
    610696 fail1:
    611697        kfree(path);
     
    638724{
    639725        TRACE();
    640         return sf_create_aux(parent, dentry, mode, 0);
     726        return sf_create_aux(parent, dentry, mode, 0 /*fDirectory*/);
    641727}
    642728
     
    656742{
    657743        TRACE();
    658         return sf_create_aux(parent, dentry, mode, 1);
     744        return sf_create_aux(parent, dentry, mode, 1 /*fDirectory*/);
    659745}
    660746
     
    674760        struct sf_inode_info *sf_i = GET_INODE_INFO(parent);
    675761        SHFLSTRING *path;
    676         uint32_t fFlags;
    677762
    678763        TRACE();
     
    680765
    681766        err = sf_path_from_dentry(__func__, sf_g, sf_i, dentry, &path);
    682         if (err)
    683                 goto fail0;
    684 
    685         fFlags = fDirectory ? SHFL_REMOVE_DIR : SHFL_REMOVE_FILE;
    686         if (dentry->d_inode && ((dentry->d_inode->i_mode & S_IFLNK) == S_IFLNK))
    687                 fFlags |= SHFL_REMOVE_SYMLINK;
    688         rc = VbglR0SfRemove(&client_handle, &sf_g->map, path, fFlags);
    689         if (RT_FAILURE(rc)) {
    690                 LogFunc(("(%d): VbglR0SfRemove(%s) failed rc=%Rrc\n",
    691                          fDirectory, path->String.utf8, rc));
    692                 err = -RTErrConvertToErrno(rc);
    693                 goto fail1;
    694         }
    695 
    696         /* directory access/change time changed */
    697         sf_i->force_restat = 1;
    698         /* directory content changed */
    699         sf_i->force_reread = 1;
    700 
    701         err = 0;
    702 
    703  fail1:
    704         kfree(path);
    705 
    706  fail0:
     767        if (!err) {
     768#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     769                VBOXSFREMOVEREQ *pReq = (VBOXSFREMOVEREQ *)VbglR0PhysHeapAlloc(RT_UOFFSETOF(VBOXSFREMOVEREQ, StrPath.String)
     770                                                                               + path->u16Size);
     771                if (pReq) {
     772                        memcpy(&pReq->StrPath, path, SHFLSTRING_HEADER_SIZE + path->u16Size);
     773#endif
     774                        uint32_t fFlags = fDirectory ? SHFL_REMOVE_DIR : SHFL_REMOVE_FILE;
     775                        if (dentry->d_inode && ((dentry->d_inode->i_mode & S_IFLNK) == S_IFLNK))
     776                                fFlags |= SHFL_REMOVE_SYMLINK;
     777
     778#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     779                        rc = VbglR0SfRemove(&client_handle, &sf_g->map, path, fFlags);
     780#else
     781                        rc = VbglR0SfHostReqRemove(sf_g->map.root, pReq, fFlags);
     782#endif
     783                        if (RT_SUCCESS(rc)) {
     784                                /* directory access/change time changed */
     785                                sf_i->force_restat = 1;
     786                                /* directory content changed */
     787                                sf_i->force_reread = 1;
     788
     789                                err = 0;
     790                        } else {
     791                                LogFunc(("(%d): VbglR0SfRemove(%s) failed rc=%Rrc\n",
     792                                         fDirectory, path->String.utf8, rc));
     793                                err = -RTErrConvertToErrno(rc);
     794                        }
     795#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     796                        VbglR0PhysHeapFree(pReq);
     797                } else
     798                        err = -ENOMEM;
     799#endif
     800                kfree(path);
     801        }
    707802        return err;
    708803}
     
    718813{
    719814        TRACE();
    720         return sf_unlink_aux(parent, dentry, 0);
     815        return sf_unlink_aux(parent, dentry, 0 /*fDirectory*/);
    721816}
    722817
     
    731826{
    732827        TRACE();
    733         return sf_unlink_aux(parent, dentry, 1);
     828        return sf_unlink_aux(parent, dentry, 1 /*fDirectory*/);
    734829}
    735830
     
    786881                        LogFunc(("failed to create new path\n"));
    787882                else {
     883#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    788884                        int fDir =
    789885                            ((old_dentry->d_inode->i_mode & S_IFDIR) != 0);
    790 
    791886                        rc = VbglR0SfRename(&client_handle, &sf_g->map,
    792887                                            old_path, new_path,
    793888                                            fDir ? 0 : SHFL_RENAME_FILE |
    794889                                            SHFL_RENAME_REPLACE_IF_EXISTS);
     890#else
     891                        VBOXSFRENAMEWITHSRCBUFREQ *pReq;
     892                        pReq = (VBOXSFRENAMEWITHSRCBUFREQ *)VbglR0PhysHeapAlloc(RT_UOFFSETOF(VBOXSFRENAMEWITHSRCBUFREQ,
     893                                                                                             StrDstPath.String)
     894                                                                                + new_path->u16Size);
     895                        if (pReq) {
     896                                memcpy(&pReq->StrDstPath, new_path, SHFLSTRING_HEADER_SIZE + new_path->u16Size);
     897                                rc = VbglR0SfHostReqRenameWithSrcContig(sf_g->map.root, pReq,
     898                                                                        old_path, virt_to_phys(old_path),
     899                                                                        old_dentry->d_inode->i_mode & S_IFDIR ? SHFL_RENAME_DIR
     900                                                                        : SHFL_RENAME_FILE | SHFL_RENAME_REPLACE_IF_EXISTS);
     901                                VbglR0PhysHeapFree(pReq);
     902                        } else
     903                                rc = VERR_NO_MEMORY;
     904#endif
    795905                        if (RT_SUCCESS(rc)) {
    796906                                kfree(old_path);
    797907                                sf_new_i->force_restat = 1;
    798908                                sf_old_i->force_restat = 1;     /* XXX: needed? */
     909
    799910                                /* Set the new relative path in the inode. */
    800911                                sf_file_i->path = new_path;
     912
    801913                        } else {
    802914                                LogFunc(("VbglR0SfRename failed rc=%Rrc\n",
  • trunk/src/VBox/Additions/linux/sharedfolders/files_vboxsf

    r76553 r77054  
    5555    ${PATH_ROOT}/include/VBox/VBoxGuestLib.h=>include/VBox/VBoxGuestLib.h \
    5656    ${PATH_ROOT}/include/VBox/VBoxGuestLibSharedFolders.h=>include/VBox/VBoxGuestLibSharedFolders.h \
     57    ${PATH_ROOT}/include/VBox/VBoxGuestLibSharedFoldersInline.h=>include/VBox/VBoxGuestLibSharedFoldersInline.h \
    5758    ${PATH_ROOT}/include/VBox/VBoxGuestMangling.h=>include/VBox/VBoxGuestMangling.h \
    5859    ${PATH_ROOT}/include/VBox/VMMDev.h=>include/VBox/VMMDev.h \
    5960    ${PATH_ROOT}/include/VBox/VMMDevCoreTypes.h=>include/VBox/VMMDevCoreTypes.h \
    6061    ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibInternal.h=>VBoxGuestR0LibInternal.h \
     62    ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibGenericRequest.cpp=>VBoxGuestR0LibGenericRequest.c \
    6163    ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibHGCM.cpp=>VBoxGuestR0LibHGCM.c \
    6264    ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibIdc.cpp=>VBoxGuestR0LibIdc.c \
    6365    ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibIdc-unix.cpp=>VBoxGuestR0LibIdc-unix.c \
     66    ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibInit.cpp=>VBoxGuestR0LibInit.c \
     67    ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibPhysHeap.cpp=>VBoxGuestR0LibPhysHeap.c \
    6468    ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibSharedFolders.c=>VBoxGuestR0LibSharedFolders.c \
    6569    ${PATH_ROOT}/src/VBox/Installer/linux/Makefile.include.header=>Makefile.include.header \
  • trunk/src/VBox/Additions/linux/sharedfolders/regops.c

    r77004 r77054  
    438438        struct sf_inode_info *sf_i = GET_INODE_INFO(inode);
    439439        struct sf_reg_info *sf_r;
     440#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    440441        SHFLCREATEPARMS params;
     442#else
     443        VBOXSFCREATEREQ *pReq;
     444#endif
     445        SHFLCREATEPARMS *pCreateParms;  /* temp glue */
    441446
    442447        TRACE();
     
    467472        }
    468473
     474#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    469475        RT_ZERO(params);
    470         params.Handle = SHFL_HANDLE_NIL;
    471         /* We check the value of params.Handle afterwards to find out if
     476        pCreateParms = &params;
     477#else
     478        pReq = (VBOXSFCREATEREQ *)VbglR0PhysHeapAlloc(sizeof(*pReq) + sf_i->path->u16Size);
     479        if (!pReq) {
     480                kfree(sf_r);
     481                LogRelFunc(("Failed to allocate a VBOXSFCREATEREQ buffer!\n"));
     482                return -ENOMEM;
     483        }
     484        memcpy(&pReq->StrPath, sf_i->path, SHFLSTRING_HEADER_SIZE + sf_i->path->u16Size);
     485        RT_ZERO(pReq->CreateParms);
     486        pCreateParms = &pReq->CreateParms;
     487#endif
     488        pCreateParms->Handle = SHFL_HANDLE_NIL;
     489
     490        /* We check the value of pCreateParms->Handle afterwards to find out if
    472491         * the call succeeded or failed, as the API does not seem to cleanly
    473492         * distinguish error and informational messages.
    474493         *
    475          * Furthermore, we must set params.Handle to SHFL_HANDLE_NIL to
     494         * Furthermore, we must set pCreateParms->Handle to SHFL_HANDLE_NIL to
    476495         * make the shared folders host service use our fMode parameter */
    477496
    478497        if (file->f_flags & O_CREAT) {
    479498                LogFunc(("O_CREAT set\n"));
    480                 params.CreateFlags |= SHFL_CF_ACT_CREATE_IF_NEW;
     499                pCreateParms->CreateFlags |= SHFL_CF_ACT_CREATE_IF_NEW;
    481500                /* We ignore O_EXCL, as the Linux kernel seems to call create
    482501                   beforehand itself, so O_EXCL should always fail. */
    483502                if (file->f_flags & O_TRUNC) {
    484503                        LogFunc(("O_TRUNC set\n"));
    485                         params.CreateFlags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS;
     504                        pCreateParms->CreateFlags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS;
    486505                } else
    487                         params.CreateFlags |= SHFL_CF_ACT_OPEN_IF_EXISTS;
     506                        pCreateParms->CreateFlags |= SHFL_CF_ACT_OPEN_IF_EXISTS;
    488507        } else {
    489                 params.CreateFlags |= SHFL_CF_ACT_FAIL_IF_NEW;
     508                pCreateParms->CreateFlags |= SHFL_CF_ACT_FAIL_IF_NEW;
    490509                if (file->f_flags & O_TRUNC) {
    491510                        LogFunc(("O_TRUNC set\n"));
    492                         params.CreateFlags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS;
     511                        pCreateParms->CreateFlags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS;
    493512                }
    494513        }
     
    496515        switch (file->f_flags & O_ACCMODE) {
    497516        case O_RDONLY:
    498                 params.CreateFlags |= SHFL_CF_ACCESS_READ;
     517                pCreateParms->CreateFlags |= SHFL_CF_ACCESS_READ;
    499518                break;
    500519
    501520        case O_WRONLY:
    502                 params.CreateFlags |= SHFL_CF_ACCESS_WRITE;
     521                pCreateParms->CreateFlags |= SHFL_CF_ACCESS_WRITE;
    503522                break;
    504523
    505524        case O_RDWR:
    506                 params.CreateFlags |= SHFL_CF_ACCESS_READWRITE;
     525                pCreateParms->CreateFlags |= SHFL_CF_ACCESS_READWRITE;
    507526                break;
    508527
     
    513532        if (file->f_flags & O_APPEND) {
    514533                LogFunc(("O_APPEND set\n"));
    515                 params.CreateFlags |= SHFL_CF_ACCESS_APPEND;
    516         }
    517 
    518         params.Info.Attr.fMode = inode->i_mode;
    519         LogFunc(("sf_reg_open: calling VbglR0SfCreate, file %s, flags=%#x, %#x\n", sf_i->path->String.utf8, file->f_flags, params.CreateFlags));
    520         rc = VbglR0SfCreate(&client_handle, &sf_g->map, sf_i->path, &params);
     534                pCreateParms->CreateFlags |= SHFL_CF_ACCESS_APPEND;
     535        }
     536
     537        pCreateParms->Info.Attr.fMode = inode->i_mode;
     538#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     539        LogFunc(("sf_reg_open: calling VbglR0SfCreate, file %s, flags=%#x, %#x\n", sf_i->path->String.utf8, file->f_flags, pCreateParms->CreateFlags));
     540        rc = VbglR0SfCreate(&client_handle, &sf_g->map, sf_i->path, pCreateParms);
     541#else
     542        LogFunc(("sf_reg_open: calling VbglR0SfHostReqCreate, file %s, flags=%#x, %#x\n", sf_i->path->String.utf8, file->f_flags, pCreateParms->CreateFlags));
     543        rc = VbglR0SfHostReqCreate(sf_g->map.root, pReq);
     544#endif
    521545        if (RT_FAILURE(rc)) {
    522                 LogFunc(("VbglR0SfCreate failed flags=%d,%#x rc=%Rrc\n",
    523                          file->f_flags, params.CreateFlags, rc));
     546#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     547                LogFunc(("VbglR0SfCreate failed flags=%d,%#x rc=%Rrc\n", file->f_flags, pCreateParms->CreateFlags, rc));
     548#else
     549                LogFunc(("VbglR0SfHostReqCreate failed flags=%d,%#x rc=%Rrc\n", file->f_flags, pCreateParms->CreateFlags, rc));
     550#endif
    524551                kfree(sf_r);
     552#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     553                VbglR0PhysHeapFree(pReq);
     554#endif
    525555                return -RTErrConvertToErrno(rc);
    526556        }
    527557
    528         if (SHFL_HANDLE_NIL == params.Handle) {
    529                 switch (params.Result) {
     558        if (pCreateParms->Handle == SHFL_HANDLE_NIL) {
     559                switch (pCreateParms->Result) {
    530560                case SHFL_PATH_NOT_FOUND:
    531561                case SHFL_FILE_NOT_FOUND:
     
    541571
    542572        sf_i->force_restat = 1;
    543         sf_r->handle = params.Handle;
     573        sf_r->handle = pCreateParms->Handle;
    544574        sf_i->file = file;
    545575        file->private_data = sf_r;
     576#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     577        VbglR0PhysHeapFree(pReq);
     578#endif
    546579        return rc_linux;
    547580}
     
    578611                filemap_fdatawait(inode->i_mapping);
    579612#endif
     613#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    580614        rc = VbglR0SfClose(&client_handle, &sf_g->map, sf_r->handle);
    581615        if (RT_FAILURE(rc))
    582616                LogFunc(("VbglR0SfClose failed rc=%Rrc\n", rc));
     617#else
     618        rc = VbglR0SfHostReqCloseSimple(sf_g->map.root, sf_r->handle);
     619        if (RT_FAILURE(rc))
     620                LogFunc(("VbglR0SfHostReqCloseSimple failed rc=%Rrc\n", rc));
     621        sf_r->handle = SHFL_HANDLE_NIL;
     622#endif
    583623
    584624        kfree(sf_r);
  • trunk/src/VBox/Additions/linux/sharedfolders/utils.c

    r76939 r77054  
    3737#include <linux/vfs.h>
    3838
    39 /* #define USE_VMALLOC */
    40 
    4139/*
    4240 * sf_reg_aops and sf_backing_dev_info are just quick implementations to make
     
    118116#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
    119117        inode->i_mapping->a_ops = &sf_reg_aops;
    120 #if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 19, 0)
     118# if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 19, 0)
    121119        /* XXX Was this ever necessary? */
    122120        inode->i_mapping->backing_dev_info = &sf_g->bdi;
    123 #endif
     121# endif
    124122#endif
    125123
     
    144142                inode->i_mode |= S_IFLNK;
    145143                inode->i_op = &sf_lnk_iops;
    146 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
     144# if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
    147145                set_nlink(inode, 1);
    148 #else
     146# else
    149147                inode->i_nlink = 1;
    150 #endif
     148# endif
    151149        }
    152150#endif
     
    188186
    189187int sf_stat(const char *caller, struct sf_glob_info *sf_g,
    190             SHFLSTRING * path, PSHFLFSOBJINFO result, int ok_to_fail)
     188            SHFLSTRING *path, PSHFLFSOBJINFO result, int ok_to_fail)
    191189{
    192190        int rc;
     191#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    193192        SHFLCREATEPARMS params;
     193#else
     194        VBOXSFCREATEREQ *pReq;
     195#endif
    194196        NOREF(caller);
    195197
    196198        TRACE();
    197199
     200#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    198201        RT_ZERO(params);
    199202        params.Handle = SHFL_HANDLE_NIL;
     
    219222        *result = params.Info;
    220223        return 0;
     224#else
     225        pReq = (VBOXSFCREATEREQ *)VbglR0PhysHeapAlloc(sizeof(*pReq) + path->u16Size);
     226        if (pReq) {
     227                RT_ZERO(*pReq);
     228                memcpy(&pReq->StrPath, path, SHFLSTRING_HEADER_SIZE + path->u16Size);
     229                pReq->CreateParms.Handle = SHFL_HANDLE_NIL;
     230                pReq->CreateParms.CreateFlags = SHFL_CF_LOOKUP | SHFL_CF_ACT_FAIL_IF_NEW;
     231
     232                LogFunc(("Calling VbglR0SfHostReqCreate on %s\n", path->String.utf8));
     233                rc = VbglR0SfHostReqCreate(sf_g->map.root, pReq);
     234                if (RT_SUCCESS(rc)) {
     235                        if (pReq->CreateParms.Result == SHFL_FILE_EXISTS) {
     236                                *result = pReq->CreateParms.Info;
     237                                rc = 0;
     238                        } else {
     239                                if (!ok_to_fail)
     240                                        LogFunc(("VbglR0SfHostReqCreate on %s: file does not exist: %d (caller=%s)\n",
     241                                                 path->String.utf8, pReq->CreateParms.Result, caller));
     242                                rc = -ENOENT;
     243                        }
     244                } else if (rc == VERR_INVALID_NAME) {
     245                        rc = -ENOENT; /* this can happen for names like 'foo*' on a Windows host */
     246                } else {
     247                        LogFunc(("VbglR0SfHostReqCreate failed on %s: %Rrc (caller=%s)\n", path->String.utf8, rc, caller));
     248                        rc = -EPROTO;
     249                }
     250                VbglR0PhysHeapFree(pReq);
     251        }
     252        else
     253                rc = -ENOMEM;
     254        return rc;
     255#endif
    221256}
    222257
     
    301336   [generic_fillattr] */
    302337#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
    303 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
     338
     339# if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
    304340int sf_getattr(const struct path *path, struct kstat *kstat, u32 request_mask,
    305341               unsigned int flags)
    306 #else
     342# else
    307343int sf_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *kstat)
    308 #endif
     344# endif
    309345{
    310346        int err;
    311 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
     347# if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
    312348        struct dentry *dentry = path->dentry;
    313 #endif
     349# endif
    314350
    315351        TRACE();
     
    326362        struct sf_glob_info *sf_g;
    327363        struct sf_inode_info *sf_i;
    328         SHFLCREATEPARMS params;
    329         SHFLFSOBJINFO info;
     364# ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     365        SHFLCREATEPARMS CreateParms;
     366        SHFLCREATEPARMS *pCreateParms = &CreateParms;
     367        SHFLFSOBJINFO InfoBuf;
     368        SHFLFSOBJINFO *pInfo = &InfoBuf;
    330369        uint32_t cbBuffer;
    331370        int rc, err;
     371# else
     372        union SetAttrReqs
     373        {
     374            VBOXSFCREATEREQ         Create;
     375            VBOXSFOBJINFOREQ        Info;
     376            VBOXSFSETFILESIZEREQ    SetSize;
     377            VBOXSFCLOSEREQ          Close;
     378        } *pReq;
     379        size_t cbReq;
     380        SHFLCREATEPARMS *pCreateParms;
     381        SHFLFSOBJINFO *pInfo;
     382        SHFLHANDLE hHostFile;
     383        int vrc;
     384        int err = 0;
     385# endif
    332386
    333387        TRACE();
     
    335389        sf_g = GET_GLOB_INFO(dentry->d_inode->i_sb);
    336390        sf_i = GET_INODE_INFO(dentry->d_inode);
     391# ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    337392        err = 0;
    338 
    339         RT_ZERO(params);
    340         params.Handle = SHFL_HANDLE_NIL;
    341         params.CreateFlags = SHFL_CF_ACT_OPEN_IF_EXISTS
    342             | SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_ATTR_WRITE;
     393# else
     394        cbReq = RT_MAX(sizeof(pReq->Info), sizeof(pReq->Create) + SHFLSTRING_HEADER_SIZE + sf_i->path->u16Size);
     395        pReq = (union SetAttrReqs *)VbglR0PhysHeapAlloc(cbReq);
     396        if (!pReq) {
     397                LogFunc(("Failed to allocate %#x byte request buffer!\n", cbReq));
     398                return -ENOMEM;
     399        }
     400        pCreateParms = &pReq->Create.CreateParms;
     401        pInfo = &pReq->Info.ObjInfo;
     402# endif
     403
     404        RT_ZERO(*pCreateParms);
     405        pCreateParms->Handle = SHFL_HANDLE_NIL;
     406        pCreateParms->CreateFlags = SHFL_CF_ACT_OPEN_IF_EXISTS
     407                                  | SHFL_CF_ACT_FAIL_IF_NEW
     408                                  | SHFL_CF_ACCESS_ATTR_WRITE;
    343409
    344410        /* this is at least required for Posix hosts */
    345411        if (iattr->ia_valid & ATTR_SIZE)
    346                 params.CreateFlags |= SHFL_CF_ACCESS_WRITE;
    347 
    348         rc = VbglR0SfCreate(&client_handle, &sf_g->map, sf_i->path, &params);
     412                pCreateParms->CreateFlags |= SHFL_CF_ACCESS_WRITE;
     413
     414# ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     415        rc = VbglR0SfCreate(&client_handle, &sf_g->map, sf_i->path, pCreateParms);
    349416        if (RT_FAILURE(rc)) {
    350417                LogFunc(("VbglR0SfCreate(%s) failed rc=%Rrc\n",
     
    353420                goto fail2;
    354421        }
    355         if (params.Result != SHFL_FILE_EXISTS) {
     422# else
     423        memcpy(&pReq->Create.StrPath, sf_i->path, sf_i->path->u16Size);
     424        vrc = VbglR0SfHostReqCreate(sf_g->map.root, &pReq->Create);
     425        if (RT_SUCCESS(vrc)) {
     426                hHostFile = pCreateParms->Handle;
     427        } else {
     428                err = -RTErrConvertToErrno(vrc);
     429                LogFunc(("VbglR0SfCreate(%s) failed vrc=%Rrc err=%d\n", sf_i->path->String.ach, vrc, err));
     430                goto fail2;
     431        }
     432# endif
     433        if (pCreateParms->Result != SHFL_FILE_EXISTS) {
    356434                LogFunc(("file %s does not exist\n", sf_i->path->String.utf8));
    357435                err = -ENOENT;
     
    363441         * vbsf.cpp */
    364442        if (iattr->ia_valid & (ATTR_MODE | ATTR_ATIME | ATTR_MTIME)) {
    365 #define mode_set(r) ((iattr->ia_mode & (S_##r)) ? RTFS_UNIX_##r : 0)
    366 
    367                 RT_ZERO(info);
     443# define mode_set(r) ((iattr->ia_mode & (S_##r)) ? RTFS_UNIX_##r : 0)
     444
     445                RT_ZERO(*pInfo);
    368446                if (iattr->ia_valid & ATTR_MODE) {
    369                         info.Attr.fMode = mode_set(IRUSR);
    370                         info.Attr.fMode |= mode_set(IWUSR);
    371                         info.Attr.fMode |= mode_set(IXUSR);
    372                         info.Attr.fMode |= mode_set(IRGRP);
    373                         info.Attr.fMode |= mode_set(IWGRP);
    374                         info.Attr.fMode |= mode_set(IXGRP);
    375                         info.Attr.fMode |= mode_set(IROTH);
    376                         info.Attr.fMode |= mode_set(IWOTH);
    377                         info.Attr.fMode |= mode_set(IXOTH);
     447                        pInfo->Attr.fMode = mode_set(IRUSR);
     448                        pInfo->Attr.fMode |= mode_set(IWUSR);
     449                        pInfo->Attr.fMode |= mode_set(IXUSR);
     450                        pInfo->Attr.fMode |= mode_set(IRGRP);
     451                        pInfo->Attr.fMode |= mode_set(IWGRP);
     452                        pInfo->Attr.fMode |= mode_set(IXGRP);
     453                        pInfo->Attr.fMode |= mode_set(IROTH);
     454                        pInfo->Attr.fMode |= mode_set(IWOTH);
     455                        pInfo->Attr.fMode |= mode_set(IXOTH);
    378456
    379457                        if (iattr->ia_mode & S_IFDIR)
    380                                 info.Attr.fMode |= RTFS_TYPE_DIRECTORY;
     458                                pInfo->Attr.fMode |= RTFS_TYPE_DIRECTORY;
    381459                        else
    382                                 info.Attr.fMode |= RTFS_TYPE_FILE;
     460                                pInfo->Attr.fMode |= RTFS_TYPE_FILE;
    383461                }
    384462
    385463                if (iattr->ia_valid & ATTR_ATIME)
    386                         sf_timespec_from_ftime(&info.AccessTime,
     464                        sf_timespec_from_ftime(&pInfo->AccessTime,
    387465                                               &iattr->ia_atime);
    388466                if (iattr->ia_valid & ATTR_MTIME)
    389                         sf_timespec_from_ftime(&info.ModificationTime,
     467                        sf_timespec_from_ftime(&pInfo->ModificationTime,
    390468                                               &iattr->ia_mtime);
    391469                /* ignore ctime (inode change time) as it can't be set from userland anyway */
    392470
    393                 cbBuffer = sizeof(info);
    394                 rc = VbglR0SfFsInfo(&client_handle, &sf_g->map, params.Handle,
     471# ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     472                cbBuffer = sizeof(*pInfo);
     473                rc = VbglR0SfFsInfo(&client_handle, &sf_g->map, pCreateParms->Handle,
    395474                                    SHFL_INFO_SET | SHFL_INFO_FILE, &cbBuffer,
    396                                     (PSHFLDIRINFO) & info);
     475                                    (PSHFLDIRINFO)pInfo);
    397476                if (RT_FAILURE(rc)) {
    398477                        LogFunc(("VbglR0SfFsInfo(%s, FILE) failed rc=%Rrc\n",
     
    401480                        goto fail1;
    402481                }
     482# else
     483                vrc = VbglR0SfHostReqSetObjInfo(sf_g->map.root, &pReq->Info, hHostFile);
     484                if (RT_FAILURE(vrc)) {
     485                        err = -RTErrConvertToErrno(vrc);
     486                        LogFunc(("VbglR0SfHostReqSetObjInfo(%s) failed vrc=%Rrc err=%d\n", sf_i->path->String.ach, vrc, err));
     487                        goto fail1;
     488                }
     489# endif
    403490        }
    404491
    405492        if (iattr->ia_valid & ATTR_SIZE) {
    406                 RT_ZERO(info);
    407                 info.cbObject = iattr->ia_size;
    408                 cbBuffer = sizeof(info);
    409                 rc = VbglR0SfFsInfo(&client_handle, &sf_g->map, params.Handle,
     493# ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     494                RT_ZERO(*pInfo);
     495                pInfo->cbObject = iattr->ia_size;
     496                cbBuffer = sizeof(*pInfo);
     497                rc = VbglR0SfFsInfo(&client_handle, &sf_g->map, pCreateParms->Handle,
    410498                                    SHFL_INFO_SET | SHFL_INFO_SIZE, &cbBuffer,
    411                                     (PSHFLDIRINFO) & info);
     499                                    (PSHFLDIRINFO)pInfo);
    412500                if (RT_FAILURE(rc)) {
    413501                        LogFunc(("VbglR0SfFsInfo(%s, SIZE) failed rc=%Rrc\n",
     
    416504                        goto fail1;
    417505                }
    418         }
    419 
    420         rc = VbglR0SfClose(&client_handle, &sf_g->map, params.Handle);
     506# else
     507                vrc = VbglR0SfHostReqSetFileSize(sf_g->map.root, &pReq->SetSize, hHostFile, iattr->ia_size);
     508                /** @todo Implement fallback if host is < 6.0? */
     509                if (RT_FAILURE(vrc)) {
     510                        err = -RTErrConvertToErrno(vrc);
     511                        LogFunc(("VbglR0SfHostReqSetFileSize(%s, %#llx) failed vrc=%Rrc err=%d\n",
     512                                 sf_i->path->String.ach, (unsigned long long)iattr->ia_size, vrc, err));
     513                        goto fail1;
     514                }
     515# endif
     516        }
     517
     518# ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     519        rc = VbglR0SfClose(&client_handle, &sf_g->map, pCreateParms->Handle);
    421520        if (RT_FAILURE(rc))
    422521                LogFunc(("VbglR0SfClose(%s) failed rc=%Rrc\n",
    423522                         sf_i->path->String.utf8, rc));
    424 
     523# else
     524        vrc = VbglR0SfHostReqClose(sf_g->map.root, &pReq->Close, hHostFile);
     525        if (RT_FAILURE(vrc))
     526                LogFunc(("VbglR0SfHostReqClose(%s [%#llx]) failed vrc=%Rrc\n", sf_i->path->String.utf8, hHostFile, vrc));
     527        VbglR0PhysHeapFree(pReq);
     528# endif
     529
     530        /** @todo r=bird: I guess we're calling revalidate here to update the inode
     531         * info.  However, due to the TTL optimization this is not guarenteed to happen.
     532         *
     533         * Also, we already have accurate stat information on the file, either from the
     534         * SHFL_FN_CREATE call or from SHFL_FN_INFORMATION, so there is no need to do a
     535         * slow stat()-like operation to retrieve the information again.
     536         *
     537         * What's more, given that the SHFL_FN_CREATE call succeeded, we know that the
     538         * dentry and all its parent entries are valid and could touch their timestamps
     539         * extending their TTL (CIFS does that). */
    425540        return sf_inode_revalidate(dentry);
    426541
    427542 fail1:
    428         rc = VbglR0SfClose(&client_handle, &sf_g->map, params.Handle);
     543# ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     544        rc = VbglR0SfClose(&client_handle, &sf_g->map, pCreateParms->Handle);
    429545        if (RT_FAILURE(rc))
    430546                LogFunc(("VbglR0SfClose(%s) failed rc=%Rrc\n",
    431547                         sf_i->path->String.utf8, rc));
     548# else
     549        vrc = VbglR0SfHostReqClose(sf_g->map.root, &pReq->Close, hHostFile);
     550        if (RT_FAILURE(vrc))
     551                LogFunc(("VbglR0SfHostReqClose(%s [%#llx]) failed vrc=%Rrc; err=%d\n", sf_i->path->String.utf8, hHostFile, vrc, err));
     552# endif
    432553
    433554 fail2:
     555# ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     556        VbglR0PhysHeapFree(pReq);
     557# endif
    434558        return err;
    435559}
    436 #endif                          /* >= 2.6.0 */
     560
     561#endif /* >= 2.6.0 */
    437562
    438563static int sf_make_path(const char *caller, struct sf_inode_info *sf_i,
     
    638763                return NULL;
    639764        }
    640 #ifdef USE_VMALLOC
    641         b->buf = vmalloc(DIR_BUFFER_SIZE);
    642 #else
    643765        b->buf = kmalloc(DIR_BUFFER_SIZE, GFP_KERNEL);
    644 #endif
    645766        if (!b->buf) {
    646767                kfree(b);
     
    662783        TRACE();
    663784        list_del(&b->head);
    664 #ifdef USE_VMALLOC
    665         vfree(b->buf);
    666 #else
    667785        kfree(b->buf);
    668 #endif
    669786        kfree(b);
    670787}
     
    746863}
    747864
     865/** @todo r=bird: Why on earth do we read in the entire directory???  This
     866 *        cannot be healthy for like big directory and such... */
    748867int sf_dir_read_all(struct sf_glob_info *sf_g, struct sf_inode_info *sf_i,
    749868                    struct sf_dir_info *sf_d, SHFLHANDLE handle)
     
    751870        int err;
    752871        SHFLSTRING *mask;
    753         struct sf_dir_buf *b;
     872#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     873        VBOXSFLISTDIRREQ *pReq = NULL;
     874#endif
    754875
    755876        TRACE();
     
    757878        if (err)
    758879                goto fail0;
     880#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     881        pReq = (VBOXSFLISTDIRREQ *)VbglR0PhysHeapAlloc(sizeof(*pReq));
     882        if (!pReq)
     883                goto fail1;
     884#endif
    759885
    760886        for (;;) {
    761887                int rc;
     888                struct sf_dir_buf *b;
     889#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    762890                void *buf;
    763891                uint32_t cbSize;
    764892                uint32_t cEntries;
     893#endif
    765894
    766895                b = sf_get_empty_dir_buf(sf_d);
     
    770899                                err = -ENOMEM;
    771900                                LogRelFunc(("could not alloc directory buffer\n"));
    772                                 goto fail1;
     901                                goto fail2;
    773902                        }
    774903                        list_add(&b->head, &sf_d->info_list);
    775904                }
    776905
     906#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    777907                buf = b->buf;
    778908                cbSize = b->cbFree;
     
    792922                        err = -RTErrConvertToErrno(rc);
    793923                        LogFunc(("VbglR0SfDirInfo failed rc=%Rrc\n", rc));
    794                         goto fail1;
     924                        goto fail2;
    795925                }
    796926
     
    801931                if (RT_FAILURE(rc))
    802932                        break;
     933#else
     934                rc = VbglR0SfHostReqListDirContig2x(sf_g->map.root, pReq, handle, mask, virt_to_phys(mask),
     935                                                    0 /*fFlags*/, b->buf, virt_to_phys(b->buf), b->cbFree);
     936                if (RT_SUCCESS(rc)) {
     937                        b->cEntries += pReq->Parms.c32Entries.u.value32;
     938                        b->cbFree   -= pReq->Parms.cb32Buffer.u.value32;
     939                        b->cbUsed   += pReq->Parms.cb32Buffer.u.value32;
     940                } else if (rc == VERR_NO_MORE_FILES) {
     941                        break;
     942                } else {
     943                        err = -RTErrConvertToErrno(rc);
     944                        LogFunc(("VbglR0SfHostReqListDirContig2x failed rc=%Rrc err=%d\n", rc, err));
     945                        goto fail2;
     946                }
     947#endif
    803948        }
    804949        err = 0;
    805950
     951 fail2:
     952#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     953        VbglR0PhysHeapFree(pReq);
     954#endif
    806955 fail1:
    807956        kfree(mask);
     
    814963{
    815964        struct sf_glob_info *sf_g;
     965#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    816966        SHFLVOLINFO SHFLVolumeInfo;
     967        SHFLVOLINFO *pVolInfo = &SHFLVolumeInfo;
    817968        uint32_t cbBuffer;
     969#else
     970        VBOXSFVOLINFOREQ *pReq;
     971        SHFLVOLINFO *pVolInfo;
     972#endif
    818973        int rc;
    819974
    820975        sf_g = GET_GLOB_INFO(sb);
     976#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    821977        cbBuffer = sizeof(SHFLVolumeInfo);
    822978        rc = VbglR0SfFsInfo(&client_handle, &sf_g->map, 0,
    823979                            SHFL_INFO_GET | SHFL_INFO_VOLUME, &cbBuffer,
    824980                            (PSHFLDIRINFO) & SHFLVolumeInfo);
    825         if (RT_FAILURE(rc))
    826                 return -RTErrConvertToErrno(rc);
    827 
    828         stat->f_type = NFS_SUPER_MAGIC; /* XXX vboxsf type? */
    829         stat->f_bsize = SHFLVolumeInfo.ulBytesPerAllocationUnit;
    830         stat->f_blocks = SHFLVolumeInfo.ullTotalAllocationBytes
    831             / SHFLVolumeInfo.ulBytesPerAllocationUnit;
    832         stat->f_bfree = SHFLVolumeInfo.ullAvailableAllocationBytes
    833             / SHFLVolumeInfo.ulBytesPerAllocationUnit;
    834         stat->f_bavail = SHFLVolumeInfo.ullAvailableAllocationBytes
    835             / SHFLVolumeInfo.ulBytesPerAllocationUnit;
    836         stat->f_files = 1000;
    837         stat->f_ffree = 1000;   /* don't return 0 here since the guest may think
    838                                  * that it is not possible to create any more files */
    839         stat->f_fsid.val[0] = 0;
    840         stat->f_fsid.val[1] = 0;
    841         stat->f_namelen = 255;
    842         return 0;
     981#else
     982        pReq = VbglR0PhysHeapAlloc(sizeof(*pReq));
     983        if (pReq) {
     984                pVolInfo = &pReq->VolInfo;
     985                rc = VbglR0SfHostReqQueryVolInfo(sf_g->map.root, pReq, SHFL_HANDLE_ROOT);
     986#endif
     987                if (RT_SUCCESS(rc)) {
     988                        stat->f_type   = NFS_SUPER_MAGIC;       /* XXX vboxsf type? */
     989                        stat->f_bsize  = pVolInfo->ulBytesPerAllocationUnit;
     990#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 73)
     991                        stat->f_frsize = pVolInfo->ulBytesPerAllocationUnit;
     992#endif
     993                        stat->f_blocks = pVolInfo->ullTotalAllocationBytes
     994                                       / pVolInfo->ulBytesPerAllocationUnit;
     995                        stat->f_bfree  = pVolInfo->ullAvailableAllocationBytes
     996                                       / pVolInfo->ulBytesPerAllocationUnit;
     997                        stat->f_bavail = pVolInfo->ullAvailableAllocationBytes
     998                                       / pVolInfo->ulBytesPerAllocationUnit;
     999                        stat->f_files  = 1000;
     1000                        stat->f_ffree  = 1000; /* don't return 0 here since the guest may think
     1001                                                * that it is not possible to create any more files */
     1002                        stat->f_fsid.val[0] = 0;
     1003                        stat->f_fsid.val[1] = 0;
     1004                        stat->f_namelen = 255;
     1005#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 73)
     1006                        stat->f_flags = 0; /* not valid */
     1007#endif
     1008                        RT_ZERO(stat->f_spare);
     1009                        rc = 0;
     1010                } else
     1011                        rc = -RTErrConvertToErrno(rc);
     1012#ifndef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
     1013                VbglR0PhysHeapFree(pReq);
     1014        } else
     1015                rc = -ENOMEM;
     1016#endif
     1017        return rc;
    8431018}
    8441019
     
    8571032
    8581033        sf_g->bdi.ra_pages = 0; /* No readahead */
    859 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 12)
     1034# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 12)
    8601035        sf_g->bdi.capabilities = BDI_CAP_MAP_DIRECT     /* MAP_SHARED */
    8611036            | BDI_CAP_MAP_COPY  /* MAP_PRIVATE */
     
    8631038            | BDI_CAP_WRITE_MAP /* can be mapped for writing */
    8641039            | BDI_CAP_EXEC_MAP; /* can be mapped for execution */
    865 #endif                          /* >= 2.6.12 */
    866 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
     1040# endif                         /* >= 2.6.12 */
     1041# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
    8671042        rc = bdi_init(&sf_g->bdi);
    868 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
     1043#  if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
    8691044        if (!rc)
    8701045                rc = bdi_register(&sf_g->bdi, NULL, "vboxsf-%llu",
    8711046                                  (unsigned long long)u64CurrentSequence);
    872 #endif                          /* >= 2.6.26 */
    873 #endif                          /* >= 2.6.24 */
    874 #endif                          /* >= 2.6.0 && <= 3.19.0 */
     1047#  endif /* >= 2.6.26 */
     1048# endif  /* >= 2.6.24 */
     1049#endif   /* >= 2.6.0 && <= 3.19.0 */
    8751050        return rc;
    8761051}
     
    8821057#endif
    8831058}
     1059
  • trunk/src/VBox/Additions/linux/sharedfolders/vfsmod.c

    r76744 r77054  
    4040#include "revision-generated.h"
    4141#include "product-generated.h"
    42 #include "VBoxGuestR0LibInternal.h"
    4342#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
    4443# include <linux/mount.h>
    4544#endif
    4645#include <linux/seq_file.h>
     46#include <iprt/path.h>
    4747
    4848MODULE_DESCRIPTION(VBOX_PRODUCT " VFS Module for Host File System Access");
     
    5858/* globals */
    5959VBGLSFCLIENT client_handle;
     60VBGLSFCLIENT g_SfClient;      /* temporary? */
     61uint32_t g_fHostFeatures = 0; /* temporary? */
    6062
    6163/* forward declarations */
     
    105107        memcpy(str_name->String.utf8, info->name, name_len + 1);
    106108
    107 #define _IS_UTF8(_str) \
    108     (strcmp(_str, "utf8") == 0)
    109 #define _IS_EMPTY(_str) \
    110     (strcmp(_str, "") == 0)
     109#define _IS_UTF8(_str)  (strcmp(_str, "utf8") == 0)
     110#define _IS_EMPTY(_str) (strcmp(_str, "") == 0)
    111111
    112112        /* Check if NLS charset is valid and not points to UTF8 table */
     
    136136                sf_g->nls = NULL;
    137137#endif
     138        }
    138139
    139140#undef _IS_UTF8
    140141#undef _IS_EMPTY
    141         }
    142 
     142
     143#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    143144        rc = VbglR0SfMapFolder(&client_handle, str_name, &sf_g->map);
     145#else
     146        rc = VbglR0SfHostReqMapFolderWithContigSimple(str_name, virt_to_phys(str_name), RTPATH_DELIMITER,
     147                                                      true /*fCaseSensitive*/, &sf_g->map.root);
     148#endif
    144149        kfree(str_name);
    145150
    146151        if (RT_FAILURE(rc)) {
    147152                err = -EPROTO;
    148                 LogFunc(("VbglR0SfMapFolder failed rc=%d\n", rc));
     153                LogFunc(("SHFL_FN_MAP_FOLDER failed rc=%Rrc\n", rc));
    149154                goto fail2;
    150155        }
     
    193198
    194199        TRACE();
     200#ifdef VBOXSF_USE_DEPRECATED_VBGL_INTERFACE
    195201        rc = VbglR0SfUnmapFolder(&client_handle, &sf_g->map);
    196202        if (RT_FAILURE(rc))
    197203                LogFunc(("VbglR0SfUnmapFolder failed rc=%d\n", rc));
     204#else
     205        rc = VbglR0SfHostReqUnmapFolderSimple(sf_g->map.root);
     206        if (RT_FAILURE(rc))
     207                LogFunc(("VbglR0SfHostReqUnmapFolderSimple failed rc=%Rrc\n", rc));
     208#endif
    198209
    199210        if (sf_g->nls)
     
    455466        BUG_ON(!sf_g);
    456467        if (data && data[0] != 0) {
    457                 struct vbsf_mount_info_new *info =
    458                     (struct vbsf_mount_info_new *)data;
     468                struct vbsf_mount_info_new *info = (struct vbsf_mount_info_new *)data;
    459469                if (info->signature[0] == VBSF_MOUNT_SIGNATURE_BYTE_0
    460470                    && info->signature[1] == VBSF_MOUNT_SIGNATURE_BYTE_1
     
    599609static int __init init(void)
    600610{
    601         int rcVBox;
     611        int vrc;
    602612        int rcRet = 0;
    603613        int err;
     
    620630        }
    621631
    622         rcVBox = VbglR0HGCMInit();
    623         if (RT_FAILURE(rcVBox)) {
    624                 LogRelFunc(("VbglR0HGCMInit failed, rc=%d\n", rcVBox));
     632        vrc = VbglR0SfInit();
     633        if (RT_FAILURE(vrc)) {
     634                LogRelFunc(("VbglR0SfInit failed, vrc=%Rrc\n", vrc));
    625635                rcRet = -EPROTO;
    626636                goto fail0;
    627637        }
    628638
    629         rcVBox = VbglR0SfConnect(&client_handle);
    630         if (RT_FAILURE(rcVBox)) {
    631                 LogRelFunc(("VbglR0SfConnect failed, rc=%d\n", rcVBox));
     639        vrc = VbglR0SfConnect(&client_handle);
     640        g_SfClient = client_handle; /* temporary */
     641        if (RT_FAILURE(vrc)) {
     642                LogRelFunc(("VbglR0SfConnect failed, vrc=%Rrc\n", vrc));
    632643                rcRet = -EPROTO;
    633644                goto fail1;
    634645        }
    635646
    636         rcVBox = VbglR0SfSetUtf8(&client_handle);
    637         if (RT_FAILURE(rcVBox)) {
    638                 LogRelFunc(("VbglR0SfSetUtf8 failed, rc=%d\n", rcVBox));
     647        vrc = VbglR0QueryHostFeatures(&g_fHostFeatures);
     648        if (RT_FAILURE(vrc))
     649        {
     650                LogRelFunc(("VbglR0QueryHostFeatures failed: vrc=%Rrc (ignored)\n", vrc));
     651                g_fHostFeatures = 0;
     652        }
     653        LogRelFunc(("g_fHostFeatures=%#x\n", g_fHostFeatures));
     654
     655        vrc = VbglR0SfSetUtf8(&client_handle);
     656        if (RT_FAILURE(vrc)) {
     657                LogRelFunc(("VbglR0SfSetUtf8 failed, vrc=%Rrc\n", vrc));
    639658                rcRet = -EPROTO;
    640659                goto fail2;
     
    642661#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
    643662        if (!follow_symlinks) {
    644                 rcVBox = VbglR0SfSetSymlinks(&client_handle);
    645                 if (RT_FAILURE(rcVBox)) {
     663                vrc = VbglR0SfSetSymlinks(&client_handle);
     664                if (RT_FAILURE(vrc)) {
    646665                        printk(KERN_WARNING
    647                                "vboxsf: Host unable to show symlinks, rc=%d\n",
    648                                rcVBox);
     666                               "vboxsf: Host unable to show symlinks, vrc=%d\n",
     667                               vrc);
    649668                }
    650669        }
     
    659678 fail2:
    660679        VbglR0SfDisconnect(&client_handle);
     680        g_SfClient = client_handle; /* temporary */
    661681
    662682 fail1:
    663         VbglR0HGCMTerminate();
     683        VbglR0SfTerm();
    664684
    665685 fail0:
     
    673693
    674694        VbglR0SfDisconnect(&client_handle);
    675         VbglR0HGCMTerminate();
     695        g_SfClient = client_handle; /* temporary */
     696        VbglR0SfTerm();
    676697        unregister_filesystem(&vboxsf_fs_type);
    677698}
  • trunk/src/VBox/Additions/linux/sharedfolders/vfsmod.h

    r76745 r77054  
    3535#endif
    3636
     37/* VBOXSF_USE_DEPRECATED_VBGL_INTERFACE is also settable in make env. */
     38/*#define VBOXSF_USE_DEPRECATED_VBGL_INTERFACE*/
     39
    3740#define LOG_GROUP LOG_GROUP_SHARED_FOLDERS
    3841#include "the-linux-kernel.h"
     
    4447
    4548#include <VBox/VBoxGuestLibSharedFolders.h>
     49#include <VBox/VBoxGuestLibSharedFoldersInline.h>
    4650#include "vbsfmount.h"
    4751
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