Changeset bee37cf in mainline for uspace/srv/fs
- Timestamp:
- 2011-07-05T21:21:36Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5e2aa83, eb66f236
- Parents:
- 3714e79 (diff), f7a55f9 (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. - Location:
- uspace/srv/fs
- Files:
-
- 11 edited
-
devfs/devfs.c (modified) (4 diffs)
-
devfs/devfs_ops.c (modified) (12 diffs)
-
ext2fs/ext2fs.c (modified) (5 diffs)
-
ext2fs/ext2fs_ops.c (modified) (10 diffs)
-
fat/fat.c (modified) (6 diffs)
-
fat/fat_idx.c (modified) (11 diffs)
-
fat/fat_ops.c (modified) (7 diffs)
-
tmpfs/tmpfs.c (modified) (7 diffs)
-
tmpfs/tmpfs.h (modified) (1 diff)
-
tmpfs/tmpfs_dump.c (modified) (1 diff)
-
tmpfs/tmpfs_ops.c (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/devfs/devfs.c
r3714e79 rbee37cf 41 41 #include <stdio.h> 42 42 #include <ipc/services.h> 43 #include < ipc/ns.h>43 #include <ns.h> 44 44 #include <async.h> 45 45 #include <errno.h> … … 59 59 fs_reg_t devfs_reg; 60 60 61 static void devfs_connection(ipc_callid_t iid, ipc_call_t *icall )61 static void devfs_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 62 62 { 63 63 if (iid) … … 68 68 ipc_callid_t callid = async_get_call(&call); 69 69 70 switch (IPC_GET_IMETHOD(call)) { 71 case IPC_M_PHONE_HUNGUP: 70 if (!IPC_GET_IMETHOD(call)) 72 71 return; 72 73 switch (IPC_GET_IMETHOD(call)) { 73 74 case VFS_OUT_MOUNTED: 74 75 devfs_mounted(callid, &call); … … 119 120 int main(int argc, char *argv[]) 120 121 { 121 printf( NAME ": HelenOS Device Filesystem\n");122 printf("%s: HelenOS Device Filesystem\n", NAME); 122 123 123 124 if (!devfs_init()) { 124 printf( NAME ": failed to initialize devfs\n");125 printf("%s: failed to initialize devfs\n", NAME); 125 126 return -1; 126 127 } 127 128 128 int vfs_phone = service_connect_blocking(SERVICE_VFS, 0, 0); 129 if (vfs_phone < EOK) { 130 printf(NAME ": Unable to connect to VFS\n"); 129 async_sess_t *vfs_sess = service_connect_blocking(EXCHANGE_SERIALIZE, 130 SERVICE_VFS, 0, 0); 131 if (!vfs_sess) { 132 printf("%s: Unable to connect to VFS\n", NAME); 131 133 return -1; 132 134 } 133 135 134 int rc = fs_register(vfs_ phone, &devfs_reg, &devfs_vfs_info,136 int rc = fs_register(vfs_sess, &devfs_reg, &devfs_vfs_info, 135 137 devfs_connection); 136 138 if (rc != EOK) { 137 printf( NAME ": Failed to register file system (%d)\n", rc);139 printf("%s: Failed to register file system (%d)\n", NAME, rc); 138 140 return rc; 139 141 } 140 142 141 printf( NAME ": Accepting connections\n");143 printf("%s: Accepting connections\n", NAME); 142 144 task_retval(0); 143 145 async_manager(); -
uspace/srv/fs/devfs/devfs_ops.c
r3714e79 rbee37cf 59 59 typedef struct { 60 60 devmap_handle_t handle; 61 int phone; /**< When < 0, the structure is incomplete. */61 async_sess_t *sess; /**< If NULL, the structure is incomplete. */ 62 62 size_t refcount; 63 63 link_t link; 64 fibril_condvar_t cv; /**< Broadcast when completed. */64 fibril_condvar_t cv; /**< Broadcast when completed. */ 65 65 } device_t; 66 66 … … 232 232 }; 233 233 link_t *lnk; 234 234 235 235 fibril_mutex_lock(&devices_mutex); 236 236 restart: … … 244 244 245 245 dev->handle = node->handle; 246 dev->phone = -1; /* mark as incomplete */ 246 247 /* Mark as incomplete */ 248 dev->sess = NULL; 247 249 dev->refcount = 1; 248 250 fibril_condvar_initialize(&dev->cv); 249 251 250 252 /* 251 253 * Insert the incomplete device structure so that other … … 254 256 */ 255 257 hash_table_insert(&devices, key, &dev->link); 256 258 257 259 /* 258 260 * Drop the mutex to allow recursive devfs requests. 259 261 */ 260 262 fibril_mutex_unlock(&devices_mutex); 261 262 int phone = devmap_device_connect(node->handle, 0); 263 263 264 async_sess_t *sess = devmap_device_connect(EXCHANGE_SERIALIZE, 265 node->handle, 0); 266 264 267 fibril_mutex_lock(&devices_mutex); 265 268 266 269 /* 267 270 * Notify possible waiters about this device structure … … 269 272 */ 270 273 fibril_condvar_broadcast(&dev->cv); 271 272 if ( phone < 0) {274 275 if (!sess) { 273 276 /* 274 277 * Connecting failed, need to remove the … … 277 280 hash_table_remove(&devices, key, DEVICES_KEYS); 278 281 fibril_mutex_unlock(&devices_mutex); 279 282 280 283 return ENOENT; 281 284 } 282 285 283 /* Set the correct phone. */284 dev-> phone = phone;286 /* Set the correct session. */ 287 dev->sess = sess; 285 288 } else { 286 289 device_t *dev = hash_table_get_instance(lnk, device_t, link); 287 288 if ( dev->phone < 0) {290 291 if (!dev->sess) { 289 292 /* 290 293 * Wait until the device structure is completed … … 608 611 609 612 device_t *dev = hash_table_get_instance(lnk, device_t, link); 610 assert(dev-> phone >= 0);613 assert(dev->sess); 611 614 612 615 ipc_callid_t callid; … … 619 622 620 623 /* Make a request at the driver */ 624 async_exch_t *exch = async_exchange_begin(dev->sess); 625 621 626 ipc_call_t answer; 622 aid_t msg = async_send_3( dev->phone, IPC_GET_IMETHOD(*request),627 aid_t msg = async_send_3(exch, IPC_GET_IMETHOD(*request), 623 628 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), 624 629 IPC_GET_ARG3(*request), &answer); 625 630 626 631 /* Forward the IPC_M_DATA_READ request to the driver */ 627 async_forward_fast(callid, dev->phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 632 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 633 634 async_exchange_end(exch); 635 628 636 fibril_mutex_unlock(&devices_mutex); 629 637 … … 672 680 673 681 device_t *dev = hash_table_get_instance(lnk, device_t, link); 674 assert(dev-> phone >= 0);682 assert(dev->sess); 675 683 676 684 ipc_callid_t callid; … … 683 691 684 692 /* Make a request at the driver */ 693 async_exch_t *exch = async_exchange_begin(dev->sess); 694 685 695 ipc_call_t answer; 686 aid_t msg = async_send_3( dev->phone, IPC_GET_IMETHOD(*request),696 aid_t msg = async_send_3(exch, IPC_GET_IMETHOD(*request), 687 697 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), 688 698 IPC_GET_ARG3(*request), &answer); 689 699 690 700 /* Forward the IPC_M_DATA_WRITE request to the driver */ 691 async_forward_fast(callid, dev->phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 701 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 702 703 async_exchange_end(exch); 692 704 693 705 fibril_mutex_unlock(&devices_mutex); … … 742 754 743 755 device_t *dev = hash_table_get_instance(lnk, device_t, link); 744 assert(dev-> phone >= 0);756 assert(dev->sess); 745 757 dev->refcount--; 746 758 747 759 if (dev->refcount == 0) { 748 async_hangup(dev-> phone);760 async_hangup(dev->sess); 749 761 hash_table_remove(&devices, key, DEVICES_KEYS); 750 762 } … … 790 802 791 803 device_t *dev = hash_table_get_instance(lnk, device_t, link); 792 assert(dev-> phone >= 0);804 assert(dev->sess); 793 805 794 806 /* Make a request at the driver */ 807 async_exch_t *exch = async_exchange_begin(dev->sess); 808 795 809 ipc_call_t answer; 796 aid_t msg = async_send_2( dev->phone, IPC_GET_IMETHOD(*request),810 aid_t msg = async_send_2(exch, IPC_GET_IMETHOD(*request), 797 811 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), &answer); 812 813 async_exchange_end(exch); 798 814 799 815 fibril_mutex_unlock(&devices_mutex); -
uspace/srv/fs/ext2fs/ext2fs.c
r3714e79 rbee37cf 40 40 #include "ext2fs.h" 41 41 #include <ipc/services.h> 42 #include < ipc/ns.h>42 #include <ns.h> 43 43 #include <async.h> 44 44 #include <errno.h> … … 75 75 * request has been completed. 76 76 */ 77 static void ext2fs_connection(ipc_callid_t iid, ipc_call_t *icall )77 static void ext2fs_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 78 78 { 79 79 if (iid) { … … 87 87 88 88 dprintf(NAME ": connection opened\n"); 89 while (1) { 90 ipc_callid_t callid; 89 while (true) { 91 90 ipc_call_t call; 92 93 callid = async_get_call(&call); 94 switch (IPC_GET_IMETHOD(call)) { 95 case IPC_M_PHONE_HUNGUP: 91 ipc_callid_t callid = async_get_call(&call); 92 93 if (!IPC_GET_IMETHOD(call)) 96 94 return; 95 96 switch (IPC_GET_IMETHOD(call)) { 97 97 case VFS_OUT_MOUNTED: 98 98 ext2fs_mounted(callid, &call); … … 143 143 int main(int argc, char **argv) 144 144 { 145 int vfs_phone;146 int rc;147 148 145 printf(NAME ": HelenOS EXT2 file system server\n"); 149 150 vfs_phone = service_connect_blocking(SERVICE_VFS, 0, 0); 151 if (vfs_phone < EOK) { 146 147 async_sess_t *vfs_sess = service_connect_blocking(EXCHANGE_SERIALIZE, 148 SERVICE_VFS, 0, 0); 149 if (!vfs_sess) { 152 150 printf(NAME ": failed to connect to VFS\n"); 153 151 return -1; 154 152 } 155 153 156 rc = ext2fs_global_init();154 int rc = ext2fs_global_init(); 157 155 if (rc != EOK) { 158 156 printf(NAME ": Failed global initialization\n"); … … 160 158 } 161 159 162 rc = fs_register(vfs_ phone, &ext2fs_reg, &ext2fs_vfs_info, ext2fs_connection);160 rc = fs_register(vfs_sess, &ext2fs_reg, &ext2fs_vfs_info, ext2fs_connection); 163 161 if (rc != EOK) { 164 162 fprintf(stdout, NAME ": Failed to register fs (%d)\n", rc); -
uspace/srv/fs/ext2fs/ext2fs_ops.c
r3714e79 rbee37cf 187 187 { 188 188 EXT2FS_DBG("(%" PRIun ", -)", devmap_handle); 189 link_t *link;190 189 ext2fs_instance_t *tmp; 191 190 … … 198 197 } 199 198 200 for (link = instance_list.next; link != &instance_list; link = link->next) {199 list_foreach(instance_list, link) { 201 200 tmp = list_get_instance(link, ext2fs_instance_t, link); 202 201 … … 241 240 } 242 241 243 rc = ext2_directory_iterator_init(&it, fs, eparent->inode_ref );242 rc = ext2_directory_iterator_init(&it, fs, eparent->inode_ref, 0); 244 243 if (rc != EOK) { 245 244 return rc; … … 479 478 } 480 479 481 rc = ext2_directory_iterator_init(&it, fs, enode->inode_ref );480 rc = ext2_directory_iterator_init(&it, fs, enode->inode_ref, 0); 482 481 if (rc != EOK) { 483 482 EXT2FS_DBG("error %u", rc); … … 819 818 { 820 819 ext2_directory_iterator_t it; 821 aoff64_t cur;820 aoff64_t next; 822 821 uint8_t *buf; 823 822 size_t name_size; … … 825 824 bool found = false; 826 825 827 rc = ext2_directory_iterator_init(&it, inst->filesystem, inode_ref );826 rc = ext2_directory_iterator_init(&it, inst->filesystem, inode_ref, pos); 828 827 if (rc != EOK) { 829 828 async_answer_0(callid, rc); … … 832 831 } 833 832 834 /* Find the index we want to read 835 * Note that we need to iterate and count as 836 * the underlying structure is a linked list 837 * Moreover, we want to skip . and .. entries 833 /* Find next interesting directory entry. 834 * We want to skip . and .. entries 838 835 * as these are not used in HelenOS 839 836 */ 840 cur = 0;841 837 while (it.current != NULL) { 842 838 if (it.current->inode == 0) { … … 852 848 } 853 849 854 /* Is this the dir entry we want to read? */ 855 if (cur == pos) { 856 /* The on-disk entry does not contain \0 at the end 857 * end of entry name, so we copy it to new buffer 858 * and add the \0 at the end 859 */ 860 buf = malloc(name_size+1); 861 if (buf == NULL) { 862 ext2_directory_iterator_fini(&it); 863 async_answer_0(callid, ENOMEM); 864 async_answer_0(rid, ENOMEM); 865 return; 866 } 867 memcpy(buf, &it.current->name, name_size); 868 *(buf+name_size) = 0; 869 found = true; 870 (void) async_data_read_finalize(callid, buf, name_size+1); 871 free(buf); 872 break; 873 } 874 cur++; 850 /* The on-disk entry does not contain \0 at the end 851 * end of entry name, so we copy it to new buffer 852 * and add the \0 at the end 853 */ 854 buf = malloc(name_size+1); 855 if (buf == NULL) { 856 ext2_directory_iterator_fini(&it); 857 async_answer_0(callid, ENOMEM); 858 async_answer_0(rid, ENOMEM); 859 return; 860 } 861 memcpy(buf, &it.current->name, name_size); 862 *(buf+name_size) = 0; 863 found = true; 864 (void) async_data_read_finalize(callid, buf, name_size+1); 865 free(buf); 866 break; 875 867 876 868 skip: … … 884 876 } 885 877 878 if (found) { 879 rc = ext2_directory_iterator_next(&it); 880 if (rc != EOK) { 881 async_answer_0(rid, rc); 882 return; 883 } 884 next = it.current_offset; 885 } 886 886 887 rc = ext2_directory_iterator_fini(&it); 887 888 if (rc != EOK) { … … 891 892 892 893 if (found) { 893 async_answer_1(rid, EOK, 1);894 async_answer_1(rid, EOK, next-pos); 894 895 } 895 896 else { -
uspace/srv/fs/fat/fat.c
r3714e79 rbee37cf 39 39 #include "fat.h" 40 40 #include <ipc/services.h> 41 #include < ipc/ns.h>41 #include <ns.h> 42 42 #include <async.h> 43 43 #include <errno.h> … … 76 76 * request has been completed. 77 77 */ 78 static void fat_connection(ipc_callid_t iid, ipc_call_t *icall )78 static void fat_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 79 79 { 80 80 if (iid) { … … 88 88 89 89 dprintf(NAME ": connection opened\n"); 90 while (1) {91 ipc_callid_t callid;90 91 while (true) { 92 92 ipc_call_t call; 93 94 callid = async_get_call(&call); 95 switch (IPC_GET_IMETHOD(call)) { 96 case IPC_M_PHONE_HUNGUP: 93 ipc_callid_t callid = async_get_call(&call); 94 95 if (!IPC_GET_IMETHOD(call)) 97 96 return; 97 98 switch (IPC_GET_IMETHOD(call)) { 98 99 case VFS_OUT_MOUNTED: 99 100 fat_mounted(callid, &call); … … 144 145 int main(int argc, char **argv) 145 146 { 146 int vfs_phone;147 int rc;148 149 147 printf(NAME ": HelenOS FAT file system server\n"); 150 151 rc = fat_idx_init();148 149 int rc = fat_idx_init(); 152 150 if (rc != EOK) 153 151 goto err; 154 155 vfs_phone = service_connect_blocking(SERVICE_VFS, 0, 0); 156 if (vfs_phone < EOK) { 152 153 async_sess_t *vfs_sess = service_connect_blocking(EXCHANGE_SERIALIZE, 154 SERVICE_VFS, 0, 0); 155 if (!vfs_sess) { 157 156 printf(NAME ": failed to connect to VFS\n"); 158 157 return -1; 159 158 } 160 159 161 rc = fs_register(vfs_ phone, &fat_reg, &fat_vfs_info, fat_connection);160 rc = fs_register(vfs_sess, &fat_reg, &fat_vfs_info, fat_connection); 162 161 if (rc != EOK) { 163 162 fat_idx_fini(); … … 168 167 task_retval(0); 169 168 async_manager(); 170 /* not reached */ 169 170 /* Not reached */ 171 171 return 0; 172 172 173 173 err: 174 174 printf(NAME ": Failed to register file system (%d)\n", rc); … … 178 178 /** 179 179 * @} 180 */ 180 */ -
uspace/srv/fs/fat/fat_idx.c
r3714e79 rbee37cf 59 59 typedef struct { 60 60 link_t link; 61 devmap_handle_t devmap_handle;61 devmap_handle_t devmap_handle; 62 62 63 63 /** Next unassigned index. */ 64 fs_index_t next;64 fs_index_t next; 65 65 /** Number of remaining unassigned indices. */ 66 uint64_t remaining;66 uint64_t remaining; 67 67 68 68 /** Sorted list of intervals of freed indices. */ 69 li nk_t freed_head;69 list_t freed_list; 70 70 } unused_t; 71 71 … … 74 74 75 75 /** List of unused structures. */ 76 static LIST_INITIALIZE(unused_ head);76 static LIST_INITIALIZE(unused_list); 77 77 78 78 static void unused_initialize(unused_t *u, devmap_handle_t devmap_handle) … … 82 82 u->next = 0; 83 83 u->remaining = ((uint64_t)((fs_index_t)-1)) + 1; 84 list_initialize(&u->freed_ head);84 list_initialize(&u->freed_list); 85 85 } 86 86 … … 88 88 { 89 89 unused_t *u; 90 link_t *l;91 90 92 91 if (lock) 93 92 fibril_mutex_lock(&unused_lock); 94 for (l = unused_head.next; l != &unused_head; l = l->next) { 93 94 list_foreach(unused_list, l) { 95 95 u = list_get_instance(l, unused_t, link); 96 96 if (u->devmap_handle == devmap_handle) 97 97 return u; 98 98 } 99 99 100 if (lock) 100 101 fibril_mutex_unlock(&unused_lock); … … 249 250 return false; 250 251 251 if (list_empty(&u->freed_ head)) {252 if (list_empty(&u->freed_list)) { 252 253 if (u->remaining) { 253 254 /* … … 262 263 } else { 263 264 /* There are some freed indices which we can reuse. */ 264 freed_t *f = list_get_instance( u->freed_head.next, freed_t,265 link);265 freed_t *f = list_get_instance(list_first(&u->freed_list), 266 freed_t, link); 266 267 *index = f->first; 267 268 if (f->first++ == f->last) { … … 320 321 link_t *lnk; 321 322 freed_t *n; 322 for (lnk = u->freed_ head.next; lnk != &u->freed_head;323 for (lnk = u->freed_list.head.next; lnk != &u->freed_list.head; 323 324 lnk = lnk->next) { 324 325 freed_t *f = list_get_instance(lnk, freed_t, link); 325 326 if (f->first == index + 1) { 326 327 f->first--; 327 if (lnk->prev != &u->freed_ head)328 if (lnk->prev != &u->freed_list.head) 328 329 try_coalesce_intervals(lnk->prev, lnk, 329 330 lnk); … … 333 334 if (f->last == index - 1) { 334 335 f->last++; 335 if (lnk->next != &u->freed_ head)336 if (lnk->next != &u->freed_list.head) 336 337 try_coalesce_intervals(lnk, lnk->next, 337 338 lnk); … … 359 360 n->first = index; 360 361 n->last = index; 361 list_append(&n->link, &u->freed_ head);362 list_append(&n->link, &u->freed_list); 362 363 } 363 364 fibril_mutex_unlock(&unused_lock); … … 558 559 fibril_mutex_lock(&unused_lock); 559 560 if (!unused_find(devmap_handle, false)) { 560 list_append(&u->link, &unused_ head);561 list_append(&u->link, &unused_list); 561 562 } else { 562 563 free(u); … … 594 595 fibril_mutex_unlock(&unused_lock); 595 596 596 while (!list_empty(&u->freed_ head)) {597 while (!list_empty(&u->freed_list)) { 597 598 freed_t *f; 598 f = list_get_instance( u->freed_head.next, freed_t, link);599 f = list_get_instance(list_first(&u->freed_list), freed_t, link); 599 600 list_remove(&f->link); 600 601 free(f); -
uspace/srv/fs/fat/fat_ops.c
r3714e79 rbee37cf 67 67 68 68 /** List of cached free FAT nodes. */ 69 static LIST_INITIALIZE(ffn_ head);69 static LIST_INITIALIZE(ffn_list); 70 70 71 71 /* … … 147 147 static int fat_node_fini_by_devmap_handle(devmap_handle_t devmap_handle) 148 148 { 149 link_t *lnk;150 149 fat_node_t *nodep; 151 150 int rc; … … 159 158 restart: 160 159 fibril_mutex_lock(&ffn_mutex); 161 for (lnk = ffn_head.next; lnk != &ffn_head; lnk = lnk->next) {160 list_foreach(ffn_list, lnk) { 162 161 nodep = list_get_instance(lnk, fat_node_t, ffn_link); 163 162 if (!fibril_mutex_trylock(&nodep->lock)) { … … 196 195 free(nodep); 197 196 198 /* Need to restart because we changed the ffn_headlist. */197 /* Need to restart because we changed ffn_list. */ 199 198 goto restart; 200 199 } … … 211 210 212 211 fibril_mutex_lock(&ffn_mutex); 213 if (!list_empty(&ffn_ head)) {212 if (!list_empty(&ffn_list)) { 214 213 /* Try to use a cached free node structure. */ 215 214 fat_idx_t *idxp_tmp; 216 nodep = list_get_instance(ffn_head.next, fat_node_t, ffn_link); 215 nodep = list_get_instance(list_first(&ffn_list), fat_node_t, 216 ffn_link); 217 217 if (!fibril_mutex_trylock(&nodep->lock)) 218 218 goto skip_cache; … … 473 473 if (nodep->idx) { 474 474 fibril_mutex_lock(&ffn_mutex); 475 list_append(&nodep->ffn_link, &ffn_ head);475 list_append(&nodep->ffn_link, &ffn_list); 476 476 fibril_mutex_unlock(&ffn_mutex); 477 477 } else { … … 970 970 971 971 /* initialize libblock */ 972 rc = block_init( devmap_handle, BS_SIZE);972 rc = block_init(EXCHANGE_SERIALIZE, devmap_handle, BS_SIZE); 973 973 if (rc != EOK) { 974 974 async_answer_0(rid, rc); -
uspace/srv/fs/tmpfs/tmpfs.c
r3714e79 rbee37cf 30 30 /** @addtogroup fs 31 31 * @{ 32 */ 32 */ 33 33 34 34 /** … … 43 43 #include "tmpfs.h" 44 44 #include <ipc/services.h> 45 #include < ipc/ns.h>45 #include <ns.h> 46 46 #include <async.h> 47 47 #include <errno.h> … … 82 82 * request has been completed. 83 83 */ 84 static void tmpfs_connection(ipc_callid_t iid, ipc_call_t *icall )84 static void tmpfs_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 85 85 { 86 86 if (iid) { … … 94 94 95 95 dprintf(NAME ": connection opened\n"); 96 while (1) {97 ipc_callid_t callid;96 97 while (true) { 98 98 ipc_call_t call; 99 100 callid = async_get_call(&call); 101 switch (IPC_GET_IMETHOD(call)) { 102 case IPC_M_PHONE_HUNGUP: 99 ipc_callid_t callid = async_get_call(&call); 100 101 if (!IPC_GET_IMETHOD(call)) 103 102 return; 103 104 switch (IPC_GET_IMETHOD(call)) { 104 105 case VFS_OUT_MOUNTED: 105 106 tmpfs_mounted(callid, &call); … … 151 152 { 152 153 printf(NAME ": HelenOS TMPFS file system server\n"); 153 154 154 155 if (!tmpfs_init()) { 155 156 printf(NAME ": failed to initialize TMPFS\n"); 156 157 return -1; 157 158 } 158 159 int vfs_phone = service_connect_blocking(SERVICE_VFS, 0, 0); 160 if (vfs_phone < EOK) { 159 160 async_sess_t *vfs_sess = service_connect_blocking(EXCHANGE_SERIALIZE, 161 SERVICE_VFS, 0, 0); 162 if (!vfs_sess) { 161 163 printf(NAME ": Unable to connect to VFS\n"); 162 164 return -1; 163 165 } 164 165 int rc = fs_register(vfs_ phone, &tmpfs_reg, &tmpfs_vfs_info,166 167 int rc = fs_register(vfs_sess, &tmpfs_reg, &tmpfs_vfs_info, 166 168 tmpfs_connection); 167 169 if (rc != EOK) { … … 169 171 return rc; 170 172 } 171 173 172 174 printf(NAME ": Accepting connections\n"); 173 175 task_retval(0); 174 176 async_manager(); 175 /* not reached */ 177 178 /* Not reached */ 176 179 return 0; 177 180 } … … 179 182 /** 180 183 * @} 181 */ 184 */ -
uspace/srv/fs/tmpfs/tmpfs.h
r3714e79 rbee37cf 67 67 size_t size; /**< File size if type is TMPFS_FILE. */ 68 68 void *data; /**< File content's if type is TMPFS_FILE. */ 69 li nk_t cs_head; /**< Head of child's siblings list. */69 list_t cs_list; /**< Child's siblings list. */ 70 70 } tmpfs_node_t; 71 71 -
uspace/srv/fs/tmpfs/tmpfs_dump.c
r3714e79 rbee37cf 167 167 int rc; 168 168 169 rc = block_init( dev, TMPFS_COMM_SIZE);169 rc = block_init(EXCHANGE_SERIALIZE, dev, TMPFS_COMM_SIZE); 170 170 if (rc != EOK) 171 171 return false; -
uspace/srv/fs/tmpfs/tmpfs_ops.c
r3714e79 rbee37cf 85 85 static int tmpfs_has_children(bool *has_children, fs_node_t *fn) 86 86 { 87 *has_children = !list_empty(&TMPFS_NODE(fn)->cs_ head);87 *has_children = !list_empty(&TMPFS_NODE(fn)->cs_list); 88 88 return EOK; 89 89 } … … 180 180 nh_link); 181 181 182 while (!list_empty(&nodep->cs_ head)) {183 tmpfs_dentry_t *dentryp = list_get_instance( nodep->cs_head.next,184 tmpfs_dentry_t, link);182 while (!list_empty(&nodep->cs_list)) { 183 tmpfs_dentry_t *dentryp = list_get_instance( 184 list_first(&nodep->cs_list), tmpfs_dentry_t, link); 185 185 186 186 assert(nodep->type == TMPFS_DIRECTORY); … … 214 214 nodep->data = NULL; 215 215 link_initialize(&nodep->nh_link); 216 list_initialize(&nodep->cs_ head);216 list_initialize(&nodep->cs_list); 217 217 } 218 218 … … 262 262 { 263 263 tmpfs_node_t *parentp = TMPFS_NODE(pfn); 264 link_t *lnk; 265 266 for (lnk = parentp->cs_head.next; lnk != &parentp->cs_head; 267 lnk = lnk->next) { 264 265 list_foreach(parentp->cs_list, lnk) { 268 266 tmpfs_dentry_t *dentryp; 269 267 dentryp = list_get_instance(lnk, tmpfs_dentry_t, link); … … 353 351 354 352 assert(!nodep->lnkcnt); 355 assert(list_empty(&nodep->cs_ head));353 assert(list_empty(&nodep->cs_list)); 356 354 357 355 unsigned long key[] = { … … 373 371 tmpfs_node_t *childp = TMPFS_NODE(cfn); 374 372 tmpfs_dentry_t *dentryp; 375 link_t *lnk;376 373 377 374 assert(parentp->type == TMPFS_DIRECTORY); 378 375 379 376 /* Check for duplicit entries. */ 380 for (lnk = parentp->cs_head.next; lnk != &parentp->cs_head; 381 lnk = lnk->next) { 377 list_foreach(parentp->cs_list, lnk) { 382 378 dentryp = list_get_instance(lnk, tmpfs_dentry_t, link); 383 379 if (!str_cmp(dentryp->name, nm)) … … 401 397 dentryp->node = childp; 402 398 childp->lnkcnt++; 403 list_append(&dentryp->link, &parentp->cs_ head);399 list_append(&dentryp->link, &parentp->cs_list); 404 400 405 401 return EOK; … … 411 407 tmpfs_node_t *childp = NULL; 412 408 tmpfs_dentry_t *dentryp; 413 link_t *lnk;414 409 415 410 if (!parentp) 416 411 return EBUSY; 417 412 418 for (lnk = parentp->cs_head.next; lnk != &parentp->cs_head; 419 lnk = lnk->next) { 413 list_foreach(parentp->cs_list, lnk) { 420 414 dentryp = list_get_instance(lnk, tmpfs_dentry_t, link); 421 415 if (!str_cmp(dentryp->name, nm)) { … … 423 417 assert(FS_NODE(childp) == cfn); 424 418 break; 425 } 419 } 426 420 } 427 421 … … 429 423 return ENOENT; 430 424 431 if ((childp->lnkcnt == 1) && !list_empty(&childp->cs_ head))425 if ((childp->lnkcnt == 1) && !list_empty(&childp->cs_list)) 432 426 return ENOTEMPTY; 433 427 … … 550 544 tmpfs_dentry_t *dentryp; 551 545 link_t *lnk; 552 aoff64_t i;553 546 554 547 assert(nodep->type == TMPFS_DIRECTORY); … … 559 552 * hash table. 560 553 */ 561 for (i = 0, lnk = nodep->cs_head.next; 562 (i < pos) && (lnk != &nodep->cs_head); 563 i++, lnk = lnk->next) 564 ; 565 566 if (lnk == &nodep->cs_head) { 554 lnk = list_nth(&nodep->cs_list, pos); 555 556 if (lnk == NULL) { 567 557 async_answer_0(callid, ENOENT); 568 558 async_answer_1(rid, ENOENT, 0);
Note:
See TracChangeset
for help on using the changeset viewer.
