Changeset a4eb8a60 in mainline
- Timestamp:
- 2007-12-22T22:58:57Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5c786d1
- Parents:
- c9957b6
- Location:
- uspace/srv
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/tmpfs/tmpfs.c
rc9957b6 ra4eb8a60 113 113 tmpfs_lookup(callid, &call); 114 114 break; 115 case VFS_READ: 116 tmpfs_read(callid, &call); 117 break; 115 118 default: 116 119 ipc_answer_0(callid, ENOTSUP); -
uspace/srv/fs/tmpfs/tmpfs.h
rc9957b6 ra4eb8a60 39 39 #include <sys/types.h> 40 40 #include <bool.h> 41 #include <libadt/hash_table.h> 41 42 42 43 #define dprintf(...) printf(__VA_ARGS__) 43 44 44 45 typedef struct tmpfs_dentry { 45 unsigned index; /**< TMPFS node index. */ 46 unsigned long index; /**< TMPFS node index. */ 47 link_t dh_link; /**< Dentries hash table link. */ 46 48 struct tmpfs_dentry *parent; 47 49 struct tmpfs_dentry *sibling; … … 60 62 61 63 extern void tmpfs_lookup(ipc_callid_t, ipc_call_t *); 64 extern void tmpfs_read(ipc_callid_t, ipc_call_t *); 62 65 63 66 #endif -
uspace/srv/fs/tmpfs/tmpfs_ops.c
rc9957b6 ra4eb8a60 46 46 #include <string.h> 47 47 #include <stdio.h> 48 #include <sys/types.h> 49 #include <libadt/hash_table.h> 50 #include <as.h> 51 52 #define min(a, b) ((a) < (b) ? (a) : (b)) 53 #define max(a, b) ((a) > (b) ? (a) : (b)) 48 54 49 55 #define PLB_GET_CHAR(i) (tmpfs_reg.plb_ro[(i) % PLB_SIZE]) 56 57 #define DENTRIES_BUCKETS 256 58 59 /* 60 * Hash table of all directory entries. 61 */ 62 hash_table_t dentries; 63 64 static hash_index_t dentries_hash(unsigned long *key) 65 { 66 return *key % DENTRIES_BUCKETS; 67 } 68 69 static int dentries_compare(unsigned long *key, hash_count_t keys, 70 link_t *item) 71 { 72 tmpfs_dentry_t *dentry = hash_table_get_instance(item, tmpfs_dentry_t, 73 dh_link); 74 return dentry->index == *key; 75 } 76 77 static void dentries_remove_callback(link_t *item) 78 { 79 } 80 81 /** TMPFS dentries hash table operations. */ 82 hash_table_operations_t dentries_ops = { 83 .hash = dentries_hash, 84 .compare = dentries_compare, 85 .remove_callback = dentries_remove_callback 86 }; 50 87 51 88 unsigned tmpfs_next_index = 1; … … 61 98 dentry->size = 0; 62 99 dentry->data = NULL; 100 link_initialize(&dentry->dh_link); 63 101 } 64 102 … … 71 109 static bool tmpfs_init(void) 72 110 { 111 if (!hash_table_create(&dentries, DENTRIES_BUCKETS, 1, &dentries_ops)) 112 return false; 113 73 114 root = (tmpfs_dentry_t *) malloc(sizeof(tmpfs_dentry_t)); 74 if (!root) { 75 return false; 76 } 115 if (!root) 116 return false; 77 117 tmpfs_dentry_initialize(root); 78 118 root->index = tmpfs_next_index++; 79 119 root->name = ""; 80 120 root->type = TMPFS_DIRECTORY; 121 hash_table_insert(&dentries, &root->index, &root->dh_link); 81 122 82 123 /* … … 97 138 d->type = TMPFS_DIRECTORY; 98 139 d->name = "dir1"; 140 hash_table_insert(&dentries, &d->index, &d->dh_link); 99 141 100 142 d = (tmpfs_dentry_t *) malloc(sizeof(tmpfs_dentry_t)); … … 111 153 d->type = TMPFS_DIRECTORY; 112 154 d->name = "dir2"; 155 hash_table_insert(&dentries, &d->index, &d->dh_link); 113 156 114 157 d = (tmpfs_dentry_t *) malloc(sizeof(tmpfs_dentry_t)); … … 128 171 d->data = "This is the contents of /dir1/file1.\n"; 129 172 d->size = strlen(d->data); 173 hash_table_insert(&dentries, &d->index, &d->dh_link); 130 174 131 175 d = (tmpfs_dentry_t *) malloc(sizeof(tmpfs_dentry_t)); … … 146 190 d->data = "This is the contents of /dir2/file2.\n"; 147 191 d->size = strlen(d->data); 192 hash_table_insert(&dentries, &d->index, &d->dh_link); 148 193 149 194 return true; … … 233 278 } 234 279 280 void tmpfs_read(ipc_callid_t rid, ipc_call_t *request) 281 { 282 int dev_handle = IPC_GET_ARG1(*request); 283 unsigned long index = IPC_GET_ARG2(*request); 284 off_t pos = IPC_GET_ARG3(*request); 285 size_t size = IPC_GET_ARG4(*request); 286 287 /* 288 * Lookup the respective dentry. 289 */ 290 link_t *hlp; 291 hlp = hash_table_find(&dentries, &index); 292 if (!hlp) { 293 ipc_answer_0(rid, ENOENT); 294 return; 295 } 296 tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t, 297 dh_link); 298 299 /* 300 * Receive the communication area. 301 */ 302 ipc_callid_t callid; 303 ipc_call_t call; 304 callid = async_get_call(&call); 305 if (IPC_GET_METHOD(call) != IPC_M_AS_AREA_SEND) { 306 ipc_answer_0(callid, EINVAL); 307 ipc_answer_0(rid, EINVAL); 308 return; 309 } 310 311 int flags = IPC_GET_ARG3(call); 312 if (!(flags & AS_AREA_WRITE)) { 313 ipc_answer_0(callid, EINVAL); 314 ipc_answer_0(rid, EINVAL); 315 return; 316 } 317 size_t sz = IPC_GET_ARG2(call); 318 uint8_t *buf = as_get_mappable_page(sz); 319 if (!buf) { 320 ipc_answer_0(callid, ENOMEM); 321 ipc_answer_0(rid, ENOMEM); 322 return; 323 } 324 ipc_answer_1(callid, EOK, buf); /* commit to share the area */ 325 326 size_t bytes = max(0, min(dentry->size - pos, size)); 327 memcpy(buf, dentry->data + pos, bytes); 328 329 (void) as_area_destroy(buf); 330 331 ipc_answer_1(rid, EOK, bytes); 332 } 333 235 334 /** 236 335 * @} -
uspace/srv/vfs/vfs_read.c
rc9957b6 ra4eb8a60 50 50 * interleave and a file cannot be closed while it is being read). 51 51 * 52 * Additional synchronization needs to be added once t able table of52 * Additional synchronization needs to be added once the table of 53 53 * open files supports parallel access! 54 54 */ … … 61 61 62 62 int fd = IPC_GET_ARG1(*request); 63 size_t size = IPC_GET_ARG2(*request); 63 64 64 65 /* … … 89 90 */ 90 91 aid_t msg; 91 msg = async_send_3(fs_phone, VFS_READ, file->node->dev_handle, 92 file->node->index, file->pos, NULL); 92 ipc_call_t answer; 93 msg = async_send_4(fs_phone, VFS_READ, file->node->dev_handle, 94 file->node->index, file->pos, size, &answer); 93 95 94 96 /* … … 106 108 ipcarg_t rc; 107 109 async_wait_for(msg, &rc); 110 size_t bytes = IPC_GET_ARG1(answer); 108 111 109 112 /* … … 111 114 * return to the client. 112 115 */ 113 ipc_answer_ 0(rid, rc);116 ipc_answer_1(rid, rc, bytes); 114 117 } 115 118
Note:
See TracChangeset
for help on using the changeset viewer.