Rev 3492 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3492 | Rev 3665 | ||
---|---|---|---|
Line 232... | Line 232... | ||
232 | mr_res.triplet.fs_handle = fs_handle; |
232 | mr_res.triplet.fs_handle = fs_handle; |
233 | mr_res.triplet.dev_handle = dev_handle; |
233 | mr_res.triplet.dev_handle = dev_handle; |
234 | mr_res.triplet.index = (fs_index_t) rindex; |
234 | mr_res.triplet.index = (fs_index_t) rindex; |
235 | mr_res.size = (size_t) rsize; |
235 | mr_res.size = (size_t) rsize; |
236 | mr_res.lnkcnt = (unsigned) rlnkcnt; |
236 | mr_res.lnkcnt = (unsigned) rlnkcnt; |
- | 237 | mr_res.type = VFS_NODE_DIRECTORY; |
|
237 | 238 | ||
238 | rootfs.fs_handle = fs_handle; |
239 | rootfs.fs_handle = fs_handle; |
239 | rootfs.dev_handle = dev_handle; |
240 | rootfs.dev_handle = dev_handle; |
240 | futex_up(&rootfs_futex); |
241 | futex_up(&rootfs_futex); |
241 | 242 | ||
Line 300... | Line 301... | ||
300 | int lflag = IPC_GET_ARG1(*request); |
301 | int lflag = IPC_GET_ARG1(*request); |
301 | int oflag = IPC_GET_ARG2(*request); |
302 | int oflag = IPC_GET_ARG2(*request); |
302 | int mode = IPC_GET_ARG3(*request); |
303 | int mode = IPC_GET_ARG3(*request); |
303 | size_t len; |
304 | size_t len; |
304 | 305 | ||
- | 306 | /* |
|
- | 307 | * Make sure that we are called with exactly one of L_FILE and |
|
- | 308 | * L_DIRECTORY. |
|
- | 309 | */ |
|
- | 310 | if ((lflag & (L_FILE | L_DIRECTORY)) == 0 || |
|
- | 311 | (lflag & (L_FILE | L_DIRECTORY)) == (L_FILE | L_DIRECTORY)) { |
|
- | 312 | ipc_answer_0(rid, EINVAL); |
|
- | 313 | return; |
|
- | 314 | } |
|
- | 315 | ||
305 | if (oflag & O_CREAT) |
316 | if (oflag & O_CREAT) |
306 | lflag |= L_CREATE; |
317 | lflag |= L_CREATE; |
307 | if (oflag & O_EXCL) |
318 | if (oflag & O_EXCL) |
308 | lflag |= L_EXCLUSIVE; |
319 | lflag |= L_EXCLUSIVE; |
309 | 320 | ||
Line 454... | Line 465... | ||
454 | /* |
465 | /* |
455 | * Lock the open file structure so that no other thread can manipulate |
466 | * Lock the open file structure so that no other thread can manipulate |
456 | * the same open file at a time. |
467 | * the same open file at a time. |
457 | */ |
468 | */ |
458 | futex_down(&file->lock); |
469 | futex_down(&file->lock); |
459 | 470 | ||
460 | /* |
471 | /* |
461 | * Lock the file's node so that no other client can read/write to it at |
472 | * Lock the file's node so that no other client can read/write to it at |
462 | * the same time. |
473 | * the same time. |
463 | */ |
474 | */ |
464 | if (read) |
475 | if (read) |
465 | rwlock_read_lock(&file->node->contents_rwlock); |
476 | rwlock_read_lock(&file->node->contents_rwlock); |
466 | else |
477 | else |
467 | rwlock_write_lock(&file->node->contents_rwlock); |
478 | rwlock_write_lock(&file->node->contents_rwlock); |
- | 479 | ||
- | 480 | if (file->node->type == VFS_NODE_DIRECTORY) { |
|
- | 481 | /* |
|
- | 482 | * Make sure that no one is modifying the namespace |
|
- | 483 | * while we are in readdir(). |
|
- | 484 | */ |
|
- | 485 | assert(read); |
|
- | 486 | rwlock_read_lock(&namespace_rwlock); |
|
- | 487 | } |
|
468 | 488 | ||
469 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
489 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
470 | 490 | ||
471 | /* Make a VFS_READ/VFS_WRITE request at the destination FS server. */ |
491 | /* Make a VFS_READ/VFS_WRITE request at the destination FS server. */ |
472 | aid_t msg; |
492 | aid_t msg; |
Line 488... | Line 508... | ||
488 | 508 | ||
489 | /* Wait for reply from the FS server. */ |
509 | /* Wait for reply from the FS server. */ |
490 | ipcarg_t rc; |
510 | ipcarg_t rc; |
491 | async_wait_for(msg, &rc); |
511 | async_wait_for(msg, &rc); |
492 | size_t bytes = IPC_GET_ARG1(answer); |
512 | size_t bytes = IPC_GET_ARG1(answer); |
- | 513 | ||
- | 514 | if (file->node->type == VFS_NODE_DIRECTORY) |
|
- | 515 | rwlock_read_unlock(&namespace_rwlock); |
|
493 | 516 | ||
494 | /* Unlock the VFS node. */ |
517 | /* Unlock the VFS node. */ |
495 | if (read) |
518 | if (read) |
496 | rwlock_read_unlock(&file->node->contents_rwlock); |
519 | rwlock_read_unlock(&file->node->contents_rwlock); |
497 | else { |
520 | else { |