Rev 4566 | Rev 4585 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4566 | Rev 4584 | ||
---|---|---|---|
Line 106... | Line 106... | ||
106 | return; |
106 | return; |
107 | } |
107 | } |
108 | 108 | ||
109 | /* |
109 | /* |
110 | * Now we hold a reference to mp_node. |
110 | * Now we hold a reference to mp_node. |
111 | * It will be dropped upon the corresponding VFS_UNMOUNT. |
111 | * It will be dropped upon the corresponding VFS_IN_UNMOUNT. |
112 | * This prevents the mount point from being deleted. |
112 | * This prevents the mount point from being deleted. |
113 | */ |
113 | */ |
114 | } else { |
114 | } else { |
115 | /* We still don't have the root file system mounted. */ |
115 | /* We still don't have the root file system mounted. */ |
116 | if (str_cmp(mp, "/") == 0) { |
116 | if (str_cmp(mp, "/") == 0) { |
Line 119... | Line 119... | ||
119 | * we are almost done. |
119 | * we are almost done. |
120 | */ |
120 | */ |
121 | 121 | ||
122 | /* Tell the mountee that it is being mounted. */ |
122 | /* Tell the mountee that it is being mounted. */ |
123 | phone = vfs_grab_phone(fs_handle); |
123 | phone = vfs_grab_phone(fs_handle); |
124 | msg = async_send_1(phone, VFS_MOUNTED, |
124 | msg = async_send_1(phone, VFS_OUT_MOUNTED, |
125 | (ipcarg_t) dev_handle, &answer); |
125 | (ipcarg_t) dev_handle, &answer); |
126 | /* send the mount options */ |
126 | /* send the mount options */ |
127 | rc = ipc_data_write_start(phone, (void *)opts, |
127 | rc = ipc_data_write_start(phone, (void *)opts, |
128 | str_size(opts)); |
128 | str_size(opts)); |
129 | if (rc != EOK) { |
129 | if (rc != EOK) { |
Line 181... | Line 181... | ||
181 | 181 | ||
182 | int mountee_phone = vfs_grab_phone(fs_handle); |
182 | int mountee_phone = vfs_grab_phone(fs_handle); |
183 | assert(mountee_phone >= 0); |
183 | assert(mountee_phone >= 0); |
184 | 184 | ||
185 | phone = vfs_grab_phone(mp_res.triplet.fs_handle); |
185 | phone = vfs_grab_phone(mp_res.triplet.fs_handle); |
186 | msg = async_send_4(phone, VFS_MOUNT, |
186 | msg = async_send_4(phone, VFS_OUT_MOUNT, |
187 | (ipcarg_t) mp_res.triplet.dev_handle, |
187 | (ipcarg_t) mp_res.triplet.dev_handle, |
188 | (ipcarg_t) mp_res.triplet.index, |
188 | (ipcarg_t) mp_res.triplet.index, |
189 | (ipcarg_t) fs_handle, |
189 | (ipcarg_t) fs_handle, |
190 | (ipcarg_t) dev_handle, &answer); |
190 | (ipcarg_t) dev_handle, &answer); |
191 | 191 | ||
Line 435... | Line 435... | ||
435 | return; |
435 | return; |
436 | } |
436 | } |
437 | 437 | ||
438 | /* |
438 | /* |
439 | * The POSIX interface is open(path, oflag, mode). |
439 | * The POSIX interface is open(path, oflag, mode). |
440 | * We can receive oflags and mode along with the VFS_OPEN call; the path |
440 | * We can receive oflags and mode along with the VFS_IN_OPEN call; |
441 | * will need to arrive in another call. |
441 | * the path will need to arrive in another call. |
442 | * |
442 | * |
443 | * We also receive one private, non-POSIX set of flags called lflag |
443 | * We also receive one private, non-POSIX set of flags called lflag |
444 | * used to pass information to vfs_lookup_internal(). |
444 | * used to pass information to vfs_lookup_internal(). |
445 | */ |
445 | */ |
446 | int lflag = IPC_GET_ARG1(*request); |
446 | int lflag = IPC_GET_ARG1(*request); |
Line 553... | Line 553... | ||
553 | /* |
553 | /* |
554 | * The following increase in reference count is for the fact that the |
554 | * The following increase in reference count is for the fact that the |
555 | * file is being opened and that a file structure is pointing to it. |
555 | * file is being opened and that a file structure is pointing to it. |
556 | * It is necessary so that the file will not disappear when |
556 | * It is necessary so that the file will not disappear when |
557 | * vfs_node_put() is called. The reference will be dropped by the |
557 | * vfs_node_put() is called. The reference will be dropped by the |
558 | * respective VFS_CLOSE. |
558 | * respective VFS_IN_CLOSE. |
559 | */ |
559 | */ |
560 | vfs_node_addref(node); |
560 | vfs_node_addref(node); |
561 | vfs_node_put(node); |
561 | vfs_node_put(node); |
562 | 562 | ||
563 | /* Success! Return the new file descriptor to the client. */ |
563 | /* Success! Return the new file descriptor to the client. */ |
Line 630... | Line 630... | ||
630 | /* |
630 | /* |
631 | * The following increase in reference count is for the fact that the |
631 | * The following increase in reference count is for the fact that the |
632 | * file is being opened and that a file structure is pointing to it. |
632 | * file is being opened and that a file structure is pointing to it. |
633 | * It is necessary so that the file will not disappear when |
633 | * It is necessary so that the file will not disappear when |
634 | * vfs_node_put() is called. The reference will be dropped by the |
634 | * vfs_node_put() is called. The reference will be dropped by the |
635 | * respective VFS_CLOSE. |
635 | * respective VFS_IN_CLOSE. |
636 | */ |
636 | */ |
637 | vfs_node_addref(node); |
637 | vfs_node_addref(node); |
638 | vfs_node_put(node); |
638 | vfs_node_put(node); |
639 | 639 | ||
640 | /* Success! Return the new file descriptor to the client. */ |
640 | /* Success! Return the new file descriptor to the client. */ |
Line 672... | Line 672... | ||
672 | * the same open file at a time. |
672 | * the same open file at a time. |
673 | */ |
673 | */ |
674 | fibril_mutex_lock(&file->lock); |
674 | fibril_mutex_lock(&file->lock); |
675 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
675 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
676 | 676 | ||
677 | /* Make a VFS_DEVICE request at the destination FS server. */ |
677 | /* Make a VFS_OUT_DEVICE request at the destination FS server. */ |
678 | aid_t msg; |
678 | aid_t msg; |
679 | ipc_call_t answer; |
679 | ipc_call_t answer; |
680 | msg = async_send_2(fs_phone, IPC_GET_METHOD(*request), |
680 | msg = async_send_2(fs_phone, VFS_OUT_DEVICE, file->node->dev_handle, |
681 | file->node->dev_handle, file->node->index, &answer); |
681 | file->node->index, &answer); |
682 | 682 | ||
683 | /* Wait for reply from the FS server. */ |
683 | /* Wait for reply from the FS server. */ |
684 | ipcarg_t rc; |
684 | ipcarg_t rc; |
685 | async_wait_for(msg, &rc); |
685 | async_wait_for(msg, &rc); |
686 | 686 | ||
Line 706... | Line 706... | ||
706 | * the same open file at a time. |
706 | * the same open file at a time. |
707 | */ |
707 | */ |
708 | fibril_mutex_lock(&file->lock); |
708 | fibril_mutex_lock(&file->lock); |
709 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
709 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
710 | 710 | ||
711 | /* Make a VFS_SYMC request at the destination FS server. */ |
711 | /* Make a VFS_OUT_SYMC request at the destination FS server. */ |
712 | aid_t msg; |
712 | aid_t msg; |
713 | ipc_call_t answer; |
713 | ipc_call_t answer; |
714 | msg = async_send_2(fs_phone, IPC_GET_METHOD(*request), |
714 | msg = async_send_2(fs_phone, VFS_OUT_SYNC, file->node->dev_handle, |
715 | file->node->dev_handle, file->node->index, &answer); |
715 | file->node->index, &answer); |
716 | 716 | ||
717 | /* Wait for reply from the FS server. */ |
717 | /* Wait for reply from the FS server. */ |
718 | ipcarg_t rc; |
718 | ipcarg_t rc; |
719 | async_wait_for(msg, &rc); |
719 | async_wait_for(msg, &rc); |
720 | 720 | ||
Line 740... | Line 740... | ||
740 | * the same open file at a time. |
740 | * the same open file at a time. |
741 | */ |
741 | */ |
742 | fibril_mutex_lock(&file->lock); |
742 | fibril_mutex_lock(&file->lock); |
743 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
743 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
744 | 744 | ||
745 | /* Make a VFS_CLOSE request at the destination FS server. */ |
745 | /* Make a VFS_OUT_CLOSE request at the destination FS server. */ |
746 | aid_t msg; |
746 | aid_t msg; |
747 | ipc_call_t answer; |
747 | ipc_call_t answer; |
748 | msg = async_send_2(fs_phone, IPC_GET_METHOD(*request), |
748 | msg = async_send_2(fs_phone, VFS_OUT_CLOSE, file->node->dev_handle, |
749 | file->node->dev_handle, file->node->index, &answer); |
749 | file->node->index, &answer); |
750 | 750 | ||
751 | /* Wait for reply from the FS server. */ |
751 | /* Wait for reply from the FS server. */ |
752 | ipcarg_t rc; |
752 | ipcarg_t rc; |
753 | async_wait_for(msg, &rc); |
753 | async_wait_for(msg, &rc); |
754 | 754 | ||
Line 830... | Line 830... | ||
830 | /* Make a VFS_READ/VFS_WRITE request at the destination FS server. */ |
830 | /* Make a VFS_READ/VFS_WRITE request at the destination FS server. */ |
831 | aid_t msg; |
831 | aid_t msg; |
832 | ipc_call_t answer; |
832 | ipc_call_t answer; |
833 | if (!read && file->append) |
833 | if (!read && file->append) |
834 | file->pos = file->node->size; |
834 | file->pos = file->node->size; |
835 | msg = async_send_3(fs_phone, IPC_GET_METHOD(*request), |
835 | msg = async_send_3(fs_phone, read ? VFS_OUT_READ : VFS_OUT_WRITE, |
836 | file->node->dev_handle, file->node->index, file->pos, &answer); |
836 | file->node->dev_handle, file->node->index, file->pos, &answer); |
837 | 837 | ||
838 | /* |
838 | /* |
839 | * Forward the IPC_M_DATA_READ/IPC_M_DATA_WRITE request to the |
839 | * Forward the IPC_M_DATA_READ/IPC_M_DATA_WRITE request to the |
840 | * destination FS server. The call will be routed as if sent by |
840 | * destination FS server. The call will be routed as if sent by |
Line 944... | Line 944... | ||
944 | { |
944 | { |
945 | ipcarg_t rc; |
945 | ipcarg_t rc; |
946 | int fs_phone; |
946 | int fs_phone; |
947 | 947 | ||
948 | fs_phone = vfs_grab_phone(fs_handle); |
948 | fs_phone = vfs_grab_phone(fs_handle); |
949 | rc = async_req_3_0(fs_phone, VFS_TRUNCATE, (ipcarg_t)dev_handle, |
949 | rc = async_req_3_0(fs_phone, VFS_OUT_TRUNCATE, (ipcarg_t)dev_handle, |
950 | (ipcarg_t)index, (ipcarg_t)size); |
950 | (ipcarg_t)index, (ipcarg_t)size); |
951 | vfs_release_phone(fs_phone); |
951 | vfs_release_phone(fs_phone); |
952 | return (int)rc; |
952 | return (int)rc; |
953 | } |
953 | } |
954 | 954 | ||
Line 1048... | Line 1048... | ||
1048 | } |
1048 | } |
1049 | 1049 | ||
1050 | /* |
1050 | /* |
1051 | * The name has already been unlinked by vfs_lookup_internal(). |
1051 | * The name has already been unlinked by vfs_lookup_internal(). |
1052 | * We have to get and put the VFS node to ensure that it is |
1052 | * We have to get and put the VFS node to ensure that it is |
1053 | * VFS_DESTROY'ed after the last reference to it is dropped. |
1053 | * VFS_OUT_DESTROY'ed after the last reference to it is dropped. |
1054 | */ |
1054 | */ |
1055 | vfs_node_t *node = vfs_node_get(&lr); |
1055 | vfs_node_t *node = vfs_node_get(&lr); |
1056 | fibril_mutex_lock(&nodes_mutex); |
1056 | fibril_mutex_lock(&nodes_mutex); |
1057 | node->lnkcnt--; |
1057 | node->lnkcnt--; |
1058 | fibril_mutex_unlock(&nodes_mutex); |
1058 | fibril_mutex_unlock(&nodes_mutex); |