VirtualBox

Changeset 4729 in vbox for trunk/src


Ignore:
Timestamp:
Sep 12, 2007 11:45:18 AM (17 years ago)
Author:
vboxsync
Message:

Restructured the Linux shared folders guest module and made it use backdoor logging

Location:
trunk/src/VBox/Additions/linux
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/linux/module/Makefile.module

    r4707 r4729  
    3636        strformatrt.o \
    3737        strformat-vbox.o \
     38        divdi3.o \
     39        moddi3.o \
    3840        udivdi3.o \
    3941        umoddi3.o \
  • trunk/src/VBox/Additions/linux/module/files_vboxadd

    r4707 r4729  
    4848    ${PATH_ROOT}/src/VBox/Runtime/include/internal/magics.h=>include/internal/magics.h \
    4949    ${PATH_ROOT}/src/VBox/Runtime/include/internal/string.h=>include/internal/string.h \
     50    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/divdi3.c=>divdi3.c \
     51    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/moddi3.c=>moddi3.c \
    5052    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/qdivrem.c=>qdivrem.c \
    5153    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/quad.h=>quad.h \
  • trunk/src/VBox/Additions/linux/sharedfolders/Makefile.kmk

    r4707 r4729  
    4444#
    4545vboxvfs_TEMPLATE        = VBOXLNX32GUESTR0
    46 vboxvfs_DEFS           := KBUILD_MODNAME=KBUILD_STR\(vboxadd\) KBUILD_BASENAME=KBUILD_STR\(vboxadd\) MODULE IN_RING0 IN_RT_R0 VBOXGUEST VBOX_HGCM
     46vboxvfs_DEFS           := KBUILD_MODNAME=KBUILD_STR\(vboxadd\) \
     47                          KBUILD_BASENAME=KBUILD_STR\(vboxadd\) \
     48                          MODULE IN_RING0 IN_RT_R0 VBOXGUEST VBOX_HGCM
    4749vboxvfs_LIBS            = $(PATH_LIB)/VBoxGuestLibLinux.a $(PATH_LIB)/RuntimeLnx32GuestR0.a
    48 vboxvfs_SOURCES         = vfsmod.c
     50vboxvfs_SOURCES         = \
     51        vfsmod.c \
     52        utils.c \
     53        dirops.c \
     54        regops.c
    4955vboxvfs_NOINST          = 1
    5056vboxvfs_CFLAGS         += -fshort-wchar
  • trunk/src/VBox/Additions/linux/sharedfolders/Makefile.module

    r4707 r4729  
    1818OBJS   = \
    1919        vfsmod.o \
     20        dirops.o \
     21        regops.o \
     22        utils.o \
    2023        GenericRequest.o \
    2124        SysHlp.o \
     
    2831        r0drv/linux/alloc-r0drv-linux.o \
    2932        r0drv/linux/semaphore-r0drv-linux.o
     33#ifdef DEBUG
     34OBJS  += \
     35        divdi3.o \
     36        moddi3.o \
     37        udivdi3.o \
     38        umoddi3.o \
     39        qdivrem.o
     40#endif
     41
     42
    3043EXTRA_CFLAGS = -fshort-wchar
    3144
  • trunk/src/VBox/Additions/linux/sharedfolders/dirops.c

    r4071 r4729  
    1717 */
    1818
     19#include "vfsmod.h"
     20
    1921static int
    2022sf_dir_open (struct inode *inode, struct file *file)
     
    3234
    3335        if (file->private_data) {
    34                 elog ("dir_open called on already opened directory %s\n",
    35                       sf_i->path->String.utf8);
     36                LogFunc(("dir_open called on already opened directory %s\n",
     37                         sf_i->path->String.utf8));
    3638                return 0;
    3739        }
     
    4042
    4143        if (!sf_d) {
    42                 elog ("could not allocate directory info for %s\n",
    43                       sf_i->path->String.utf8);
     44                LogRelPrintFunc("could not allocate directory info for");
     45                LogRelPrint(sf_i->path->String.utf8);
     46                LogRelPrint("\n");
    4447                return -ENOMEM;
    4548        }
     
    5154                ;
    5255
     56        LogFunc(("sf_dir_open: calling vboxCallCreate, folder %s, flags %#x\n",
     57                 sf_i->path->String.utf8, params.CreateFlags));
    5358        rc = vboxCallCreate (&client_handle, &sf_g->map, sf_i->path, &params);
    5459        if (VBOX_FAILURE (rc)) {
    55                 elog ("vboxCallCreate(%s) failed rc=%d\n",
    56                       sf_i->path->String.utf8, rc);
     60                LogFunc(("vboxCallCreate(%s) failed rc=%Vrc\n",
     61                         sf_i->path->String.utf8, rc));
    5762                sf_dir_info_free (sf_d);
    5863                return -EPERM;
     
    6065
    6166        if (params.Result != SHFL_FILE_EXISTS) {
    62                 elog ("directory %s does not exist\n", sf_i->path->String.utf8);
     67                LogFunc(("directory %s does not exist\n", sf_i->path->String.utf8));
    6368                sf_dir_info_free (sf_d);
    6469                return -ENOENT;
     
    6974                rc = vboxCallClose (&client_handle, &sf_g->map, params.Handle);
    7075                if (VBOX_FAILURE (rc)) {
    71                         elog ("vboxCallClose(%s) after err=%d failed rc=%d\n",
    72                               sf_i->path->String.utf8, err, rc);
     76                        LogFunc(("vboxCallClose(%s) after err=%d failed rc=%Vrc\n",
     77                                 sf_i->path->String.utf8, err, rc));
    7378                }
    7479                sf_dir_info_free (sf_d);
     
    7984        rc = vboxCallClose (&client_handle, &sf_g->map, params.Handle);
    8085        if (VBOX_FAILURE (rc)) {
    81                 elog ("vboxCallClose(%s) failed rc=%d\n",
    82                       sf_i->path->String.utf8, rc);
     86                LogFunc(("vboxCallClose(%s) failed rc=%Vrc\n",
     87                          sf_i->path->String.utf8, rc));
    8388        }
    8489
     
    196201                        default:
    197202                                /* skip erroneous entry and proceed */
    198                                 elog ("sf_getdent error %d\n", err);
     203                                LogFunc(("sf_getdent error %d\n", err));
    199204                                dir->f_pos += 1;
    200205                                continue;
     
    206211                fake_ino = sanity;
    207212                if (sanity - fake_ino) {
    208                         elog2 ("can not compute ino\n");
     213                        LogRelPrintFunc("can not compute ino\n");
    209214                        return -EINVAL;
    210215                }
     
    213218                               dir->f_pos, fake_ino, DT_UNKNOWN);
    214219                if (err) {
    215                         DBGC elog ("filldir returned error %d\n", err);
     220                        LogFunc(("filldir returned error %d\n", err));
    216221                        /* Rely on the fact that filldir returns error
    217222                           only when it runs out of space in opaque */
     
    225230}
    226231
    227 static struct file_operations sf_dir_fops = {
     232struct file_operations sf_dir_fops = {
    228233        .open    = sf_dir_open,
    229234        .readdir = sf_dir_read,
     
    281286                sf_new_i = kmalloc (sizeof (*sf_new_i), GFP_KERNEL);
    282287                if (!sf_new_i) {
    283                         elog2 ("could not allocate memory for new inode info\n");
     288                        LogRelPrintFunc("could not allocate memory for new inode info\n");
    284289                        err = -ENOMEM;
    285290                        goto fail1;
     
    289294                inode = iget (parent->i_sb, ino);
    290295                if (!inode) {
    291                         elog2 ("iget failed\n");
     296                        LogFunc(("iget failed\n"));
    292297                        err = -ENOMEM;          /* XXX: ??? */
    293298                        goto fail2;
     
    332337        sf_new_i = kmalloc (sizeof (*sf_new_i), GFP_KERNEL);
    333338        if (!sf_new_i) {
    334                 elog3 ("%s: %s: could not allocate inode info\n",
    335                        caller, __func__);
     339                LogRelPrintFunc("could not allocate inode info.  caller=");
     340                LogRelPrint(caller);
     341                LogRelPrint("\n");
    336342                err = -ENOMEM;
    337343                goto fail0;
     
    341347        inode = iget (parent->i_sb, ino);
    342348        if (!inode) {
    343                 elog3 ("%s: %s: iget failed\n", caller, __func__);
     349                LogFunc(("iget failed.  caller=%s\n", caller));
    344350                err = -ENOMEM;
    345351                goto fail1;
     
    403409        }
    404410
     411        LogFunc(("sf_create_aux: calling vboxCallCreate, folder %s, flags %#x\n",
     412                 path->String.utf8, params.CreateFlags));
    405413        rc = vboxCallCreate (&client_handle, &sf_g->map, path, &params);
    406414        if (VBOX_FAILURE (rc)) {
    407415                err = -EPROTO;
    408                 elog ("(%d): vboxCallCreate(%s) failed rc=%d\n", dirop,
    409                       sf_i->path->String.utf8, rc);
     416                LogFunc(("(%d): vboxCallCreate(%s) failed rc=%Vrc\n", dirop,
     417                         sf_i->path->String.utf8, rc));
    410418                goto fail0;
    411419        }
     
    413421        if (params.Result != SHFL_FILE_CREATED) {
    414422                err = -EPERM;
    415                 elog ("(%d): could not create file %s result=%d\n", dirop,
    416                       sf_i->path->String.utf8, params.Result);
     423                LogFunc(("(%d): could not create file %s result=%d\n", dirop,
     424                         sf_i->path->String.utf8, params.Result));
    417425                goto fail0;
    418426        }
     
    420428        err = sf_instantiate (__func__, parent, dentry, path, &params.Info);
    421429        if (err) {
    422                 elog ("(%d): could not instantiate dentry for %s err=%d\n",
    423                       dirop, sf_i->path->String.utf8, err);
     430                LogFunc(("(%d): could not instantiate dentry for %s err=%d\n",
     431                         dirop, sf_i->path->String.utf8, err));
    424432                goto fail1;
    425433        }
     
    427435        rc = vboxCallClose (&client_handle, &sf_g->map, params.Handle);
    428436        if (VBOX_FAILURE (rc)) {
    429                 elog ("(%d): vboxCallClose failed rc=%d\n", dirop, rc);
     437                LogFunc(("(%d): vboxCallClose failed rc=%Vrc\n", dirop, rc));
    430438        }
    431439
     
    436444        rc = vboxCallClose (&client_handle, &sf_g->map, params.Handle);
    437445        if (VBOX_FAILURE (rc)) {
    438                 elog ("(%d): vboxCallClose failed rc=%d\n", dirop, rc);
     446                LogFunc(("(%d): vboxCallClose failed rc=%Vrc\n", dirop, rc));
    439447        }
    440448
     
    481489                             dirop ? SHFL_REMOVE_DIR : SHFL_REMOVE_FILE);
    482490        if (VBOX_FAILURE (rc)) {
    483                 DBGC elog ("(%d): vboxCallRemove(%s) failed rc=%d\n", dirop,
    484                            path->String.utf8, rc);
     491                LogFunc(("(%d): vboxCallRemove(%s) failed rc=%Vrc\n", dirop,
     492                         path->String.utf8, rc));
    485493
    486494                switch (rc) {
     
    495503                        default:
    496504                                err = -EPROTO;
    497                                 elog ("(%d): vboxCallRemove(%s) failed rc=%d\n", dirop,
    498                                       path->String.utf8, rc);
     505                                LogFunc(("(%d): vboxCallRemove(%s) failed rc=%Vrc\n", dirop,
     506                                         path->String.utf8, rc));
    499507                                break;
    500508                }
     
    535543        SHFLSTRING *old_path;
    536544        SHFLSTRING *new_path;
     545        int is_dir = ((old_dentry->d_inode->i_mode & S_IFDIR) != 0);
    537546
    538547        TRACE ();
     
    541550
    542551        if (sf_g != GET_GLOB_INFO (new_parent->i_sb)) {
    543                 elog2 ("rename with different roots\n");
     552                LogFunc(("rename with different roots\n"));
    544553                return -EINVAL;
    545554        }
     
    548557                                   old_dentry, &old_path);
    549558        if (err) {
    550                 elog2 ("failed to create old path\n");
     559                LogFunc(("failed to create old path\n"));
    551560                return err;
    552561        }
     
    555564                                   new_dentry, &new_path);
    556565        if (err) {
    557                 elog2 ("failed to create new path\n");
     566                LogFunc(("failed to create new path\n"));
    558567                goto fail0;
    559568        }
    560569
    561570        rc = vboxCallRename (&client_handle, &sf_g->map, old_path,
    562                              new_path, SHFL_RENAME_FILE);
     571                             new_path, is_dir ? 0 : SHFL_RENAME_FILE);
    563572        if (VBOX_FAILURE (rc)) {
    564573                switch (rc) {
     574                        /** @todo we need a function to convert VBox error
     575                            codes back to Linux. */
     576                        case VERR_ACCESS_DENIED:
     577                                err = -EACCES;
     578                                goto fail1;
     579                        case VERR_DEV_IO_ERROR:
     580                                return -EBUSY;
     581                                goto fail1;
     582                        case VERR_INVALID_POINTER:
     583                                return -EFAULT;
     584                                goto fail1;
    565585                        case VERR_FILE_NOT_FOUND:
    566586                        case VERR_PATH_NOT_FOUND:
     
    570590                        default:
    571591                                err = -EPROTO;
    572                                 elog ("vboxCallRename failed rc=%d\n", rc);
     592                                LogFunc(("vboxCallRename failed rc=%Vrc\n", rc));
    573593                                goto fail1;
    574594                }
     
    586606}
    587607
    588 static struct inode_operations sf_dir_iops = {
     608struct inode_operations sf_dir_iops = {
    589609        .lookup     = sf_lookup,
    590610        .create     = sf_create,
  • trunk/src/VBox/Additions/linux/sharedfolders/files_vboxvfs

    r4707 r4729  
    1414
    1515FILES_VBOXVFS_NOBIN=" \
     16    ${PATH_ROOT}/include/iprt/nocrt/limits.h=>include/iprt/nocrt/limits.h \
    1617    ${PATH_ROOT}/include/iprt/alloc.h=>include/iprt/alloc.h \
    1718    ${PATH_ROOT}/include/iprt/asm.h=>include/iprt/asm.h \
     
    5152    ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp=>VMMDev.c \
    5253    ${PATH_ROOT}/src/VBox/Runtime/include/internal/magics.h=>include/internal/magics.h \
     54    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/divdi3.c=>divdi3.c \
     55    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/moddi3.c=>moddi3.c \
     56    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/qdivrem.c=>qdivrem.c \
     57    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/quad.h=>quad.h \
     58    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/udivdi3.c=>udivdi3.c \
     59    ${PATH_ROOT}/src/VBox/Runtime/math/gcc/umoddi3.c=>umoddi3.c \
    5360    ${PATH_ROOT}/src/VBox/Runtime/r0drv/alloc-r0drv.cpp=>r0drv/alloc-r0drv.c \
    5461    ${PATH_ROOT}/src/VBox/Runtime/r0drv/alloc-r0drv.h=>r0drv/alloc-r0drv.h \
  • trunk/src/VBox/Additions/linux/sharedfolders/regops.c

    r4385 r4729  
    2121 */
    2222
     23#include "vfsmod.h"
     24
    2325#define CHUNK_SIZE 4096
    2426
     
    3234                               pos, nread, buf, false /* already locked? */);
    3335        if (VBOX_FAILURE (rc)) {
    34                 elog3 ("%s: %s: vboxCallRead failed rc=%d\n",
    35                        caller, __func__, rc);
     36                LogFunc(("vboxCallRead failed.  caller=%s, rc=%Vrc\n",
     37                         caller, rc));
    3638                return -EPROTO;
    3739        }
     
    5355        TRACE ();
    5456        if (!S_ISREG (inode->i_mode)) {
    55                 elog ("read from non regular file %d\n", inode->i_mode);
     57                LogFunc(("read from non regular file %d\n", inode->i_mode));
    5658                return -EINVAL;
    5759        }
     
    6365        tmp = kmalloc (CHUNK_SIZE, GFP_KERNEL);
    6466        if (!tmp) {
    65                 elog ("could not allocate bounce buffer memory %u bytes\n",
    66                       CHUNK_SIZE);
     67                LogRelPrintFunc("could not allocate bounce buffer memory ");
     68                LogRelPrintQuote(CHUNK_SIZE);
     69                LogRelPrint(" bytes\n");
    6770                return -ENOMEM;
    6871        }
     
    124127
    125128        if (!S_ISREG (inode->i_mode)) {
    126                 elog ("write to non regular file %d\n",  inode->i_mode);
     129                LogFunc(("write to non regular file %d\n",  inode->i_mode));
    127130                return -EINVAL;
    128131        }
     
    134137        tmp = kmalloc (CHUNK_SIZE, GFP_KERNEL);
    135138        if (!tmp) {
    136                 elog ("could not allocate bounce buffer memory %u bytes\n",
    137                       CHUNK_SIZE);
     139                LogRelPrintFunc("could not allocate bounce buffer memory ");
     140                LogRelPrintQuote(CHUNK_SIZE);
     141                LogRelPrint("bytes\n");
    138142                return -ENOMEM;
    139143        }
     
    158162                if (VBOX_FAILURE (rc)) {
    159163                        err = -EPROTO;
    160                         elog ("vboxCallWrite(%s) failed rc=%d\n",
    161                               sf_i->path->String.utf8, rc);
     164                        LogFunc(("vboxCallWrite(%s) failed rc=%Vrc\n",
     165                                 sf_i->path->String.utf8, rc));
    162166                        goto fail;
    163167                }
     
    189193sf_reg_open (struct inode *inode, struct file *file)
    190194{
    191         int rc;
     195        int rc, rc_linux = 0;
    192196        struct sf_glob_info *sf_g = GET_GLOB_INFO (inode->i_sb);
    193197        struct sf_inode_info *sf_i = GET_INODE_INFO (inode);
     
    201205        sf_r = kmalloc (sizeof (*sf_r), GFP_KERNEL);
    202206        if (!sf_r) {
    203                 elog2 ("could not allocate reg info\n");
     207                LogRelPrintFunc("could not allocate reg info\n");
    204208                return -ENOMEM;
    205209        }
    206210
    207 #if 0
    208         printk ("open %s\n", sf_i->path->String.utf8);
    209 #endif
     211        LogFunc(("open %s\n", sf_i->path->String.utf8));
    210212
    211213        params.CreateFlags = 0;
    212214        params.Info.cbObject = 0;
     215        /* We check this afterwards to find out if the call succeeded
     216           or failed, as the API does not seem to cleanly distinguish
     217           error and informational messages. */
     218        params.Handle = 0;
    213219
    214220        if (file->f_flags & O_CREAT) {
     221                LogFunc(("O_CREAT set\n"));
     222                params.CreateFlags |= SHFL_CF_ACT_CREATE_IF_NEW;
    215223                if (file->f_flags & O_EXCL) {
    216                         params.CreateFlags |= SHFL_CF_ACCESS_READWRITE;
     224                        LogFunc(("O_EXCL set\n"));
    217225                        params.CreateFlags |= SHFL_CF_ACT_FAIL_IF_EXISTS;
    218226                }
    219227                else {
    220                         params.CreateFlags |= SHFL_CF_ACT_CREATE_IF_NEW;
    221                         params.CreateFlags |= SHFL_CF_ACCESS_READWRITE;
     228                        /* O_TRUNC combined with O_EXCL is undefined. */
    222229                        if (file->f_flags & O_TRUNC) {
     230                                LogFunc(("O_TRUNC set\n"));
    223231                                params.CreateFlags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS;
    224232                        }
     
    229237        }
    230238        else {
     239                params.CreateFlags |= SHFL_CF_ACT_FAIL_IF_NEW;
    231240                if (file->f_flags & O_TRUNC) {
    232                         params.CreateFlags |= SHFL_CF_ACCESS_READWRITE;
     241                        LogFunc(("O_TRUNC set\n"));
    233242                        params.CreateFlags |= SHFL_CF_ACT_OVERWRITE_IF_EXISTS;
    234                 }
    235                 else {
    236                         params.CreateFlags |= SHFL_CF_ACT_FAIL_IF_NEW;
    237243                }
    238244        }
     
    257263        }
    258264
     265        LogFunc(("sf_reg_open: calling vboxCallCreate, file %s, flags=%d, %#x\n",
     266                 sf_i->path->String.utf8 , file->f_flags, params.CreateFlags));
    259267        rc = vboxCallCreate (&client_handle, &sf_g->map, sf_i->path, &params);
    260268
    261         /* XXX: here i probably should check rc and convert some values to
    262            EEXISTS ENOENT etc */
    263         if (VBOX_FAILURE (rc)) 
    264         {
    265             elog ("vboxCallCreate failed flags=%d,%#x rc=%d\n",
    266                   file->f_flags, params.CreateFlags, rc);
    267             kfree (sf_r);
    268             return -EPROTO;
    269         }
    270 
    271         /** @todo handle these return codes!! */
    272         switch (params.Result)
    273         {
    274         case SHFL_PATH_NOT_FOUND:
    275             break;
    276         case SHFL_FILE_NOT_FOUND:
    277             break;
    278         case SHFL_FILE_EXISTS:
    279             break;
    280         case SHFL_FILE_REPLACED:
    281             break;
    282         case SHFL_FILE_CREATED:
    283             break;
     269        if (VBOX_FAILURE (rc)) {
     270                LogFunc(("vboxCallCreate failed flags=%d,%#x rc=%Vrc\n",
     271                         file->f_flags, params.CreateFlags, rc));
     272                kfree (sf_r);
     273                return -EPROTO;
     274        }
     275
     276        if (SHFL_HANDLE_NIL == params.Handle) {
     277                switch (params.Result) {
     278                case SHFL_PATH_NOT_FOUND:
     279                case SHFL_FILE_NOT_FOUND:
     280                        rc_linux = -ENOENT;
     281                        break;
     282                case SHFL_FILE_EXISTS:
     283                        rc_linux = -EEXIST;
     284                        break;
     285                default:
     286                        break;
     287                }
    284288        }
    285289
     
    287291        sf_r->handle = params.Handle;
    288292        file->private_data = sf_r;
    289         return 0;
     293        return rc_linux;
    290294}
    291295
     
    306310        rc = vboxCallClose (&client_handle, &sf_g->map, sf_r->handle);
    307311        if (VBOX_FAILURE (rc)) {
    308                 elog ("vboxCallClose failed rc=%d\n", rc);
     312                LogFunc(("vboxCallClose failed rc=%Vrc\n", rc));
    309313        }
    310314
     
    341345        page = alloc_page (GFP_HIGHUSER);
    342346        if (!page) {
    343                 elog2 ("failed to allocate page\n");
     347                LogRelPrintFunc("failed to allocate page\n");
    344348                SET_TYPE (VM_FAULT_OOM);
    345349                return NOPAGE_OOM;
     
    384388        TRACE ();
    385389        if (vma->vm_flags & VM_SHARED) {
    386                 elog2 ("shared mmapping not available\n");
     390                LogFunc(("shared mmapping not available\n"));
    387391                return -EINVAL;
    388392        }
     
    392396}
    393397
    394 static struct file_operations sf_reg_fops = {
     398struct file_operations sf_reg_fops = {
    395399        .read    = sf_reg_read,
    396400        .open    = sf_reg_open,
     
    403407/* iops */
    404408
    405 static struct inode_operations sf_reg_iops = {
     409struct inode_operations sf_reg_iops = {
    406410#if LINUX_VERSION_CODE < KERNEL_VERSION (2, 6, 0)
    407411        .revalidate = sf_inode_revalidate
  • trunk/src/VBox/Additions/linux/sharedfolders/utils.c

    r4071 r4729  
    1818 */
    1919
     20#include "vfsmod.h"
     21
    2022/* #define USE_VMALLOC */
    2123
     
    4345
    4446/* set [inode] attributes based on [info], uid/gid based on [sf_g] */
    45 static void
     47void
    4648sf_init_inode (struct sf_glob_info *sf_g, struct inode *inode,
    4749               RTFSOBJINFO *info)
     
    101103}
    102104
    103 static int
     105int
    104106sf_stat (const char *caller, struct sf_glob_info *sf_g,
    105107         SHFLSTRING *path, RTFSOBJINFO *result, int ok_to_fail)
     
    110112        TRACE ();
    111113        params.CreateFlags = SHFL_CF_LOOKUP | SHFL_CF_ACT_FAIL_IF_NEW;
     114        LogFunc(("calling vboxCallCreate, file %s, flags %#x\n",
     115                 path->String.utf8, params.CreateFlags));
    112116        rc = vboxCallCreate (&client_handle, &sf_g->map, path, &params);
    113117        if (VBOX_FAILURE (rc)) {
    114                 elog3 ("%s: %s: vboxCallCreate(%s) failed rc=%d\n",
    115                        caller, __func__, path->String.utf8, rc);
     118                LogFunc(("vboxCallCreate(%s) failed.  caller=%s, rc=%Vrc\n",
     119                         path->String.utf8, rc, caller));
    116120                return -EPROTO;
    117121        }
     
    119123        if (params.Result != SHFL_FILE_EXISTS) {
    120124                if (!ok_to_fail) {
    121                         elog3 ("%s: %s: vboxCallCreate(%s)"
    122                                " file does not exist result=%d\n",
    123                                caller, __func__, path->String.utf8, params.Result);
     125                        LogFunc(("vboxCallCreate(%s) file does not exist.  caller=%s, result=%d\n",
     126                                 path->String.utf8, params.Result, caller));
    124127                }
    125128                return -ENOENT;
     
    146149        TRACE ();
    147150        if (!dentry || !dentry->d_inode) {
    148                 DBGC elog ("no dentry(%p) or inode(%p)\n", dentry, dentry->d_inode);
     151                LogFunc(("no dentry(%p) or inode(%p)\n", dentry, dentry->d_inode));
    149152                return -EINVAL;
    150153        }
     
    201204   [generic_fillattr] */
    202205#if LINUX_VERSION_CODE >= KERNEL_VERSION (2, 6, 0)
    203 static int
     206int
    204207sf_getattr (struct vfsmount *mnt, struct dentry *dentry, struct kstat *kstat)
    205208{
     
    240243                path_len = p_len + d_len + 2;
    241244                if (path_len > 0xffff) {
    242                         elog ("%s: path to big %zu\n", caller, path_len);
     245                        LogFunc(("path too long.  caller=%s, path_len=%zu\n", caller, path_len));
    243246                        return -ENAMETOOLONG;
    244247                }
     
    248251        tmp = kmalloc (shflstring_len, GFP_KERNEL);
    249252        if (!tmp) {
    250                 elog ("%s: kmalloc failed\n", caller);
     253                LogRelPrintFunc("kmalloc failed, caller=");
     254                LogRelPrint(caller);
    251255                return -ENOMEM;
    252256        }
     
    272276   to [sf_g]->nls, we must convert it to UTF8 here and pass down to
    273277   [sf_make_path] which will allocate SHFLSTRING and fill it in */
    274 static int
     278int
    275279sf_path_from_dentry (const char *caller, struct sf_glob_info *sf_g,
    276280                     struct sf_inode_info *sf_i, struct dentry *dentry,
     
    307311                        nb = sf_g->nls->char2uni (in, in_len, &uni);
    308312                        if (nb < 0) {
    309                                 elog ("nls->char2uni failed %x %d\n",
    310                                       *in, in_len);
     313                                LogFunc(("nls->char2uni failed %x %d\n",
     314                                         *in, in_len));
    311315                                err = -EINVAL;
    312316                                goto fail1;
     
    317321                        nb = utf8_wctomb (out, uni, out_bound_len);
    318322                        if (nb < 0) {
    319                                 elog ("nls->uni2char failed %x %d\n",
    320                                       uni, out_bound_len);
     323                                LogFunc(("nls->uni2char failed %x %d\n",
     324                                         uni, out_bound_len));
    321325                                err = -EINVAL;
    322326                                goto fail1;
     
    331335                }
    332336
    333                 DBGC printk (KERN_DEBUG "result(%d) = %.*s\n", len, len, name);
     337                LogFunc(("result(%d) = %.*s\n", len, len, name));
    334338                *out = 0;
    335339        }
     
    350354}
    351355
    352 static int
     356int
    353357sf_nlscpy (struct sf_glob_info *sf_g,
    354358           char *name, size_t name_bound_len,
     
    375379                        nb = utf8_mbtowc (&uni, in, in_bound_len);
    376380                        if (nb < 0) {
    377                                 elog ("utf8_mbtowc failed(%s) %x:%d\n",
    378                                       utf8_name, *in, in_bound_len);
     381                                LogFunc(("utf8_mbtowc failed(%s) %x:%d\n",
     382                                         (const char *) utf8_name, *in, in_bound_len));
    379383                                return -EINVAL;
    380384                        }
     
    384388                        nb = sf_g->nls->uni2char (uni, out, out_bound_len);
    385389                        if (nb < 0) {
    386                                 elog ("nls->uni2char failed(%s) %x:%d\n",
    387                                       utf8_name, uni, out_bound_len);
     390                                LogFunc(("nls->uni2char failed(%s) %x:%d\n",
     391                                         utf8_name, uni, out_bound_len));
    388392                                return nb;
    389393                        }
     
    415419        b = kmalloc (sizeof (*b), GFP_KERNEL);
    416420        if (!b) {
    417                 elog2 ("could not alloc directory buffer\n");
     421                LogRelPrintFunc("could not alloc directory buffer\n");
    418422                return NULL;
    419423        }
     
    426430        if (!b->buf) {
    427431                kfree (b);
    428                 elog2 ("could not alloc directory buffer storage\n");
     432                LogRelPrintFunc("could not alloc directory buffer storage\n");
    429433                return NULL;
    430434        }
     
    452456}
    453457
    454 static void
     458void
    455459sf_dir_info_free (struct sf_dir_info *p)
    456460{
     
    468472}
    469473
    470 static struct sf_dir_info *
     474struct sf_dir_info *
    471475sf_dir_info_alloc (void)
    472476{
     
    476480        p = kmalloc (sizeof (*p), GFP_KERNEL);
    477481        if (!p) {
    478                 elog2 ("could not alloc directory info\n");
     482                LogRelPrintFunc("could not alloc directory info\n");
    479483                return NULL;
    480484        }
     
    507511}
    508512
    509 static int
     513int
    510514sf_dir_read_all (struct sf_glob_info *sf_g, struct sf_inode_info *sf_i,
    511515                 struct sf_dir_info *sf_d, SHFLHANDLE handle)
     
    532536                        if (!b) {
    533537                                err = -ENOMEM;
    534                                 elog2 ("could not alloc directory buffer\n");
     538                                LogRelPrintFunc("could not alloc directory buffer\n");
    535539                                goto fail1;
    536540                        }
     
    560564
    561565                        case VERR_NO_TRANSLATION:
    562                                 elog2 ("host could not translte entry\n");
     566                                LogFunc(("host could not translate entry\n"));
    563567                                /* XXX */
    564568                                break;
     
    566570                        default:
    567571                                err = -EPROTO;
    568                                 elog ("vboxCallDirInfo failed rc=%d\n", rc);
     572                                LogFunc(("vboxCallDirInfo failed rc=%Vrc\n", rc));
    569573                                goto fail1;
    570574                }
     
    587591}
    588592
    589 static struct dentry_operations sf_dentry_ops = {
     593struct dentry_operations sf_dentry_ops = {
    590594        .d_revalidate = sf_dentry_revalidate
    591595};
  • trunk/src/VBox/Additions/linux/sharedfolders/vfsmod.c

    r4071 r4729  
    2222 */
    2323
    24 #include "the-linux-kernel.h"
    25 #include "version-generated.h"
    26 
    2724/*
    2825 * Suppress the definition of wchar_t from stddef.h that occurs below.
     
    3431#endif
    3532#endif
     33
    3634#include "vfsmod.h"
    37 #include "VBoxCalls.h"
    38 #include "vbsfmount.h"
    3935
    4036// #define wchar_t linux_wchar_t
     
    4743#endif
    4844
    49 /* structs */
    50 struct sf_glob_info {
    51         VBSFMAP map;
    52         struct nls_table *nls;
    53         int ttl;
    54         int uid;
    55         int gid;
    56 };
    57 
    58 struct sf_inode_info {
    59         SHFLSTRING *path;
    60         int force_restat;
    61 };
    62 
    63 struct sf_dir_info {
    64         struct list_head info_list;
    65 };
    66 
    67 struct sf_dir_buf {
    68         size_t nb_entries;
    69         size_t free_bytes;
    70         size_t used_bytes;
    71         void *buf;
    72         struct list_head head;
    73 };
    74 
    75 struct sf_reg_info {
    76         SHFLHANDLE handle;
    77 };
    78 
    7945/* globals */
    80 static VBSFCLIENT client_handle;
     46VBSFCLIENT client_handle;
    8147
    8248/* forward declarations */
    83 static struct inode_operations  sf_dir_iops;
    84 static struct inode_operations  sf_reg_iops;
    85 static struct file_operations   sf_dir_fops;
    86 static struct file_operations   sf_reg_fops;
    8749static struct super_operations  sf_super_ops;
    88 static struct dentry_operations sf_dentry_ops;
    89 
    90 #include "utils.c"
    91 #include "dirops.c"
    92 #include "regops.c"
     50
     51// #include "utils.c"
     52// #include "dirops.c"
     53// #include "regops.c"
    9354
    9455/* allocate global info, try to map host share */
     
    10566        if (!sf_g) {
    10667                err = -ENOMEM;
    107                 elog2 ("could not allocate memory for global info\n");
     68                LogRelPrintFunc("could not allocate memory for global info\n");
    10869                goto fail0;
    10970        }
     
    11576        if (name_len > 0xfffe) {
    11677                err = -ENAMETOOLONG;
    117                 elog2 ("map name too big\n");
     78                LogFunc(("map name too big\n"));
    11879                goto fail1;
    11980        }
     
    12384        if (!str_name) {
    12485                err = -ENOMEM;
    125                 elog2 ("could not allocate memory for host name\n");
     86                LogRelPrintFunc("could not allocate memory for host name\n");
    12687                goto fail1;
    12788        }
     
    13596                if (!sf_g->nls) {
    13697                        err = -EINVAL;
    137                         elog ("failed to load nls %.*s\n",
    138                               sizeof (info->nls_name), info->nls_name);
     98                        LogFunc(("failed to load nls %s\n", info->nls_name));
    13999                        goto fail1;
    140100                }
     
    149109        if (VBOX_FAILURE (rc)) {
    150110                err = -EPROTO;
    151                 elog ("vboxCallMapFolder failed rc=%d\n", rc);
     111                LogFunc(("vboxCallMapFolder failed rc=%d\n", rc));
    152112                goto fail2;
    153113        }
     
    179139        rc = vboxCallUnmapFolder (&client_handle, &sf_g->map);
    180140        if (VBOX_FAILURE (rc)) {
    181                 elog ("vboxCallUnmapFolder failed rc=%d\n", rc);
     141                LogFunc(("vboxCallUnmapFolder failed rc=%d\n", rc));
    182142        }
    183143
     
    210170        TRACE ();
    211171        if (!data) {
    212                 elog2 ("no mount info specified\n");
     172                LogFunc(("no mount info specified\n"));
    213173                return -EINVAL;
    214174        }
     
    217177
    218178        if (flags & MS_REMOUNT) {
    219                 elog2 ("remounting is not supported\n");
     179                LogFunc(("remounting is not supported\n"));
    220180                return -ENOSYS;
    221181        }
     
    229189        if (!sf_i) {
    230190                err = -ENOMEM;
    231                 elog2 ("could not allocate memory for root inode info\n");
     191                LogRelPrintFunc ("could not allocate memory for root inode info\n");
    232192                goto fail1;
    233193        }
     
    236196        if (!sf_i->path) {
    237197                err = -ENOMEM;
    238                 elog2 ("could not allocate memory for root inode path\n");
     198                LogRelPrintFunc ("could not allocate memory for root inode path\n");
    239199                goto fail2;
    240200        }
     
    247207        err = sf_stat (__func__, sf_g, sf_i->path, &fsinfo, 0);
    248208        if (err) {
    249                 elog2 ("could not stat root of share\n");
     209                LogFunc(("could not stat root of share\n"));
    250210                goto fail3;
    251211        }
     
    258218        if (!iroot) {
    259219                err = -ENOMEM;  /* XXX */
    260                 elog2 ("could not get root inode\n");
     220                LogFunc(("could not get root inode\n"));
    261221                goto fail3;
    262222        }
     
    268228        if (!droot) {
    269229                err = -ENOMEM;  /* XXX */
    270                 elog2 ("d_alloc_root failed\n");
     230                LogFunc(("d_alloc_root failed\n"));
    271231                goto fail4;
    272232        }
     
    441401        err = register_filesystem (&vboxsf_fs_type);
    442402        if (err) {
    443                 elog ("register_filesystem err=%d\n", err);
     403                LogFunc(("register_filesystem err=%d\n", err));
    444404                return err;
    445405        }
     
    451411        rc = vboxInit ();
    452412        if (VBOX_FAILURE (rc)) {
    453                 elog ("vboxInit failed rc=%d\n", rc);
     413                LogRelPrintFunc ("vboxInit failed\n");
     414                Log (("rc=%d\n", rc));
    454415                goto fail0;
    455416        }
     
    457418        rc = vboxConnect (&client_handle);
    458419        if (VBOX_FAILURE (rc)) {
    459                 elog ("vboxConnect failed rc=%d\n", rc);
     420                LogRelPrintFunc ("vboxConnect failed\n");
     421                Log (("rc=%d\n", rc));
    460422                goto fail1;
    461423        }
     
    463425        rc = vboxCallSetUtf8 (&client_handle);
    464426        if (VBOX_FAILURE (rc)) {
    465                 elog ("vboxCallSetUtf8 failed rc=%d\n", rc);
     427                LogRelPrintFunc ("vboxCallSetUtf8 failed\n");
     428                Log (("rc=%d\n", rc));
    466429                goto fail2;
    467430        }
     
    496459int __gxx_personality_v0 = 0xdeadbeef;
    497460
     461#if 0
    498462/* long long hacks (as far as i can see, gcc emits the refs to those
    499463   symbols, notwithstanding the fact that those aren't referenced
     
    510474        BUG ();
    511475}
     476#endif /* 0 */
    512477
    513478/*
  • trunk/src/VBox/Additions/linux/sharedfolders/vfsmod.h

    r4071 r4729  
    1919#define VFSMOD_H
    2020
    21 #define elog(fmt, ...) \
    22 printk (KERN_ERR "vboxvfs: %s: " fmt, __func__, __VA_ARGS__)
    23 #define elog2(s) printk (KERN_ERR "vboxvfs: %s: " s, __func__)
    24 #define elog3(...) printk (KERN_ERR "vboxvfs: " __VA_ARGS__)
     21#include "the-linux-kernel.h"
     22#include "version-generated.h"
     23
     24#include "VBoxCalls.h"
     25#include "vbsfmount.h"
     26
     27/* structs */
     28struct sf_glob_info {
     29        VBSFMAP map;
     30        struct nls_table *nls;
     31        int ttl;
     32        int uid;
     33        int gid;
     34};
     35
     36struct sf_inode_info {
     37        SHFLSTRING *path;
     38        int force_restat;
     39};
     40
     41struct sf_dir_info {
     42        struct list_head info_list;
     43};
     44
     45struct sf_dir_buf {
     46        size_t nb_entries;
     47        size_t free_bytes;
     48        size_t used_bytes;
     49        void *buf;
     50        struct list_head head;
     51};
     52
     53struct sf_reg_info {
     54        SHFLHANDLE handle;
     55};
     56
     57/* globals */
     58extern VBSFCLIENT client_handle;
     59
     60/* forward declarations */
     61extern struct inode_operations  sf_dir_iops;
     62extern struct inode_operations  sf_reg_iops;
     63extern struct file_operations   sf_dir_fops;
     64extern struct file_operations   sf_reg_fops;
     65extern struct dentry_operations sf_dentry_ops;
     66
     67extern int
     68sf_stat (const char *caller, struct sf_glob_info *sf_g,
     69         SHFLSTRING *path, RTFSOBJINFO *result, int ok_to_fail);
     70extern void
     71sf_init_inode (struct sf_glob_info *sf_g, struct inode *inode,
     72               RTFSOBJINFO *info);
     73#if LINUX_VERSION_CODE >= KERNEL_VERSION (2, 6, 0)
     74extern int
     75sf_getattr (struct vfsmount *mnt, struct dentry *dentry, struct kstat *kstat);
     76#endif
     77extern int
     78sf_path_from_dentry (const char *caller, struct sf_glob_info *sf_g,
     79                     struct sf_inode_info *sf_i, struct dentry *dentry,
     80                     SHFLSTRING **result);
     81extern int
     82sf_nlscpy (struct sf_glob_info *sf_g,
     83           char *name, size_t name_bound_len,
     84           const unsigned char *utf8_name, size_t utf8_len);
     85extern void
     86sf_dir_info_free (struct sf_dir_info *p);
     87extern struct sf_dir_info *
     88sf_dir_info_alloc (void);
     89extern int
     90sf_dir_read_all (struct sf_glob_info *sf_g, struct sf_inode_info *sf_i,
     91                 struct sf_dir_info *sf_d, SHFLHANDLE handle);
    2592
    2693#ifdef ALIGN
     
    3097#define CMC_API __attribute__ ((cdecl, regparm (0)))
    3198
    32 #define DBGC if (0)
    33 #define TRACE() DBGC printk (KERN_DEBUG "%s\n", __func__)
     99#define TRACE() LogFlow (("%s, tracepoint\n", __func__))
    34100
    35101/* Following casts are here to prevent assignment of void * to
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