Changes in uspace/lib/libfs/libfs.c [eda925a:1313ee9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libfs/libfs.c
reda925a r1313ee9 161 161 /* Accept the phone */ 162 162 callid = async_get_call(&call); 163 int mountee_phone = (int) 163 int mountee_phone = (int)IPC_GET_ARG1(call); 164 164 if ((IPC_GET_METHOD(call) != IPC_M_CONNECTION_CLONE) || 165 165 (mountee_phone < 0)) { … … 172 172 ipc_answer_0(callid, EOK); 173 173 174 res = async_data_write_receive(&callid, NULL); 175 if (!res) { 176 ipc_hangup(mountee_phone); 177 ipc_answer_0(callid, EINVAL); 178 ipc_answer_0(rid, EINVAL); 179 return; 180 } 181 174 182 fs_node_t *fn; 175 183 res = ops->node_get(&fn, mp_dev_handle, mp_fs_index); 176 184 if ((res != EOK) || (!fn)) { 177 185 ipc_hangup(mountee_phone); 178 async_data_write_void(combine_rc(res, ENOENT));186 ipc_answer_0(callid, combine_rc(res, ENOENT)); 179 187 ipc_answer_0(rid, combine_rc(res, ENOENT)); 180 188 return; … … 184 192 ipc_hangup(mountee_phone); 185 193 (void) ops->node_put(fn); 186 async_data_write_void(EBUSY);194 ipc_answer_0(callid, EBUSY); 187 195 ipc_answer_0(rid, EBUSY); 188 196 return; … … 193 201 ipc_hangup(mountee_phone); 194 202 (void) ops->node_put(fn); 195 async_data_write_void(rc);203 ipc_answer_0(callid, rc); 196 204 ipc_answer_0(rid, rc); 197 205 return; … … 199 207 200 208 ipc_call_t answer; 201 rc = async_data_write_forward_1_1(mountee_phone, VFS_OUT_MOUNTED, 202 mr_dev_handle, &answer); 209 aid_t msg = async_send_1(mountee_phone, VFS_OUT_MOUNTED, mr_dev_handle, 210 &answer); 211 ipc_forward_fast(callid, mountee_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 212 async_wait_for(msg, &rc); 203 213 204 214 if (rc == EOK) { … … 214 224 ipc_answer_3(rid, rc, IPC_GET_ARG1(answer), IPC_GET_ARG2(answer), 215 225 IPC_GET_ARG3(answer)); 216 }217 218 void libfs_unmount(libfs_ops_t *ops, ipc_callid_t rid, ipc_call_t *request)219 {220 dev_handle_t mp_dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);221 fs_index_t mp_fs_index = (fs_index_t) IPC_GET_ARG2(*request);222 fs_node_t *fn;223 int res;224 225 res = ops->node_get(&fn, mp_dev_handle, mp_fs_index);226 if ((res != EOK) || (!fn)) {227 ipc_answer_0(rid, combine_rc(res, ENOENT));228 return;229 }230 231 /*232 * We are clearly expecting to find the mount point active.233 */234 if (!fn->mp_data.mp_active) {235 (void) ops->node_put(fn);236 ipc_answer_0(rid, EINVAL);237 return;238 }239 240 /*241 * Tell the mounted file system to unmount.242 */243 res = async_req_1_0(fn->mp_data.phone, VFS_OUT_UNMOUNTED,244 fn->mp_data.dev_handle);245 246 /*247 * If everything went well, perform the clean-up on our side.248 */249 if (res == EOK) {250 ipc_hangup(fn->mp_data.phone);251 fn->mp_data.mp_active = false;252 fn->mp_data.fs_handle = 0;253 fn->mp_data.dev_handle = 0;254 fn->mp_data.phone = 0;255 /* Drop the reference created in libfs_mount(). */256 (void) ops->node_put(fn);257 }258 259 (void) ops->node_put(fn);260 ipc_answer_0(rid, res);261 226 } 262 227 … … 339 304 on_error(rc, goto out_with_answer); 340 305 341 /* 342 * If the matching component is a mount point, there are two 343 * legitimate semantics of the lookup operation. The first is 344 * the commonly used one in which the lookup crosses each mount 345 * point into the mounted file system. The second semantics is 346 * used mostly during unmount() and differs from the first one 347 * only in that the last mount point in the looked up path, 348 * which is also its last component, is not crossed. 349 */ 350 351 if ((tmp) && (tmp->mp_data.mp_active) && 352 (!(lflag & L_MP) || (next <= last))) { 306 if ((tmp) && (tmp->mp_data.mp_active)) { 353 307 if (next > last) 354 308 next = last = first; … … 521 475 goto out; 522 476 } 523 524 if ((lflag & L_ROOT) && par) {525 ipc_answer_0(rid, EINVAL);526 goto out;527 }528 477 529 478 out_with_answer:
Note:
See TracChangeset
for help on using the changeset viewer.