Changeset 547c37a in mainline
- Timestamp:
- 2011-06-06T20:53:49Z (13 years ago)
- 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. - Files:
-
- 36 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/Makefile.common
r7b712b60 r547c37a 97 97 $(USPACE_PATH)/srv/fs/tmpfs/tmpfs \ 98 98 $(USPACE_PATH)/srv/fs/fat/fat \ 99 $(USPACE_PATH)/srv/fs/ext2fs/ext2fs \ 99 100 $(USPACE_PATH)/srv/taskmon/taskmon \ 100 101 $(USPACE_PATH)/srv/hw/netif/ne2000/ne2000 \ … … 114 115 rootvirt \ 115 116 test1 \ 116 test2 117 test2 \ 118 test3 117 119 118 120 RD_DRV_CFG = … … 134 136 135 137 RD_APPS_NON_ESSENTIAL = \ 138 $(USPACE_PATH)/app/blkdump/blkdump \ 139 $(USPACE_PATH)/app/bnchmark/bnchmark \ 136 140 $(USPACE_PATH)/app/dltest/dltest \ 137 141 $(USPACE_PATH)/app/dltest2/dltest2 \ 138 142 $(USPACE_PATH)/app/dload/dload \ 139 143 $(USPACE_PATH)/app/edit/edit \ 144 $(USPACE_PATH)/app/ext2info/ext2info \ 140 145 $(USPACE_PATH)/app/kill/kill \ 141 146 $(USPACE_PATH)/app/killall/killall \ … … 145 150 $(USPACE_PATH)/app/taskdump/taskdump \ 146 151 $(USPACE_PATH)/app/tester/tester \ 152 $(USPACE_PATH)/app/testread/testread \ 147 153 $(USPACE_PATH)/app/tetris/tetris \ 148 154 $(USPACE_PATH)/app/trace/trace \ -
kernel/generic/src/interrupt/interrupt.c
r7b712b60 r547c37a 177 177 (void *) istate_get_pc(istate)); 178 178 179 istate_decode(istate); 179 180 stack_trace_istate(istate); 180 181 -
uspace/Makefile
r7b712b60 r547c37a 35 35 DIRS = \ 36 36 app/bdsh \ 37 app/blkdump \ 38 app/bnchmark \ 37 39 app/edit \ 40 app/ext2info \ 38 41 app/getterm \ 39 42 app/init \ … … 47 50 app/taskdump \ 48 51 app/tester \ 52 app/testread \ 49 53 app/tetris \ 50 54 app/trace \ … … 72 76 srv/fs/tmpfs \ 73 77 srv/fs/devfs \ 78 srv/fs/ext2fs \ 74 79 srv/hid/adb_mouse \ 75 80 srv/hid/char_mouse \ … … 90 95 drv/rootvirt \ 91 96 drv/test1 \ 92 drv/test2 97 drv/test2 \ 98 drv/test3 93 99 94 100 ## Networking … … 148 154 lib/drv \ 149 155 lib/packet \ 150 lib/net 156 lib/net \ 157 lib/ext2 151 158 152 159 LIBC_BUILD = $(addsuffix .build,$(LIBC)) -
uspace/Makefile.common
r7b712b60 r547c37a 108 108 LIBCLUI_PREFIX = $(LIB_PREFIX)/clui 109 109 110 LIBEXT2_PREFIX = $(LIB_PREFIX)/ext2 111 110 112 LIBDRV_PREFIX = $(LIB_PREFIX)/drv 111 113 LIBPACKET_PREFIX = $(LIB_PREFIX)/packet -
uspace/app/bdsh/cmds/modules/mount/mount.c
r7b712b60 r547c37a 51 51 { 52 52 static char helpfmt[] = 53 "Usage: %s <fstype> <mp> <dev>[<moptions>]\n";53 "Usage: %s <fstype> <mp> [dev] [<moptions>]\n"; 54 54 if (level == HELP_SHORT) { 55 55 printf("'%s' mounts a file system.\n", cmdname); … … 66 66 unsigned int argc; 67 67 const char *mopts = ""; 68 const char *dev = ""; 68 69 int rc, c, opt_ind; 69 70 … … 79 80 } 80 81 81 if ((argc < 4) || (argc > 5)) {82 if ((argc < 3) || (argc > 5)) { 82 83 printf("%s: invalid number of arguments. Try `mount --help'\n", 83 84 cmdname); 84 85 return CMD_FAILURE; 85 86 } 87 if (argc > 3) 88 dev = argv[3]; 86 89 if (argc == 5) 87 90 mopts = argv[4]; 88 91 89 rc = mount(argv[1], argv[2], argv[3], mopts, 0);92 rc = mount(argv[1], argv[2], dev, mopts, 0); 90 93 if (rc != EOK) { 91 94 printf("Unable to mount %s filesystem to %s on %s (rc=%d)\n", -
uspace/app/redir/redir.c
r7b712b60 r547c37a 49 49 static void usage(void) 50 50 { 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", 52 52 NAME); 53 53 } … … 83 83 args = (const char **) calloc(argc + 1, sizeof(char *)); 84 84 if (!args) { 85 printf("No memory available\n");85 fprintf(stderr, "No memory available\n"); 86 86 return 0; 87 87 } … … 98 98 99 99 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], 101 101 str_error(rc)); 102 return 0; 102 103 } 103 104 -
uspace/app/tester/Makefile
r7b712b60 r547c37a 29 29 30 30 USPACE_PREFIX = ../.. 31 LIBS = $(LIBBLOCK_PREFIX)/libblock.a $(LIBEXT2_PREFIX)/libext2.a 32 EXTRA_CFLAGS = -I$(LIBBLOCK_PREFIX) -I$(LIBEXT2_PREFIX) 31 33 BINARY = tester 32 34 33 35 SOURCES = \ 34 36 tester.c \ 37 util.c \ 35 38 thread/thread1.c \ 36 39 print/print1.c \ … … 53 56 mm/malloc3.c \ 54 57 devs/devman1.c \ 58 devs/devman2.c \ 55 59 hw/misc/virtchar1.c \ 56 hw/serial/serial1.c 60 hw/serial/serial1.c \ 61 libext2/libext2_1.c 57 62 58 63 include $(USPACE_PREFIX)/Makefile.common -
uspace/app/tester/tester.c
r7b712b60 r547c37a 66 66 #include "hw/serial/serial1.def" 67 67 #include "hw/misc/virtchar1.def" 68 #include "libext2/libext2_1.def" 68 69 #include "devs/devman1.def" 70 #include "devs/devman2.def" 69 71 {NULL, NULL, NULL, false} 70 72 }; -
uspace/app/tester/tester.h
r7b712b60 r547c37a 99 99 extern const char *test_serial1(void); 100 100 extern const char *test_virtchar1(void); 101 extern const char *test_libext2_1(void); 101 102 extern const char *test_devman1(void); 103 extern const char *test_devman2(void); 102 104 103 105 extern test_t tests[]; -
uspace/drv/rootvirt/devices.def
r7b712b60 r547c37a 21 21 .match_id = "virtual&test1" 22 22 }, 23 { 24 .name = "test3", 25 .match_id = "virtual&test3" 26 }, 23 27 #endif -
uspace/lib/block/libblock.c
r7b712b60 r547c37a 2 2 * Copyright (c) 2008 Jakub Jermar 3 3 * Copyright (c) 2008 Martin Decky 4 * Copyright (c) 2011 Martin Sucha 4 5 * All rights reserved. 5 6 * … … 827 828 } 828 829 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 */ 839 int 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 829 882 /** Read blocks from block device. 830 883 * -
uspace/lib/block/libblock.h
r7b712b60 r547c37a 2 2 * Copyright (c) 2008 Jakub Jermar 3 3 * Copyright (c) 2008 Martin Decky 4 * Copyright (c) 2011 Martin Sucha 4 5 * All rights reserved. 5 6 * … … 113 114 extern int block_get_nblocks(devmap_handle_t, aoff64_t *); 114 115 extern int block_read_direct(devmap_handle_t, aoff64_t, size_t, void *); 116 extern int block_read_bytes_direct(devmap_handle_t, aoff64_t, size_t, void *); 115 117 extern int block_write_direct(devmap_handle_t, aoff64_t, size_t, const void *); 116 118 -
uspace/srv/vfs/vfs.h
r7b712b60 r547c37a 176 176 vfs_pair_t *, ...); 177 177 extern int vfs_open_node_internal(vfs_lookup_res_t *); 178 extern int vfs_close_internal(vfs_file_t *);179 178 180 179 extern bool vfs_nodes_init(void); -
uspace/srv/vfs/vfs_file.c
r7b712b60 r547c37a 79 79 for (i = 0; i < MAX_OPEN_FILES; i++) { 80 80 if (FILES[i]) { 81 (void) vfs_close_internal(FILES[i]);82 81 (void) vfs_fd_free(i); 83 82 } … … 108 107 } 109 108 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 110 129 /** Increment reference count of VFS file structure. 111 130 * … … 125 144 * decremented. 126 145 */ 127 static void vfs_file_delref(vfs_file_t *file) 128 { 146 static int vfs_file_delref(vfs_file_t *file) 147 { 148 int rc = EOK; 149 129 150 assert(fibril_mutex_is_locked(&VFS_DATA->lock)); 130 151 131 152 if (file->refcnt-- == 1) { 132 153 /* 133 * Lost the last reference to a file, need to drop our reference134 * 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. 135 156 */ 157 rc = vfs_file_close_remote(file); 136 158 vfs_node_delref(file->node); 137 159 free(file); 138 160 } 161 162 return rc; 139 163 } 140 164 … … 201 225 int vfs_fd_free(int fd) 202 226 { 227 int rc; 228 203 229 if (!vfs_files_init()) 204 230 return ENOMEM; … … 210 236 } 211 237 212 vfs_file_delref(FILES[fd]);238 rc = vfs_file_delref(FILES[fd]); 213 239 FILES[fd] = NULL; 214 240 fibril_mutex_unlock(&VFS_DATA->lock); 215 241 216 return EOK;242 return rc; 217 243 } 218 244 -
uspace/srv/vfs/vfs_ops.c
r7b712b60 r547c37a 717 717 } 718 718 719 int vfs_close_internal(vfs_file_t *file)720 {721 /*722 * Lock the open file structure so that no other thread can manipulate723 * 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 server729 if there are no more file descriptors (except the730 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 754 719 void vfs_close(ipc_callid_t rid, ipc_call_t *request) 755 720 { 756 721 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 770 724 ret = vfs_fd_free(fd); 771 725 async_answer_0(rid, ret); … … 1369 1323 fibril_mutex_lock(&oldfile->lock); 1370 1324 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); 1394 1327 1395 1328 /* Assign the old file to newfd. */
Note:
See TracChangeset
for help on using the changeset viewer.