VirtualBox

Ignore:
Timestamp:
Jun 10, 2010 4:05:56 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
62572
Message:

Linux shared folders: re-read the directory if a file was changed

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/linux/sharedfolders/dirops.c

    r28998 r30150  
    122122        struct sf_glob_info *sf_g;
    123123        struct sf_dir_info *sf_d;
     124        struct sf_inode_info *sf_i;
     125        struct inode *inode;
    124126        struct list_head *pos, *list;
    125127
    126128        TRACE ();
     129
    127130        sf_g = GET_GLOB_INFO (dir->f_dentry->d_inode->i_sb);
    128131        sf_d = dir->private_data;
     
    131134        BUG_ON (!sf_d);
    132135
     136        inode = dir->f_dentry->d_inode;
     137        sf_i = GET_INODE_INFO(inode);
     138
     139        BUG_ON (!sf_i);
     140
     141        if (sf_i->force_reread)
     142        {
     143                int rc;
     144                int err;
     145                SHFLCREATEPARMS params;
     146 
     147                RT_ZERO(params);
     148 
     149                params.CreateFlags = 0
     150                                   | SHFL_CF_DIRECTORY
     151                                   | SHFL_CF_ACT_OPEN_IF_EXISTS
     152                                   | SHFL_CF_ACT_FAIL_IF_NEW
     153                                   | SHFL_CF_ACCESS_READ
     154                                   ;
     155 
     156                LogFunc(("sf_getdent: calling vboxCallCreate, folder %s, flags %#x\n",
     157                            sf_i->path->String.utf8, params.CreateFlags));
     158                rc = vboxCallCreate (&client_handle, &sf_g->map, sf_i->path, &params);
     159                if (RT_FAILURE (rc)) {
     160                    LogRel(("open failed %d\n", rc));
     161                    LogFunc(("vboxCallCreate(%s) failed rc=%Rrc\n",
     162                                sf_i->path->String.utf8, rc));
     163                    return -EPERM;
     164                }
     165 
     166                if (params.Result != SHFL_FILE_EXISTS) {
     167                    LogRel(("not exist %x\n", params.Result));
     168                    LogFunc(("directory %s does not exist\n", sf_i->path->String.utf8));
     169                    sf_dir_info_free (sf_d);
     170                    return -ENOENT;
     171                }
     172 
     173                sf_dir_info_empty (sf_d);
     174                err = sf_dir_read_all (sf_g, sf_i, sf_d, params.Handle);
     175                rc = vboxCallClose (&client_handle, &sf_g->map, params.Handle);
     176                if (RT_FAILURE (rc)) {
     177                    LogFunc(("vboxCallClose(%s) failed rc=%Rrc\n",
     178                             sf_i->path->String.utf8, rc));
     179                }
     180                if (err)
     181                    return err;
     182                sf_i->force_reread = 0;
     183        }
     184 
    133185        cur = 0;
    134186        list = &sf_d->info_list;
     
    531583        }
    532584
     585        /* directory access/change time changed */
     586        sf_i->force_restat = 1;
     587        /* directory content changed */
     588        sf_i->force_reread = 1;
    533589        kfree (path);
    534590        return 0;
Note: See TracChangeset for help on using the changeset viewer.

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