Changes in uspace/srv/vfs/vfs_ops.c [e6da6d5:27b76ca] in mainline
- File:
-
- 1 edited
-
uspace/srv/vfs/vfs_ops.c (modified) (37 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
re6da6d5 r27b76ca 52 52 #include <assert.h> 53 53 #include <vfs/canonify.h> 54 #include <vfs/vfs_mtab.h>55 56 FIBRIL_MUTEX_INITIALIZE(mtab_list_lock);57 LIST_INITIALIZE(mtab_list);58 static size_t mtab_size = 0;59 54 60 55 /* Forward declarations of static functions. */ 61 static int vfs_truncate_internal(fs_handle_t, service_id_t, fs_index_t,56 static int vfs_truncate_internal(fs_handle_t, devmap_handle_t, fs_index_t, 62 57 aoff64_t); 63 58 … … 70 65 vfs_pair_t rootfs = { 71 66 .fs_handle = 0, 72 . service_id= 067 .devmap_handle = 0 73 68 }; 74 69 75 static int vfs_mount_internal(ipc_callid_t rid, service_id_t service_id,70 static void vfs_mount_internal(ipc_callid_t rid, devmap_handle_t devmap_handle, 76 71 fs_handle_t fs_handle, char *mp, char *opts) 77 72 { … … 96 91 fibril_rwlock_write_unlock(&namespace_rwlock); 97 92 async_answer_0(rid, EBUSY); 98 return EBUSY;93 return; 99 94 } 100 95 … … 104 99 fibril_rwlock_write_unlock(&namespace_rwlock); 105 100 async_answer_0(rid, rc); 106 return rc;101 return; 107 102 } 108 103 … … 111 106 fibril_rwlock_write_unlock(&namespace_rwlock); 112 107 async_answer_0(rid, ENOMEM); 113 return ENOMEM;108 return; 114 109 } 115 110 … … 130 125 exch = vfs_exchange_grab(fs_handle); 131 126 msg = async_send_1(exch, VFS_OUT_MOUNTED, 132 (sysarg_t) service_id, &answer);127 (sysarg_t) devmap_handle, &answer); 133 128 /* Send the mount options */ 134 129 rc = async_data_write_start(exch, (void *)opts, … … 140 135 fibril_rwlock_write_unlock(&namespace_rwlock); 141 136 async_answer_0(rid, rc); 142 return rc;137 return; 143 138 } 144 139 async_wait_for(msg, &rc); … … 147 142 fibril_rwlock_write_unlock(&namespace_rwlock); 148 143 async_answer_0(rid, rc); 149 return rc;144 return; 150 145 } 151 146 152 147 rindex = (fs_index_t) IPC_GET_ARG1(answer); 153 rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), 154 IPC_GET_ARG3(answer)); 148 rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), IPC_GET_ARG3(answer)); 155 149 rlnkcnt = (unsigned) IPC_GET_ARG4(answer); 156 150 157 151 mr_res.triplet.fs_handle = fs_handle; 158 mr_res.triplet. service_id = service_id;152 mr_res.triplet.devmap_handle = devmap_handle; 159 153 mr_res.triplet.index = rindex; 160 154 mr_res.size = rsize; … … 163 157 164 158 rootfs.fs_handle = fs_handle; 165 rootfs. service_id = service_id;159 rootfs.devmap_handle = devmap_handle; 166 160 167 161 /* Add reference to the mounted root. */ … … 171 165 fibril_rwlock_write_unlock(&namespace_rwlock); 172 166 async_answer_0(rid, rc); 173 return rc;167 return; 174 168 } else { 175 169 /* … … 179 173 fibril_rwlock_write_unlock(&namespace_rwlock); 180 174 async_answer_0(rid, ENOENT); 181 return ENOENT;182 } 183 } 184 185 /* 186 * At this point, we have all necessary pieces: file system handle187 * and service ID, and we know the mount point VFS node.175 return; 176 } 177 } 178 179 /* 180 * At this point, we have all necessary pieces: file system and device 181 * handles, and we know the mount point VFS node. 188 182 */ 189 183 … … 193 187 exch = vfs_exchange_grab(mp_res.triplet.fs_handle); 194 188 msg = async_send_4(exch, VFS_OUT_MOUNT, 195 (sysarg_t) mp_res.triplet. service_id,189 (sysarg_t) mp_res.triplet.devmap_handle, 196 190 (sysarg_t) mp_res.triplet.index, 197 191 (sysarg_t) fs_handle, 198 (sysarg_t) service_id, &answer);192 (sysarg_t) devmap_handle, &answer); 199 193 200 194 /* Send connection */ … … 212 206 async_answer_0(rid, rc); 213 207 fibril_rwlock_write_unlock(&namespace_rwlock); 214 return rc;208 return; 215 209 } 216 210 … … 227 221 fibril_rwlock_write_unlock(&namespace_rwlock); 228 222 async_answer_0(rid, rc); 229 return rc; 230 } 231 232 /* 233 * Wait for the answer before releasing the exchange to avoid deadlock 234 * in case the answer depends on further calls to the same file system. 235 * Think of a case when mounting a FS on a file_bd backed by a file on 236 * the same FS. 237 */ 223 return; 224 } 225 226 vfs_exchange_release(exch); 238 227 async_wait_for(msg, &rc); 239 vfs_exchange_release(exch);240 228 241 229 if (rc == EOK) { … … 246 234 247 235 mr_res.triplet.fs_handle = fs_handle; 248 mr_res.triplet. service_id = service_id;236 mr_res.triplet.devmap_handle = devmap_handle; 249 237 mr_res.triplet.index = rindex; 250 238 mr_res.size = rsize; … … 263 251 async_answer_0(rid, rc); 264 252 fibril_rwlock_write_unlock(&namespace_rwlock); 265 return rc;266 253 } 267 254 268 255 void vfs_mount(ipc_callid_t rid, ipc_call_t *request) 269 256 { 270 service_id_t service_id;257 devmap_handle_t devmap_handle; 271 258 272 259 /* … … 275 262 * in the request. 276 263 */ 277 service_id = (service_id_t) IPC_GET_ARG1(*request);264 devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 278 265 279 266 /* … … 283 270 284 271 /* 285 * Instance number is passed as ARG3.286 * /287 unsigned int instance = IPC_GET_ARG3(*request);288 272 * For now, don't make use of ARG3, but it can be used to 273 * carry mount options in the future. 274 */ 275 289 276 /* We want the client to send us the mount point. */ 290 277 char *mp; … … 342 329 fs_handle_t fs_handle; 343 330 recheck: 344 fs_handle = fs_name_to_handle( instance,fs_name, false);331 fs_handle = fs_name_to_handle(fs_name, false); 345 332 if (!fs_handle) { 346 333 if (flags & IPC_FLAG_BLOCKING) { … … 358 345 } 359 346 fibril_mutex_unlock(&fs_list_lock); 360 361 /* Add the filesystem info to the list of mounted filesystems */ 362 mtab_ent_t *mtab_ent = malloc(sizeof(mtab_ent_t)); 363 if (!mtab_ent) { 364 async_answer_0(callid, ENOMEM); 365 async_answer_0(rid, ENOMEM); 366 free(mp); 367 free(fs_name); 368 free(opts); 369 return; 370 } 371 347 348 /* Acknowledge that we know fs_name. */ 349 async_answer_0(callid, EOK); 350 372 351 /* Do the mount */ 373 rc = vfs_mount_internal(rid, service_id, fs_handle, mp, opts); 374 if (rc != EOK) { 375 async_answer_0(callid, ENOTSUP); 376 async_answer_0(rid, ENOTSUP); 377 free(mtab_ent); 378 free(mp); 379 free(opts); 380 free(fs_name); 381 return; 382 } 383 384 /* Add the filesystem info to the list of mounted filesystems */ 385 386 str_cpy(mtab_ent->mp, MAX_PATH_LEN, mp); 387 str_cpy(mtab_ent->fs_name, FS_NAME_MAXLEN, fs_name); 388 str_cpy(mtab_ent->opts, MAX_MNTOPTS_LEN, opts); 389 mtab_ent->instance = instance; 390 mtab_ent->service_id = service_id; 391 392 link_initialize(&mtab_ent->link); 393 394 fibril_mutex_lock(&mtab_list_lock); 395 list_append(&mtab_ent->link, &mtab_list); 396 mtab_size++; 397 fibril_mutex_unlock(&mtab_list_lock); 398 352 vfs_mount_internal(rid, devmap_handle, fs_handle, mp, opts); 399 353 free(mp); 400 354 free(fs_name); 401 355 free(opts); 402 403 /* Acknowledge that we know fs_name. */404 async_answer_0(callid, EOK);405 356 } 406 357 … … 458 409 */ 459 410 if (vfs_nodes_refcount_sum_get(mr_node->fs_handle, 460 mr_node-> service_id) != 2) {411 mr_node->devmap_handle) != 2) { 461 412 fibril_rwlock_write_unlock(&namespace_rwlock); 462 413 vfs_node_put(mr_node); … … 475 426 */ 476 427 428 free(mp); 429 477 430 exch = vfs_exchange_grab(mr_node->fs_handle); 478 431 rc = async_req_1_0(exch, VFS_OUT_UNMOUNTED, 479 mr_node-> service_id);432 mr_node->devmap_handle); 480 433 vfs_exchange_release(exch); 481 434 482 435 if (rc != EOK) { 483 436 fibril_rwlock_write_unlock(&namespace_rwlock); 484 free(mp);485 437 vfs_node_put(mr_node); 486 438 async_answer_0(rid, rc); … … 489 441 490 442 rootfs.fs_handle = 0; 491 rootfs. service_id= 0;443 rootfs.devmap_handle = 0; 492 444 } else { 493 445 … … 500 452 501 453 rc = vfs_lookup_internal(mp, L_MP, &mp_res, NULL); 454 free(mp); 502 455 if (rc != EOK) { 503 456 fibril_rwlock_write_unlock(&namespace_rwlock); 504 free(mp);505 457 vfs_node_put(mr_node); 506 458 async_answer_0(rid, rc); … … 511 463 if (!mp_node) { 512 464 fibril_rwlock_write_unlock(&namespace_rwlock); 513 free(mp);514 465 vfs_node_put(mr_node); 515 466 async_answer_0(rid, ENOMEM); … … 519 470 exch = vfs_exchange_grab(mp_node->fs_handle); 520 471 rc = async_req_2_0(exch, VFS_OUT_UNMOUNT, 521 mp_node-> service_id, mp_node->index);472 mp_node->devmap_handle, mp_node->index); 522 473 vfs_exchange_release(exch); 523 474 524 475 if (rc != EOK) { 525 476 fibril_rwlock_write_unlock(&namespace_rwlock); 526 free(mp);527 477 vfs_node_put(mp_node); 528 478 vfs_node_put(mr_node); … … 542 492 */ 543 493 vfs_node_forget(mr_node); 494 544 495 fibril_rwlock_write_unlock(&namespace_rwlock); 545 546 fibril_mutex_lock(&mtab_list_lock);547 548 int found = 0;549 550 list_foreach(mtab_list, cur) {551 mtab_ent_t *mtab_ent = list_get_instance(cur, mtab_ent_t,552 link);553 554 if (str_cmp(mtab_ent->mp, mp) == 0) {555 list_remove(&mtab_ent->link);556 mtab_size--;557 free(mtab_ent);558 found = 1;559 break;560 }561 }562 assert(found);563 fibril_mutex_unlock(&mtab_list_lock);564 565 free(mp);566 567 496 async_answer_0(rid, EOK); 568 497 } … … 646 575 if (node->size) { 647 576 rc = vfs_truncate_internal(node->fs_handle, 648 node-> service_id, node->index, 0);577 node->devmap_handle, node->index, 0); 649 578 if (rc) { 650 579 fibril_rwlock_write_unlock(&node->contents_rwlock); … … 710 639 aid_t msg; 711 640 ipc_call_t answer; 712 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node-> service_id,641 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node->devmap_handle, 713 642 file->node->index, &answer); 714 643 … … 795 724 if (read) { 796 725 rc = async_data_read_forward_4_1(fs_exch, VFS_OUT_READ, 797 file->node-> service_id, file->node->index,726 file->node->devmap_handle, file->node->index, 798 727 LOWER32(file->pos), UPPER32(file->pos), &answer); 799 728 } else { … … 802 731 803 732 rc = async_data_write_forward_4_1(fs_exch, VFS_OUT_WRITE, 804 file->node-> service_id, file->node->index,733 file->node->devmap_handle, file->node->index, 805 734 LOWER32(file->pos), UPPER32(file->pos), &answer); 806 735 } … … 933 862 } 934 863 935 int vfs_truncate_internal(fs_handle_t fs_handle, service_id_t service_id,864 int vfs_truncate_internal(fs_handle_t fs_handle, devmap_handle_t devmap_handle, 936 865 fs_index_t index, aoff64_t size) 937 866 { 938 867 async_exch_t *exch = vfs_exchange_grab(fs_handle); 939 868 sysarg_t rc = async_req_4_0(exch, VFS_OUT_TRUNCATE, 940 (sysarg_t) service_id, (sysarg_t) index, LOWER32(size),869 (sysarg_t) devmap_handle, (sysarg_t) index, LOWER32(size), 941 870 UPPER32(size)); 942 871 vfs_exchange_release(exch); … … 961 890 fibril_rwlock_write_lock(&file->node->contents_rwlock); 962 891 rc = vfs_truncate_internal(file->node->fs_handle, 963 file->node-> service_id, file->node->index, size);892 file->node->devmap_handle, file->node->index, size); 964 893 if (rc == EOK) 965 894 file->node->size = size; … … 995 924 996 925 aid_t msg; 997 msg = async_send_3(exch, VFS_OUT_STAT, file->node-> service_id,926 msg = async_send_3(exch, VFS_OUT_STAT, file->node->devmap_handle, 998 927 file->node->index, true, NULL); 999 928 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 1048 977 1049 978 aid_t msg; 1050 msg = async_send_3(exch, VFS_OUT_STAT, node-> service_id,979 msg = async_send_3(exch, VFS_OUT_STAT, node->devmap_handle, 1051 980 node->index, false, NULL); 1052 981 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 1225 1154 /* Check whether linking to the same file system instance. */ 1226 1155 if ((old_node->fs_handle != new_par_lr.triplet.fs_handle) || 1227 (old_node-> service_id != new_par_lr.triplet.service_id)) {1156 (old_node->devmap_handle != new_par_lr.triplet.devmap_handle)) { 1228 1157 fibril_rwlock_write_unlock(&namespace_rwlock); 1229 1158 vfs_node_put(old_node); … … 1353 1282 } 1354 1283 1355 void vfs_get_mtab(ipc_callid_t rid, ipc_call_t *request)1356 {1357 ipc_callid_t callid;1358 ipc_call_t data;1359 sysarg_t rc = EOK;1360 size_t len;1361 1362 fibril_mutex_lock(&mtab_list_lock);1363 1364 /* Send to the caller the number of mounted filesystems */1365 callid = async_get_call(&data);1366 if (IPC_GET_IMETHOD(data) != VFS_IN_PING) {1367 rc = ENOTSUP;1368 async_answer_0(callid, rc);1369 goto exit;1370 }1371 async_answer_1(callid, EOK, mtab_size);1372 1373 list_foreach(mtab_list, cur) {1374 mtab_ent_t *mtab_ent = list_get_instance(cur, mtab_ent_t,1375 link);1376 1377 rc = ENOTSUP;1378 1379 if (!async_data_read_receive(&callid, &len)) {1380 async_answer_0(callid, rc);1381 goto exit;1382 }1383 1384 (void) async_data_read_finalize(callid, mtab_ent->mp,1385 str_size(mtab_ent->mp));1386 1387 if (!async_data_read_receive(&callid, &len)) {1388 async_answer_0(callid, rc);1389 goto exit;1390 }1391 1392 (void) async_data_read_finalize(callid, mtab_ent->opts,1393 str_size(mtab_ent->opts));1394 1395 if (!async_data_read_receive(&callid, &len)) {1396 async_answer_0(callid, rc);1397 goto exit;1398 }1399 1400 (void) async_data_read_finalize(callid, mtab_ent->fs_name,1401 str_size(mtab_ent->fs_name));1402 1403 callid = async_get_call(&data);1404 1405 if (IPC_GET_IMETHOD(data) != VFS_IN_PING) {1406 async_answer_0(callid, rc);1407 goto exit;1408 }1409 1410 rc = EOK;1411 async_answer_2(callid, rc, mtab_ent->instance,1412 mtab_ent->service_id);1413 }1414 1415 exit:1416 fibril_mutex_unlock(&mtab_list_lock);1417 async_answer_0(rid, rc);1418 }1419 1420 1284 /** 1421 1285 * @}
Note:
See TracChangeset
for help on using the changeset viewer.
