Changeset ce8c848 in mainline
- Timestamp:
- 2010-01-25T22:26:16Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bb0d3d24
- Parents:
- 64af8f1 (diff), c888102 (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
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/include/ipc/vfs.h
r64af8f1 rce8c848 101 101 * No lookup flags used. 102 102 */ 103 #define L_NONE 103 #define L_NONE 0 104 104 105 105 /** … … 108 108 * with L_DIRECTORY. 109 109 */ 110 #define L_FILE 110 #define L_FILE 1 111 111 112 112 /** 113 * Lookup wil succeed only if the object is a directory. If L_CREATE is113 * Lookup will succeed only if the object is a directory. If L_CREATE is 114 114 * specified, an empty directory will be created. This flag is mutually 115 115 * exclusive with L_FILE. 116 116 */ 117 #define L_DIRECTORY 2 117 #define L_DIRECTORY 2 118 119 /** 120 * Lookup will succeed only if the object is a root directory. The flag is 121 * mutually exclusive with L_FILE and L_MP. 122 */ 123 #define L_ROOT 4 124 125 /** 126 * Lookup will succeed only if the object is a mount point. The flag is mutually 127 * exclusive with L_FILE and L_ROOT. 128 */ 129 #define L_MP 8 130 118 131 119 132 /** … … 121 134 * object already exists. L_EXCLUSIVE is implied when L_DIRECTORY is used. 122 135 */ 123 #define L_EXCLUSIVE 4136 #define L_EXCLUSIVE 16 124 137 125 138 /** 126 139 * L_CREATE is used for creating both regular files and directories. 127 140 */ 128 #define L_CREATE 8141 #define L_CREATE 32 129 142 130 143 /** 131 144 * L_LINK is used for linking to an already existing nodes. 132 145 */ 133 #define L_LINK 16146 #define L_LINK 64 134 147 135 148 /** … … 138 151 * VFS_UNLINK. 139 152 */ 140 #define L_UNLINK 32153 #define L_UNLINK 128 141 154 142 155 /** … … 146 159 * client. 147 160 */ 148 #define L_OPEN 64 149 150 /** 151 * L_NOCROSS_LAST_MP is used exclusively during the VFS_IN_UNMOUNT operation. It 152 * tells the lookup routine not to cross the last mount point in the lookup 153 * path. 154 */ 155 #define L_NOCROSS_LAST_MP 128 161 #define L_OPEN 256 156 162 157 163 #endif -
uspace/lib/libfs/libfs.c
r64af8f1 rce8c848 224 224 ipc_answer_3(rid, rc, IPC_GET_ARG1(answer), IPC_GET_ARG2(answer), 225 225 IPC_GET_ARG3(answer)); 226 } 227 228 void libfs_unmount(libfs_ops_t *ops, ipc_callid_t rid, ipc_call_t *request) 229 { 230 dev_handle_t mp_dev_handle = (dev_handle_t) IPC_GET_ARG1(*request); 231 fs_index_t mp_fs_index = (fs_index_t) IPC_GET_ARG2(*request); 232 fs_node_t *fn; 233 int res; 234 235 res = ops->node_get(&fn, mp_dev_handle, mp_fs_index); 236 if ((res != EOK) || (!fn)) { 237 ipc_answer_0(rid, combine_rc(res, ENOENT)); 238 return; 239 } 240 241 /* 242 * We are clearly expecting to find the mount point active. 243 */ 244 if (!fn->mp_data.mp_active) { 245 (void) ops->node_put(fn); 246 ipc_answer_0(rid, EINVAL); 247 return; 248 } 249 250 /* 251 * Tell the mounted file system to unmount. 252 */ 253 res = async_req_1_0(fn->mp_data.phone, VFS_OUT_UNMOUNTED, 254 fn->mp_data.dev_handle); 255 256 /* 257 * If everything went well, perform the clean-up on our side. 258 */ 259 if (res == EOK) { 260 ipc_hangup(fn->mp_data.phone); 261 fn->mp_data.mp_active = false; 262 fn->mp_data.fs_handle = 0; 263 fn->mp_data.dev_handle = 0; 264 fn->mp_data.phone = 0; 265 /* Drop the reference created in libfs_mount(). */ 266 (void) ops->node_put(fn); 267 } 268 269 (void) ops->node_put(fn); 270 ipc_answer_0(rid, res); 226 271 } 227 272 … … 315 360 316 361 if ((tmp) && (tmp->mp_data.mp_active) && 317 (!(lflag & L_ NOCROSS_LAST_MP) || (next <= last))) {362 (!(lflag & L_MP) || (next <= last))) { 318 363 if (next > last) 319 364 next = last = first; … … 486 531 goto out; 487 532 } 533 534 if ((lflag & L_ROOT) && par) { 535 ipc_answer_0(rid, EINVAL); 536 goto out; 537 } 488 538 489 539 out_with_answer: -
uspace/lib/libfs/libfs.h
r64af8f1 rce8c848 95 95 96 96 extern void libfs_mount(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *); 97 extern void libfs_unmount(libfs_ops_t *, ipc_callid_t, ipc_call_t *); 97 98 extern void libfs_lookup(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *); 98 99 extern void libfs_stat(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *); -
uspace/srv/fs/devfs/devfs.c
r64af8f1 rce8c848 75 75 devfs_mount(callid, &call); 76 76 break; 77 case VFS_OUT_UNMOUNTED: 78 devfs_unmounted(callid, &call); 79 break; 80 case VFS_OUT_UNMOUNT: 81 devfs_unmount(callid, &call); 82 break; 77 83 case VFS_OUT_LOOKUP: 78 84 devfs_lookup(callid, &call); -
uspace/srv/fs/devfs/devfs_ops.c
r64af8f1 rce8c848 434 434 } 435 435 436 void devfs_unmounted(ipc_callid_t rid, ipc_call_t *request) 437 { 438 ipc_answer_0(rid, ENOTSUP); 439 } 440 441 void devfs_unmount(ipc_callid_t rid, ipc_call_t *request) 442 { 443 libfs_unmount(&devfs_libfs_ops, rid, request); 444 } 445 436 446 void devfs_lookup(ipc_callid_t rid, ipc_call_t *request) 437 447 { -
uspace/srv/fs/devfs/devfs_ops.h
r64af8f1 rce8c848 41 41 extern void devfs_mounted(ipc_callid_t, ipc_call_t *); 42 42 extern void devfs_mount(ipc_callid_t, ipc_call_t *); 43 extern void devfs_unmounted(ipc_callid_t, ipc_call_t *); 44 extern void devfs_unmount(ipc_callid_t, ipc_call_t *); 43 45 extern void devfs_lookup(ipc_callid_t, ipc_call_t *); 44 46 extern void devfs_open_node(ipc_callid_t, ipc_call_t *); -
uspace/srv/fs/fat/fat.c
r64af8f1 rce8c848 100 100 fat_mount(callid, &call); 101 101 break; 102 case VFS_OUT_UNMOUNTED: 103 fat_unmounted(callid, &call); 104 break; 105 case VFS_OUT_UNMOUNT: 106 fat_unmount(callid, &call); 107 break; 102 108 case VFS_OUT_LOOKUP: 103 109 fat_lookup(callid, &call); -
uspace/srv/fs/fat/fat.h
r64af8f1 rce8c848 204 204 extern void fat_mounted(ipc_callid_t, ipc_call_t *); 205 205 extern void fat_mount(ipc_callid_t, ipc_call_t *); 206 extern void fat_unmounted(ipc_callid_t, ipc_call_t *); 207 extern void fat_unmount(ipc_callid_t, ipc_call_t *); 206 208 extern void fat_lookup(ipc_callid_t, ipc_call_t *); 207 209 extern void fat_read(ipc_callid_t, ipc_call_t *); -
uspace/srv/fs/fat/fat_ops.c
r64af8f1 rce8c848 1117 1117 } 1118 1118 1119 void fat_unmounted(ipc_callid_t rid, ipc_call_t *request) 1120 { 1121 ipc_answer_0(rid, ENOTSUP); 1122 } 1123 1124 void fat_unmount(ipc_callid_t rid, ipc_call_t *request) 1125 { 1126 libfs_unmount(&fat_libfs_ops, rid, request); 1127 } 1128 1119 1129 void fat_lookup(ipc_callid_t rid, ipc_call_t *request) 1120 1130 { -
uspace/srv/fs/tmpfs/tmpfs.c
r64af8f1 rce8c848 106 106 tmpfs_mount(callid, &call); 107 107 break; 108 case VFS_OUT_UNMOUNTED: 109 tmpfs_unmounted(callid, &call); 110 break; 111 case VFS_OUT_UNMOUNT: 112 tmpfs_unmount(callid, &call); 113 break; 108 114 case VFS_OUT_LOOKUP: 109 115 tmpfs_lookup(callid, &call); -
uspace/srv/fs/tmpfs/tmpfs.h
r64af8f1 rce8c848 83 83 extern void tmpfs_mounted(ipc_callid_t, ipc_call_t *); 84 84 extern void tmpfs_mount(ipc_callid_t, ipc_call_t *); 85 extern void tmpfs_unmounted(ipc_callid_t, ipc_call_t *); 86 extern void tmpfs_unmount(ipc_callid_t, ipc_call_t *); 85 87 extern void tmpfs_lookup(ipc_callid_t, ipc_call_t *); 86 88 extern void tmpfs_read(ipc_callid_t, ipc_call_t *); -
uspace/srv/fs/tmpfs/tmpfs_ops.c
r64af8f1 rce8c848 449 449 } 450 450 451 void tmpfs_unmounted(ipc_callid_t rid, ipc_call_t *request) 452 { 453 ipc_answer_0(rid, ENOTSUP); 454 } 455 456 void tmpfs_unmount(ipc_callid_t rid, ipc_call_t *request) 457 { 458 libfs_unmount(&tmpfs_libfs_ops, rid, request); 459 } 460 451 461 void tmpfs_lookup(ipc_callid_t rid, ipc_call_t *request) 452 462 { -
uspace/srv/vfs/vfs_ops.c
r64af8f1 rce8c848 92 92 } 93 93 94 rc = vfs_lookup_internal(mp, L_ DIRECTORY, &mp_res, NULL);94 rc = vfs_lookup_internal(mp, L_MP, &mp_res, NULL); 95 95 if (rc != EOK) { 96 96 /* The lookup failed for some reason. */ … … 459 459 * Lookup the mounted root and instantiate it. 460 460 */ 461 rc = vfs_lookup_internal(mp, L_ NONE, &mr_res, NULL);461 rc = vfs_lookup_internal(mp, L_ROOT, &mr_res, NULL); 462 462 if (rc != EOK) { 463 463 fibril_rwlock_write_unlock(&namespace_rwlock); … … 521 521 */ 522 522 523 /* 524 * The L_NOCROSS_LAST_MP flag is essential if we really want to 525 * lookup the mount point and not the mounted root. 526 */ 527 rc = vfs_lookup_internal(mp, L_NOCROSS_LAST_MP, &mp_res, NULL); 523 rc = vfs_lookup_internal(mp, L_MP, &mp_res, NULL); 528 524 free(mp); 529 525 if (rc != EOK) { … … 542 538 543 539 phone = vfs_grab_phone(mp_node->fs_handle); 544 rc = async_req_2_0(phone, VFS_OUT_UNMOUNT, mp_node-> fs_handle,545 mp_node-> dev_handle);540 rc = async_req_2_0(phone, VFS_OUT_UNMOUNT, mp_node->dev_handle, 541 mp_node->index); 546 542 vfs_release_phone(phone); 547 543 if (rc != EOK) { … … 595 591 /* 596 592 * Make sure that we are called with exactly one of L_FILE and 597 * L_DIRECTORY. Make sure that the user does not pass L_OPEN or598 * L_ NOCROSS_LAST_MP.593 * L_DIRECTORY. Make sure that the user does not pass L_OPEN, 594 * L_ROOT or L_MP. 599 595 */ 600 596 if (((lflag & (L_FILE | L_DIRECTORY)) == 0) || 601 597 ((lflag & (L_FILE | L_DIRECTORY)) == (L_FILE | L_DIRECTORY)) || 602 (lflag & L_OPEN) || (lflag & L_NOCROSS_LAST_MP)) {598 (lflag & (L_OPEN | L_ROOT | L_MP))) { 603 599 ipc_answer_0(rid, EINVAL); 604 600 return;
Note:
See TracChangeset
for help on using the changeset viewer.