Changeset 547c37a in mainline


Ignore:
Timestamp:
2011-06-06T20:53:49Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bbe4828
Parents:
7b712b60 (diff), ff4f073 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

Files:
36 added
15 edited

Legend:

Unmodified
Added
Removed
  • boot/Makefile.common

    r7b712b60 r547c37a  
    9797        $(USPACE_PATH)/srv/fs/tmpfs/tmpfs \
    9898        $(USPACE_PATH)/srv/fs/fat/fat \
     99        $(USPACE_PATH)/srv/fs/ext2fs/ext2fs \
    99100        $(USPACE_PATH)/srv/taskmon/taskmon \
    100101        $(USPACE_PATH)/srv/hw/netif/ne2000/ne2000 \
     
    114115        rootvirt \
    115116        test1 \
    116         test2
     117        test2 \
     118        test3
    117119
    118120RD_DRV_CFG =
     
    134136
    135137RD_APPS_NON_ESSENTIAL = \
     138        $(USPACE_PATH)/app/blkdump/blkdump \
     139        $(USPACE_PATH)/app/bnchmark/bnchmark \
    136140        $(USPACE_PATH)/app/dltest/dltest \
    137141        $(USPACE_PATH)/app/dltest2/dltest2 \
    138142        $(USPACE_PATH)/app/dload/dload \
    139143        $(USPACE_PATH)/app/edit/edit \
     144        $(USPACE_PATH)/app/ext2info/ext2info \
    140145        $(USPACE_PATH)/app/kill/kill \
    141146        $(USPACE_PATH)/app/killall/killall \
     
    145150        $(USPACE_PATH)/app/taskdump/taskdump \
    146151        $(USPACE_PATH)/app/tester/tester \
     152        $(USPACE_PATH)/app/testread/testread \
    147153        $(USPACE_PATH)/app/tetris/tetris \
    148154        $(USPACE_PATH)/app/trace/trace \
  • kernel/generic/src/interrupt/interrupt.c

    r7b712b60 r547c37a  
    177177            (void *) istate_get_pc(istate));
    178178       
     179        istate_decode(istate);
    179180        stack_trace_istate(istate);
    180181       
  • uspace/Makefile

    r7b712b60 r547c37a  
    3535DIRS = \
    3636        app/bdsh \
     37        app/blkdump \
     38        app/bnchmark \
    3739        app/edit \
     40        app/ext2info \
    3841        app/getterm \
    3942        app/init \
     
    4750        app/taskdump \
    4851        app/tester \
     52        app/testread \
    4953        app/tetris \
    5054        app/trace \
     
    7276        srv/fs/tmpfs \
    7377        srv/fs/devfs \
     78        srv/fs/ext2fs \
    7479        srv/hid/adb_mouse \
    7580        srv/hid/char_mouse \
     
    9095        drv/rootvirt \
    9196        drv/test1 \
    92         drv/test2
     97        drv/test2 \
     98        drv/test3
    9399
    94100## Networking
     
    148154        lib/drv \
    149155        lib/packet \
    150         lib/net
     156        lib/net \
     157        lib/ext2
    151158
    152159LIBC_BUILD = $(addsuffix .build,$(LIBC))
  • uspace/Makefile.common

    r7b712b60 r547c37a  
    108108LIBCLUI_PREFIX = $(LIB_PREFIX)/clui
    109109
     110LIBEXT2_PREFIX = $(LIB_PREFIX)/ext2
     111
    110112LIBDRV_PREFIX = $(LIB_PREFIX)/drv
    111113LIBPACKET_PREFIX = $(LIB_PREFIX)/packet
  • uspace/app/bdsh/cmds/modules/mount/mount.c

    r7b712b60 r547c37a  
    5151{
    5252        static char helpfmt[] =
    53             "Usage:  %s <fstype> <mp> <dev> [<moptions>]\n";
     53            "Usage:  %s <fstype> <mp> [dev] [<moptions>]\n";
    5454        if (level == HELP_SHORT) {
    5555                printf("'%s' mounts a file system.\n", cmdname);
     
    6666        unsigned int argc;
    6767        const char *mopts = "";
     68        const char *dev = "";
    6869        int rc, c, opt_ind;
    6970
     
    7980        }
    8081
    81         if ((argc < 4) || (argc > 5)) {
     82        if ((argc < 3) || (argc > 5)) {
    8283                printf("%s: invalid number of arguments. Try `mount --help'\n",
    8384                    cmdname);
    8485                return CMD_FAILURE;
    8586        }
     87        if (argc > 3)
     88                dev = argv[3];
    8689        if (argc == 5)
    8790                mopts = argv[4];
    8891
    89         rc = mount(argv[1], argv[2], argv[3], mopts, 0);
     92        rc = mount(argv[1], argv[2], dev, mopts, 0);
    9093        if (rc != EOK) {
    9194                printf("Unable to mount %s filesystem to %s on %s (rc=%d)\n",
  • uspace/app/redir/redir.c

    r7b712b60 r547c37a  
    4949static void usage(void)
    5050{
    51         printf("Usage: %s [-i <stdin>] [-o <stdout>] [-e <stderr>] -- <cmd> [args ...]\n",
     51        fprintf(stderr, "Usage: %s [-i <stdin>] [-o <stdout>] [-e <stderr>] -- <cmd> [args ...]\n",
    5252            NAME);
    5353}
     
    8383        args = (const char **) calloc(argc + 1, sizeof(char *));
    8484        if (!args) {
    85                 printf("No memory available\n");
     85                fprintf(stderr, "No memory available\n");
    8686                return 0;
    8787        }
     
    9898       
    9999        if (rc != EOK) {
    100                 printf("%s: Error spawning %s (%s)\n", NAME, argv[0],
     100                fprintf(stderr, "%s: Error spawning %s (%s)\n", NAME, argv[0],
    101101                    str_error(rc));
     102                return 0;
    102103        }
    103104       
  • uspace/app/tester/Makefile

    r7b712b60 r547c37a  
    2929
    3030USPACE_PREFIX = ../..
     31LIBS = $(LIBBLOCK_PREFIX)/libblock.a $(LIBEXT2_PREFIX)/libext2.a
     32EXTRA_CFLAGS = -I$(LIBBLOCK_PREFIX) -I$(LIBEXT2_PREFIX)
    3133BINARY = tester
    3234
    3335SOURCES = \
    3436        tester.c \
     37        util.c \
    3538        thread/thread1.c \
    3639        print/print1.c \
     
    5356        mm/malloc3.c \
    5457        devs/devman1.c \
     58        devs/devman2.c \
    5559        hw/misc/virtchar1.c \
    56         hw/serial/serial1.c
     60        hw/serial/serial1.c \
     61        libext2/libext2_1.c
    5762
    5863include $(USPACE_PREFIX)/Makefile.common
  • uspace/app/tester/tester.c

    r7b712b60 r547c37a  
    6666#include "hw/serial/serial1.def"
    6767#include "hw/misc/virtchar1.def"
     68#include "libext2/libext2_1.def"
    6869#include "devs/devman1.def"
     70#include "devs/devman2.def"
    6971        {NULL, NULL, NULL, false}
    7072};
  • uspace/app/tester/tester.h

    r7b712b60 r547c37a  
    9999extern const char *test_serial1(void);
    100100extern const char *test_virtchar1(void);
     101extern const char *test_libext2_1(void);
    101102extern const char *test_devman1(void);
     103extern const char *test_devman2(void);
    102104
    103105extern test_t tests[];
  • uspace/drv/rootvirt/devices.def

    r7b712b60 r547c37a  
    2121        .match_id = "virtual&test1"
    2222},
     23{
     24        .name = "test3",
     25        .match_id = "virtual&test3"
     26},
    2327#endif
  • uspace/lib/block/libblock.c

    r7b712b60 r547c37a  
    22 * Copyright (c) 2008 Jakub Jermar
    33 * Copyright (c) 2008 Martin Decky
     4 * Copyright (c) 2011 Martin Sucha
    45 * All rights reserved.
    56 *
     
    827828}
    828829
     830/** Read bytes directly from the device (bypass cache)
     831 *
     832 * @param devmap_handle Device handle of the block device.
     833 * @param abs_offset    Absolute offset in bytes where to start reading
     834 * @param bytes                 Number of bytes to read
     835 * @param data                  Buffer that receives the data
     836 *
     837 * @return              EOK on success or negative error code on failure.
     838 */
     839int block_read_bytes_direct(devmap_handle_t devmap_handle, aoff64_t abs_offset,
     840    size_t bytes, void *data)
     841{
     842        int rc;
     843        size_t phys_block_size;
     844        size_t buf_size;
     845        void *buffer;
     846        aoff64_t first_block;
     847        aoff64_t last_block;
     848        size_t blocks;
     849        size_t offset;
     850       
     851        rc = block_get_bsize(devmap_handle, &phys_block_size);
     852        if (rc != EOK) {
     853                return rc;
     854        }
     855       
     856        /* calculate data position and required space */
     857        first_block = abs_offset / phys_block_size;
     858        offset = abs_offset % phys_block_size;
     859        last_block = (abs_offset + bytes - 1) / phys_block_size;
     860        blocks = last_block - first_block + 1;
     861        buf_size = blocks * phys_block_size;
     862       
     863        /* read the data into memory */
     864        buffer = malloc(buf_size);
     865        if (buffer == NULL) {
     866                return ENOMEM;
     867        }
     868       
     869        rc = block_read_direct(devmap_handle, first_block, blocks, buffer);
     870        if (rc != EOK) {
     871                free(buffer);
     872                return rc;
     873        }
     874       
     875        /* copy the data from the buffer */
     876        memcpy(data, buffer + offset, bytes);
     877        free(buffer);
     878       
     879        return EOK;
     880}
     881
    829882/** Read blocks from block device.
    830883 *
  • uspace/lib/block/libblock.h

    r7b712b60 r547c37a  
    22 * Copyright (c) 2008 Jakub Jermar
    33 * Copyright (c) 2008 Martin Decky
     4 * Copyright (c) 2011 Martin Sucha
    45 * All rights reserved.
    56 *
     
    113114extern int block_get_nblocks(devmap_handle_t, aoff64_t *);
    114115extern int block_read_direct(devmap_handle_t, aoff64_t, size_t, void *);
     116extern int block_read_bytes_direct(devmap_handle_t, aoff64_t, size_t, void *);
    115117extern int block_write_direct(devmap_handle_t, aoff64_t, size_t, const void *);
    116118
  • uspace/srv/vfs/vfs.h

    r7b712b60 r547c37a  
    176176    vfs_pair_t *, ...);
    177177extern int vfs_open_node_internal(vfs_lookup_res_t *);
    178 extern int vfs_close_internal(vfs_file_t *);
    179178
    180179extern bool vfs_nodes_init(void);
  • uspace/srv/vfs/vfs_file.c

    r7b712b60 r547c37a  
    7979        for (i = 0; i < MAX_OPEN_FILES; i++) {
    8080                if (FILES[i]) {
    81                         (void) vfs_close_internal(FILES[i]);
    8281                        (void) vfs_fd_free(i);
    8382                }
     
    108107}
    109108
     109/** Close the file in the endpoint FS server. */
     110static 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
    110129/** Increment reference count of VFS file structure.
    111130 *
     
    125144 *                      decremented.
    126145 */
    127 static void vfs_file_delref(vfs_file_t *file)
    128 {
     146static int vfs_file_delref(vfs_file_t *file)
     147{
     148        int rc = EOK;
     149
    129150        assert(fibril_mutex_is_locked(&VFS_DATA->lock));
    130151
    131152        if (file->refcnt-- == 1) {
    132153                /*
    133                  * Lost the last reference to a file, need to drop our reference
    134                  * to the underlying VFS node.
     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.
    135156                 */
     157                rc = vfs_file_close_remote(file);
    136158                vfs_node_delref(file->node);
    137159                free(file);
    138160        }
     161
     162        return rc;
    139163}
    140164
     
    201225int vfs_fd_free(int fd)
    202226{
     227        int rc;
     228
    203229        if (!vfs_files_init())
    204230                return ENOMEM;
     
    210236        }
    211237       
    212         vfs_file_delref(FILES[fd]);
     238        rc = vfs_file_delref(FILES[fd]);
    213239        FILES[fd] = NULL;
    214240        fibril_mutex_unlock(&VFS_DATA->lock);
    215241       
    216         return EOK;
     242        return rc;
    217243}
    218244
  • uspace/srv/vfs/vfs_ops.c

    r7b712b60 r547c37a  
    717717}
    718718
    719 int 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 
    754719void vfs_close(ipc_callid_t rid, ipc_call_t *request)
    755720{
    756721        int fd = IPC_GET_ARG1(*request);
    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);
     722        int ret;
     723       
    770724        ret = vfs_fd_free(fd);
    771725        async_answer_0(rid, ret);
     
    13691323        fibril_mutex_lock(&oldfile->lock);
    13701324       
    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         }
     1325        /* Make sure newfd is closed. */
     1326        (void) vfs_fd_free(newfd);
    13941327       
    13951328        /* Assign the old file to newfd. */
Note: See TracChangeset for help on using the changeset viewer.