Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/vfs/vfs_ops.c

    r1e4cada rdd2cfa7  
    4444#include <string.h>
    4545#include <bool.h>
    46 #include <fibril_synch.h>
     46#include <fibril_sync.h>
    4747#include <adt/list.h>
    4848#include <unistd.h>
     
    125125                            (ipcarg_t) dev_handle, &answer);
    126126                        /* send the mount options */
    127                         rc = async_data_write_start(phone, (void *)opts,
     127                        rc = ipc_data_write_start(phone, (void *)opts,
    128128                            str_size(opts));
    129129                        if (rc != EOK) {
     
    207207       
    208208        /* send the mount options */
    209         rc = async_data_write_start(phone, (void *)opts, str_size(opts));
     209        rc = ipc_data_write_start(phone, (void *)opts, str_size(opts));
    210210        if (rc != EOK) {
    211211                async_wait_for(msg, NULL);
     
    268268        ipc_callid_t callid;
    269269        size_t size;
    270         if (!async_data_write_receive(&callid, &size)) {
     270        if (!ipc_data_write_receive(&callid, &size)) {
    271271                ipc_answer_0(callid, EINVAL);
    272272                ipc_answer_0(rid, EINVAL);
     
    290290       
    291291        /* Deliver the mount point. */
    292         ipcarg_t retval = async_data_write_finalize(callid, mp, size);
     292        ipcarg_t retval = ipc_data_write_finalize(callid, mp, size);
    293293        if (retval != EOK) {
    294294                ipc_answer_0(rid, retval);
     
    299299       
    300300        /* Now we expect to receive the mount options. */
    301         if (!async_data_write_receive(&callid, &size)) {
     301        if (!ipc_data_write_receive(&callid, &size)) {
    302302                ipc_answer_0(callid, EINVAL);
    303303                ipc_answer_0(rid, EINVAL);
     
    324324
    325325        /* Deliver the mount options. */
    326         retval = async_data_write_finalize(callid, opts, size);
     326        retval = ipc_data_write_finalize(callid, opts, size);
    327327        if (retval != EOK) {
    328328                ipc_answer_0(rid, retval);
     
    337337         * system.
    338338         */
    339         if (!async_data_write_receive(&callid, &size)) {
     339        if (!ipc_data_write_receive(&callid, &size)) {
    340340                ipc_answer_0(callid, EINVAL);
    341341                ipc_answer_0(rid, EINVAL);
     
    370370       
    371371        /* Deliver the file system name. */
    372         retval = async_data_write_finalize(callid, fs_name, size);
     372        retval = ipc_data_write_finalize(callid, fs_name, size);
    373373        if (retval != EOK) {
    374374                ipc_answer_0(rid, retval);
     
    469469       
    470470        ipc_callid_t callid;
    471         if (!async_data_write_receive(&callid, &len)) {
     471        if (!ipc_data_write_receive(&callid, &len)) {
    472472                ipc_answer_0(callid, EINVAL);
    473473                ipc_answer_0(rid, EINVAL);
     
    483483       
    484484        int rc;
    485         if ((rc = async_data_write_finalize(callid, path, len))) {
     485        if ((rc = ipc_data_write_finalize(callid, path, len))) {
    486486                ipc_answer_0(rid, rc);
    487487                free(path);
     
    543543         * structure.
    544544         */
    545         int fd = vfs_fd_alloc((oflag & O_DESC) != 0);
     545        int fd = vfs_fd_alloc();
    546546        if (fd < 0) {
    547547                vfs_node_put(node);
     
    620620         * structure.
    621621         */
    622         int fd = vfs_fd_alloc((oflag & O_DESC) != 0);
     622        int fd = vfs_fd_alloc();
    623623        if (fd < 0) {
    624624                vfs_node_put(node);
     
    679679}
    680680
    681 static int vfs_close_internal(vfs_file_t *file)
    682 {
    683         /*
    684          * Lock the open file structure so that no other thread can manipulate
    685          * the same open file at a time.
    686          */
    687         fibril_mutex_lock(&file->lock);
    688        
    689         if (file->refcnt <= 1) {
    690                 /* Only close the file on the destination FS server
    691                    if there are no more file descriptors (except the
    692                    present one) pointing to this file. */
    693                
    694                 int fs_phone = vfs_grab_phone(file->node->fs_handle);
    695                
    696                 /* Make a VFS_OUT_CLOSE request at the destination FS server. */
    697                 aid_t msg;
    698                 ipc_call_t answer;
    699                 msg = async_send_2(fs_phone, VFS_OUT_CLOSE, file->node->dev_handle,
    700                     file->node->index, &answer);
    701                
    702                 /* Wait for reply from the FS server. */
    703                 ipcarg_t rc;
    704                 async_wait_for(msg, &rc);
    705                
    706                 vfs_release_phone(fs_phone);
    707                 fibril_mutex_unlock(&file->lock);
    708                
    709                 return IPC_GET_ARG1(answer);
    710         }
    711        
    712         fibril_mutex_unlock(&file->lock);
    713         return EOK;
    714 }
    715 
    716681void vfs_close(ipc_callid_t rid, ipc_call_t *request)
    717682{
     
    725690        }
    726691       
    727         int ret = vfs_close_internal(file);
    728         if (ret != EOK)
    729                 ipc_answer_0(rid, ret);
    730        
    731         ret = vfs_fd_free(fd);
    732         ipc_answer_0(rid, ret);
     692        /*
     693         * Lock the open file structure so that no other thread can manipulate
     694         * the same open file at a time.
     695         */
     696        fibril_mutex_lock(&file->lock);
     697        int fs_phone = vfs_grab_phone(file->node->fs_handle);
     698       
     699        /* Make a VFS_OUT_CLOSE request at the destination FS server. */
     700        aid_t msg;
     701        ipc_call_t answer;
     702        msg = async_send_2(fs_phone, VFS_OUT_CLOSE, file->node->dev_handle,
     703            file->node->index, &answer);
     704
     705        /* Wait for reply from the FS server. */
     706        ipcarg_t rc;
     707        async_wait_for(msg, &rc);
     708
     709        vfs_release_phone(fs_phone);
     710        fibril_mutex_unlock(&file->lock);
     711       
     712        int retval = IPC_GET_ARG1(answer);
     713        if (retval != EOK)
     714                ipc_answer_0(rid, retval);
     715       
     716        retval = vfs_fd_free(fd);
     717        ipc_answer_0(rid, retval);
    733718}
    734719
     
    762747        int res;
    763748        if (read)
    764                 res = async_data_read_receive(&callid, NULL);
     749                res = ipc_data_read_receive(&callid, NULL);
    765750        else
    766                 res = async_data_write_receive(&callid, NULL);
     751                res = ipc_data_write_receive(&callid, NULL);
    767752        if (!res) {
    768753                ipc_answer_0(callid, EINVAL);
     
    949934{
    950935        int fd = IPC_GET_ARG1(*request);
     936        size_t size = IPC_GET_ARG2(*request);
    951937        ipcarg_t rc;
    952938
     
    958944
    959945        ipc_callid_t callid;
    960         if (!async_data_read_receive(&callid, NULL)) {
     946        if (!ipc_data_read_receive(&callid, NULL)) {
    961947                ipc_answer_0(callid, EINVAL);
    962948                ipc_answer_0(rid, EINVAL);
     
    984970        ipc_callid_t callid;
    985971
    986         if (!async_data_write_receive(&callid, &len)) {
     972        if (!ipc_data_write_receive(&callid, &len)) {
    987973                ipc_answer_0(callid, EINVAL);
    988974                ipc_answer_0(rid, EINVAL);
     
    996982        }
    997983        int rc;
    998         if ((rc = async_data_write_finalize(callid, path, len))) {
     984        if ((rc = ipc_data_write_finalize(callid, path, len))) {
    999985                ipc_answer_0(rid, rc);
    1000986                free(path);
     
    1003989        path[len] = '\0';
    1004990
    1005         if (!async_data_read_receive(&callid, NULL)) {
     991        if (!ipc_data_read_receive(&callid, NULL)) {
    1006992                free(path);
    1007993                ipc_answer_0(callid, EINVAL);
     
    10521038        ipc_callid_t callid;
    10531039
    1054         if (!async_data_write_receive(&callid, &len)) {
     1040        if (!ipc_data_write_receive(&callid, &len)) {
    10551041                ipc_answer_0(callid, EINVAL);
    10561042                ipc_answer_0(rid, EINVAL);
     
    10641050        }
    10651051        int rc;
    1066         if ((rc = async_data_write_finalize(callid, path, len))) {
     1052        if ((rc = ipc_data_write_finalize(callid, path, len))) {
    10671053                ipc_answer_0(rid, rc);
    10681054                free(path);
     
    10891075        ipc_callid_t callid;
    10901076
    1091         if (!async_data_write_receive(&callid, &len)) {
     1077        if (!ipc_data_write_receive(&callid, &len)) {
    10921078                ipc_answer_0(callid, EINVAL);
    10931079                ipc_answer_0(rid, EINVAL);
     
    11011087        }
    11021088        int rc;
    1103         if ((rc = async_data_write_finalize(callid, path, len))) {
     1089        if ((rc = ipc_data_write_finalize(callid, path, len))) {
    11041090                ipc_answer_0(rid, rc);
    11051091                free(path);
     
    11401126
    11411127        /* Retrieve the old path. */
    1142         if (!async_data_write_receive(&callid, &olen)) {
     1128        if (!ipc_data_write_receive(&callid, &olen)) {
    11431129                ipc_answer_0(callid, EINVAL);
    11441130                ipc_answer_0(rid, EINVAL);
     
    11511137                return;
    11521138        }
    1153         if ((rc = async_data_write_finalize(callid, old, olen))) {
     1139        if ((rc = ipc_data_write_finalize(callid, old, olen))) {
    11541140                ipc_answer_0(rid, rc);
    11551141                free(old);
     
    11591145       
    11601146        /* Retrieve the new path. */
    1161         if (!async_data_write_receive(&callid, &nlen)) {
     1147        if (!ipc_data_write_receive(&callid, &nlen)) {
    11621148                ipc_answer_0(callid, EINVAL);
    11631149                ipc_answer_0(rid, EINVAL);
     
    11721158                return;
    11731159        }
    1174         if ((rc = async_data_write_finalize(callid, new, nlen))) {
     1160        if ((rc = ipc_data_write_finalize(callid, new, nlen))) {
    11751161                ipc_answer_0(rid, rc);
    11761162                free(old);
     
    13251311}
    13261312
    1327 void vfs_dup(ipc_callid_t rid, ipc_call_t *request)
    1328 {
    1329         int oldfd = IPC_GET_ARG1(*request);
    1330         int newfd = IPC_GET_ARG2(*request);
    1331        
    1332         /* Lookup the file structure corresponding to oldfd. */
    1333         vfs_file_t *oldfile = vfs_file_get(oldfd);
    1334         if (!oldfile) {
    1335                 ipc_answer_0(rid, EBADF);
    1336                 return;
    1337         }
    1338        
    1339         /* If the file descriptors are the same, do nothing. */
    1340         if (oldfd == newfd) {
    1341                 ipc_answer_1(rid, EOK, newfd);
    1342                 return;
    1343         }
    1344        
    1345         /*
    1346          * Lock the open file structure so that no other thread can manipulate
    1347          * the same open file at a time.
    1348          */
    1349         fibril_mutex_lock(&oldfile->lock);
    1350        
    1351         /* Lookup an open file structure possibly corresponding to newfd. */
    1352         vfs_file_t *newfile = vfs_file_get(newfd);
    1353         if (newfile) {
    1354                 /* Close the originally opened file. */
    1355                 int ret = vfs_close_internal(newfile);
    1356                 if (ret != EOK) {
    1357                         ipc_answer_0(rid, ret);
    1358                         return;
    1359                 }
    1360                
    1361                 ret = vfs_fd_free(newfd);
    1362                 if (ret != EOK) {
    1363                         ipc_answer_0(rid, ret);
    1364                         return;
    1365                 }
    1366         }
    1367        
    1368         /* Assign the old file to newfd. */
    1369         int ret = vfs_fd_assign(oldfile, newfd);
    1370         fibril_mutex_unlock(&oldfile->lock);
    1371        
    1372         if (ret != EOK)
    1373                 ipc_answer_0(rid, ret);
    1374         else
    1375                 ipc_answer_1(rid, EOK, newfd);
    1376 }
    1377 
    13781313/**
    13791314 * @}
Note: See TracChangeset for help on using the changeset viewer.