Changes in / [e8d5f9f:4ce90544] in mainline


Ignore:
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • boot/Makefile.common

    re8d5f9f r4ce90544  
    114114        rootvirt \
    115115        test1 \
    116         test2 \
    117         test3
     116        test2
    118117
    119118RD_DRV_CFG =
  • uspace/Makefile

    re8d5f9f r4ce90544  
    9090        drv/rootvirt \
    9191        drv/test1 \
    92         drv/test2 \
    93         drv/test3
     92        drv/test2
    9493
    9594## Networking
  • uspace/app/tester/Makefile

    re8d5f9f r4ce90544  
    5353        mm/malloc3.c \
    5454        devs/devman1.c \
    55         devs/devman2.c \
    5655        hw/misc/virtchar1.c \
    5756        hw/serial/serial1.c
  • uspace/app/tester/tester.c

    re8d5f9f r4ce90544  
    6767#include "hw/misc/virtchar1.def"
    6868#include "devs/devman1.def"
    69 #include "devs/devman2.def"
    7069        {NULL, NULL, NULL, false}
    7170};
  • uspace/app/tester/tester.h

    re8d5f9f r4ce90544  
    100100extern const char *test_virtchar1(void);
    101101extern const char *test_devman1(void);
    102 extern const char *test_devman2(void);
    103102
    104103extern test_t tests[];
  • uspace/drv/rootvirt/devices.def

    re8d5f9f r4ce90544  
    2121        .match_id = "virtual&test1"
    2222},
    23 {
    24         .name = "test3",
    25         .match_id = "virtual&test3"
    26 },
    2723#endif
  • uspace/srv/vfs/vfs.h

    re8d5f9f r4ce90544  
    176176    vfs_pair_t *, ...);
    177177extern int vfs_open_node_internal(vfs_lookup_res_t *);
     178extern int vfs_close_internal(vfs_file_t *);
    178179
    179180extern bool vfs_nodes_init(void);
  • uspace/srv/vfs/vfs_file.c

    re8d5f9f r4ce90544  
    7979        for (i = 0; i < MAX_OPEN_FILES; i++) {
    8080                if (FILES[i]) {
     81                        (void) vfs_close_internal(FILES[i]);
    8182                        (void) vfs_fd_free(i);
    8283                }
     
    107108}
    108109
    109 /** Close the file in the endpoint FS server. */
    110 static int vfs_file_close_remote(vfs_file_t *file)
    111 {
    112         ipc_call_t answer;
    113         aid_t msg;
    114         sysarg_t rc;
    115         int phone;
    116 
    117         assert(!file->refcnt);
    118 
    119         phone = vfs_grab_phone(file->node->fs_handle);
    120         msg = async_send_2(phone, VFS_OUT_CLOSE, file->node->devmap_handle,
    121             file->node->index, &answer);
    122         async_wait_for(msg, &rc);
    123         vfs_release_phone(file->node->fs_handle, phone);
    124 
    125         return IPC_GET_ARG1(answer);
    126 }
    127 
    128 
    129110/** Increment reference count of VFS file structure.
    130111 *
     
    144125 *                      decremented.
    145126 */
    146 static int vfs_file_delref(vfs_file_t *file)
    147 {
    148         int rc = EOK;
    149 
     127static void vfs_file_delref(vfs_file_t *file)
     128{
    150129        assert(fibril_mutex_is_locked(&VFS_DATA->lock));
    151130
    152131        if (file->refcnt-- == 1) {
    153132                /*
    154                  * Lost the last reference to a file, need to close it in the
    155                  * endpoint FS and drop our reference to the underlying VFS node.
     133                 * Lost the last reference to a file, need to drop our reference
     134                 * to the underlying VFS node.
    156135                 */
    157                 rc = vfs_file_close_remote(file);
    158136                vfs_node_delref(file->node);
    159137                free(file);
    160138        }
    161 
    162         return rc;
    163139}
    164140
     
    225201int vfs_fd_free(int fd)
    226202{
    227         int rc;
    228 
    229203        if (!vfs_files_init())
    230204                return ENOMEM;
     
    236210        }
    237211       
    238         rc = vfs_file_delref(FILES[fd]);
     212        vfs_file_delref(FILES[fd]);
    239213        FILES[fd] = NULL;
    240214        fibril_mutex_unlock(&VFS_DATA->lock);
    241215       
    242         return rc;
     216        return EOK;
    243217}
    244218
  • uspace/srv/vfs/vfs_ops.c

    re8d5f9f r4ce90544  
    717717}
    718718
     719int vfs_close_internal(vfs_file_t *file)
     720{
     721        /*
     722         * Lock the open file structure so that no other thread can manipulate
     723         * the same open file at a time.
     724         */
     725        fibril_mutex_lock(&file->lock);
     726       
     727        if (file->refcnt <= 1) {
     728                /* Only close the file on the destination FS server
     729                   if there are no more file descriptors (except the
     730                   present one) pointing to this file. */
     731               
     732                int fs_phone = vfs_grab_phone(file->node->fs_handle);
     733               
     734                /* Make a VFS_OUT_CLOSE request at the destination FS server. */
     735                aid_t msg;
     736                ipc_call_t answer;
     737                msg = async_send_2(fs_phone, VFS_OUT_CLOSE,
     738                    file->node->devmap_handle, file->node->index, &answer);
     739               
     740                /* Wait for reply from the FS server. */
     741                sysarg_t rc;
     742                async_wait_for(msg, &rc);
     743               
     744                vfs_release_phone(file->node->fs_handle, fs_phone);
     745                fibril_mutex_unlock(&file->lock);
     746               
     747                return IPC_GET_ARG1(answer);
     748        }
     749       
     750        fibril_mutex_unlock(&file->lock);
     751        return EOK;
     752}
     753
    719754void vfs_close(ipc_callid_t rid, ipc_call_t *request)
    720755{
    721756        int fd = IPC_GET_ARG1(*request);
    722         int ret;
    723        
     757       
     758        /* Lookup the file structure corresponding to the file descriptor. */
     759        vfs_file_t *file = vfs_file_get(fd);
     760        if (!file) {
     761                async_answer_0(rid, ENOENT);
     762                return;
     763        }
     764       
     765        int ret = vfs_close_internal(file);
     766        if (ret != EOK)
     767                async_answer_0(rid, ret);
     768       
     769        vfs_file_put(file);
    724770        ret = vfs_fd_free(fd);
    725771        async_answer_0(rid, ret);
     
    13231369        fibril_mutex_lock(&oldfile->lock);
    13241370       
    1325         /* Make sure newfd is closed. */
    1326         (void) vfs_fd_free(newfd);
     1371        /* Lookup an open file structure possibly corresponding to newfd. */
     1372        vfs_file_t *newfile = vfs_file_get(newfd);
     1373        if (newfile) {
     1374                /* Close the originally opened file. */
     1375                int ret = vfs_close_internal(newfile);
     1376                if (ret != EOK) {
     1377                        fibril_mutex_unlock(&oldfile->lock);
     1378                        vfs_file_put(oldfile);
     1379                        vfs_file_put(newfile);
     1380                        async_answer_0(rid, ret);
     1381                        return;
     1382                }
     1383               
     1384                ret = vfs_fd_free(newfd);
     1385                if (ret != EOK) {
     1386                        fibril_mutex_unlock(&oldfile->lock);
     1387                        vfs_file_put(oldfile);
     1388                        vfs_file_put(newfile);
     1389                        async_answer_0(rid, ret);
     1390                        return;
     1391                }
     1392                vfs_file_put(newfile);
     1393        }
    13271394       
    13281395        /* Assign the old file to newfd. */
Note: See TracChangeset for help on using the changeset viewer.