Changeset f15cf1a6 in mainline for uspace/srv/vfs/vfs_ops.c
- Timestamp:
- 2008-02-17T16:22:10Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- cf19ab5
- Parents:
- e704503
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
re704503 rf15cf1a6 591 591 { 592 592 int mode = IPC_GET_ARG1(*request); 593 593 594 size_t len; 594 595 595 ipc_callid_t callid; 596 596 … … 630 630 } 631 631 632 void vfs_unlink(ipc_callid_t rid, ipc_call_t *request) 633 { 634 int lflag = IPC_GET_ARG1(*request); 635 636 size_t len; 637 ipc_callid_t callid; 638 639 if (!ipc_data_write_receive(&callid, &len)) { 640 ipc_answer_0(callid, EINVAL); 641 ipc_answer_0(rid, EINVAL); 642 return; 643 } 644 645 /* 646 * Now we are on the verge of accepting the path. 647 * 648 * There is one optimization we could do in the future: copy the path 649 * directly into the PLB using some kind of a callback. 650 */ 651 char *path = malloc(len); 652 653 if (!path) { 654 ipc_answer_0(callid, ENOMEM); 655 ipc_answer_0(rid, ENOMEM); 656 return; 657 } 658 659 int rc; 660 if ((rc = ipc_data_write_finalize(callid, path, len))) { 661 ipc_answer_0(rid, rc); 662 free(path); 663 return; 664 } 665 666 rwlock_write_lock(&namespace_rwlock); 667 lflag &= L_DIRECTORY; /* sanitize lflag */ 668 vfs_lookup_res_t lr; 669 rc = vfs_lookup_internal(path, len, lflag | L_DESTROY, &lr, NULL); 670 free(path); 671 if (rc != EOK) { 672 rwlock_write_unlock(&namespace_rwlock); 673 ipc_answer_0(rid, rc); 674 return; 675 } 676 677 /* 678 * The name has already been unlinked by vfs_lookup_internal(). 679 * We have to get and put the VFS node to ensure that it is 680 * VFS_FREE'd after the last reference to it is dropped. 681 */ 682 vfs_node_t *node = vfs_node_get(&lr); 683 node->lnkcnt--; 684 rwlock_write_unlock(&namespace_rwlock); 685 vfs_node_put(node); 686 ipc_answer_0(rid, EOK); 687 } 688 632 689 /** 633 690 * @}
Note:
See TracChangeset
for help on using the changeset viewer.