Changeset 61042de in mainline for uspace/srv/vfs/vfs_ops.c
- Timestamp:
- 2017-03-18T20:58:08Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 61600e7
- Parents:
- b7f69f2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
rb7f69f2 r61042de 67 67 size_t res = 0; 68 68 69 while (a[res] == b[res] && a[res] != 0) {69 while (a[res] == b[res] && a[res] != 0) 70 70 res++; 71 } 72 73 if (a[res] == b[res]) { 71 72 if (a[res] == b[res]) 74 73 return res; 75 }76 74 77 75 res--; 78 while (a[res] != '/') {76 while (a[res] != '/') 79 77 res--; 80 }81 78 return res; 82 79 } … … 86 83 { 87 84 async_exch_t *exch = vfs_exchange_grab(file->fs_handle); 88 async_msg_2(exch, VFS_OUT_DESTROY, 89 (sysarg_t) file->service_id,(sysarg_t) file->index);85 async_msg_2(exch, VFS_OUT_DESTROY, (sysarg_t) file->service_id, 86 (sysarg_t) file->index); 90 87 vfs_exchange_release(exch); 91 88 } … … 95 92 /* Lookup the file structure corresponding to fd. */ 96 93 vfs_file_t *oldfile = vfs_file_get(oldfd); 97 if (oldfile == NULL) {98 return EBADF; 99 } 94 if (oldfile == NULL) 95 return EBADF; 96 100 97 assert(oldfile->node != NULL); 101 98 … … 122 119 { 123 120 /* If the file descriptors are the same, do nothing. */ 124 if (oldfd == newfd) {121 if (oldfd == newfd) 125 122 return EOK; 126 }127 123 128 124 /* Lookup the file structure corresponding to oldfd. */ 129 125 vfs_file_t *oldfile = vfs_file_get(oldfd); 130 if (!oldfile) { 131 return EBADF; 132 } 126 if (!oldfile) 127 return EBADF; 133 128 134 129 /* Make sure newfd is closed. */ … … 145 140 { 146 141 vfs_file_t *file = vfs_file_get(fd); 147 if (!file) {148 return EBADF; 149 } 142 if (!file) 143 return EBADF; 144 150 145 assert(file->node); 151 146 … … 182 177 183 178 fibril_mutex_lock(&fs_list_lock); 184 while ( 1) {179 while (true) { 185 180 fs_handle = fs_name_to_handle(instance, fsname, false); 186 181 187 if (fs_handle != 0 || !(flags & VFS_MOUNT_BLOCKING)) {182 if (fs_handle != 0 || !(flags & VFS_MOUNT_BLOCKING)) 188 183 break; 189 }190 184 191 185 fibril_condvar_wait(&fs_list_cv, &fs_list_lock); … … 193 187 fibril_mutex_unlock(&fs_list_lock); 194 188 195 if (fs_handle == 0) {189 if (fs_handle == 0) 196 190 return ENOENT; 197 }198 191 199 192 /* Tell the mountee that it is being mounted. */ … … 212 205 vfs_exchange_release(exch); 213 206 214 if (rc != EOK) {207 if (rc != EOK) 215 208 return rc; 216 }217 209 218 210 vfs_lookup_res_t res; … … 284 276 fibril_rwlock_write_unlock(&namespace_rwlock); 285 277 286 if (rc != EOK) {278 if (rc != EOK) 287 279 goto out; 288 }289 280 290 281 if (flags & VFS_MOUNT_NO_REF) { … … 300 291 301 292 out: 302 if (mp) {293 if (mp) 303 294 vfs_file_put(mp); 304 } 305 if (file) { 306 vfs_file_put(file); 307 } 295 if (file) 296 vfs_file_put(file); 297 308 298 if (rc != EOK && fd >= 0) { 309 299 vfs_fd_free(fd); … … 317 307 int vfs_op_open2(int fd, int flags) 318 308 { 319 if (flags == 0) {309 if (flags == 0) 320 310 return EINVAL; 321 }322 311 323 312 vfs_file_t *file = vfs_file_get(fd); 324 if (!file) { 325 return EBADF; 326 } 313 if (!file) 314 return EBADF; 327 315 328 316 if ((flags & ~file->permissions) != 0) { … … 454 442 * write implementation does not modify the file size. 455 443 */ 456 if (rlock) {444 if (rlock) 457 445 fibril_rwlock_read_lock(&file->node->contents_rwlock); 458 } else {446 else 459 447 fibril_rwlock_write_lock(&file->node->contents_rwlock); 460 }461 448 462 449 if (file->node->type == VFS_NODE_DIRECTORY) { … … 496 483 size_t bytes = IPC_GET_ARG1(answer); 497 484 498 if (file->node->type == VFS_NODE_DIRECTORY) {485 if (file->node->type == VFS_NODE_DIRECTORY) 499 486 fibril_rwlock_read_unlock(&namespace_rwlock); 500 }501 487 502 488 /* Unlock the VFS node. */ … … 513 499 514 500 /* Update the position pointer and unlock the open file. */ 515 if (rc == EOK) {501 if (rc == EOK) 516 502 file->pos += bytes; 517 }518 503 vfs_file_put(file); 519 504 … … 534 519 { 535 520 vfs_file_t *base_file = vfs_file_get(basefd); 536 if (!base_file) {537 return EBADF; 538 } 521 if (!base_file) 522 return EBADF; 523 539 524 vfs_node_t *base = base_file->node; 540 525 vfs_node_addref(base); … … 577 562 } 578 563 579 rc = vfs_lookup_internal(base, old, L_DISABLE_MOUNTS, 580 &old_lr); 564 rc = vfs_lookup_internal(base, old, L_DISABLE_MOUNTS, &old_lr); 581 565 if (rc != EOK) { 582 566 vfs_node_put(base); … … 598 582 if (rc != EOK) { 599 583 vfs_link_internal(base, old, &old_lr.triplet); 600 if (orig_unlinked) {584 if (orig_unlinked) 601 585 vfs_link_internal(base, new, &new_lr_orig.triplet); 602 }603 586 vfs_node_put(base); 604 587 fibril_rwlock_write_unlock(&namespace_rwlock); … … 609 592 &old_lr); 610 593 if (rc != EOK) { 611 if (orig_unlinked) {594 if (orig_unlinked) 612 595 vfs_link_internal(base, new, &new_lr_orig.triplet); 613 }614 596 vfs_node_put(base); 615 597 fibril_rwlock_write_unlock(&namespace_rwlock); … … 634 616 { 635 617 vfs_file_t *file = vfs_file_get(fd); 636 if (!file) { 637 return EBADF; 638 } 618 if (!file) 619 return EBADF; 639 620 640 621 switch (whence) { … … 724 705 { 725 706 vfs_file_t *file = vfs_file_get(fd); 726 if (!file) { 727 return EBADF; 728 } 707 if (!file) 708 return EBADF; 729 709 730 710 async_exch_t *fs_exch = vfs_exchange_grab(file->node->fs_handle); … … 733 713 ipc_call_t answer; 734 714 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node->service_id, 735 715 file->node->index, &answer); 736 716 737 717 vfs_exchange_release(fs_exch); … … 760 740 { 761 741 vfs_file_t *file = vfs_file_get(fd); 762 if (!file) { 763 return EBADF; 764 } 742 if (!file) 743 return EBADF; 765 744 766 745 fibril_rwlock_write_lock(&file->node->contents_rwlock); 767 746 768 747 int rc = vfs_truncate_internal(file->node->fs_handle, 769 770 if (rc == EOK) {748 file->node->service_id, file->node->index, size); 749 if (rc == EOK) 771 750 file->node->size = size; 772 }773 751 774 752 fibril_rwlock_write_unlock(&file->node->contents_rwlock); … … 783 761 vfs_file_t *expect = NULL; 784 762 785 if (parentfd == expectfd) {763 if (parentfd == expectfd) 786 764 return EINVAL; 787 }788 765 789 766 fibril_rwlock_write_lock(&namespace_rwlock); 790 767 791 int lflag = (wflag &WALK_DIRECTORY) ? L_DIRECTORY: 0;768 int lflag = (wflag & WALK_DIRECTORY) ? L_DIRECTORY: 0; 792 769 793 770 /* … … 824 801 vfs_lookup_res_t lr; 825 802 rc = vfs_lookup_internal(parent->node, path, lflag, &lr); 826 if (rc != EOK) {803 if (rc != EOK) 827 804 goto exit; 828 }829 805 830 806 vfs_node_t *found_node = vfs_node_peek(&lr); … … 841 817 vfs_lookup_res_t lr; 842 818 rc = vfs_lookup_internal(parent->node, path, lflag | L_UNLINK, &lr); 843 if (rc != EOK) {819 if (rc != EOK) 844 820 goto exit; 845 }846 821 847 822 /* If the node is not held by anyone, try to destroy it. */ … … 853 828 854 829 exit: 855 if (path) {830 if (path) 856 831 free(path); 857 } 858 if (parent) { 832 if (parent) 859 833 vfs_file_put(parent); 860 } 861 if (expect) { 834 if (expect) 862 835 vfs_file_put(expect); 863 }864 836 fibril_rwlock_write_unlock(&namespace_rwlock); 865 837 return rc; … … 869 841 { 870 842 vfs_file_t *mp = vfs_file_get(mpfd); 871 if (mp == NULL) { 872 return EBADF; 873 } 843 if (mp == NULL) 844 return EBADF; 874 845 875 846 if (mp->node->mount == NULL) { … … 922 893 static inline bool walk_flags_valid(int flags) 923 894 { 924 if ((flags & ~WALK_ALL_FLAGS) != 0) {895 if ((flags & ~WALK_ALL_FLAGS) != 0) 925 896 return false; 926 } 927 if ((flags & WALK_MAY_CREATE) && (flags & WALK_MUST_CREATE)) { 897 if ((flags & WALK_MAY_CREATE) && (flags & WALK_MUST_CREATE)) 928 898 return false; 929 } 930 if ((flags & WALK_REGULAR) && (flags & WALK_DIRECTORY)) { 899 if ((flags & WALK_REGULAR) && (flags & WALK_DIRECTORY)) 931 900 return false; 932 }933 901 if ((flags & WALK_MAY_CREATE) || (flags & WALK_MUST_CREATE)) { 934 if (!(flags & WALK_DIRECTORY) && !(flags & WALK_REGULAR)) {902 if (!(flags & WALK_DIRECTORY) && !(flags & WALK_REGULAR)) 935 903 return false; 936 }937 904 } 938 905 return true; … … 942 909 { 943 910 int lflags = 0; 944 if ((flags & WALK_MAY_CREATE) || (flags & WALK_MUST_CREATE)) {911 if ((flags & WALK_MAY_CREATE) || (flags & WALK_MUST_CREATE)) 945 912 lflags |= L_CREATE; 946 } 947 if (flags & WALK_MUST_CREATE) { 913 if (flags & WALK_MUST_CREATE) 948 914 lflags |= L_EXCLUSIVE; 949 } 950 if (flags & WALK_REGULAR) { 915 if (flags & WALK_REGULAR) 951 916 lflags |= L_FILE; 952 } 953 if (flags & WALK_DIRECTORY) { 917 if (flags & WALK_DIRECTORY) 954 918 lflags |= L_DIRECTORY; 955 } 956 if (flags & WALK_MOUNT_POINT) { 919 if (flags & WALK_MOUNT_POINT) 957 920 lflags |= L_MP; 958 }959 921 return lflags; 960 922 } … … 962 924 int vfs_op_walk(int parentfd, int flags, char *path, int *out_fd) 963 925 { 964 if (!walk_flags_valid(flags)) {926 if (!walk_flags_valid(flags)) 965 927 return EINVAL; 966 }967 928 968 929 vfs_file_t *parent = vfs_file_get(parentfd); 969 if (!parent) { 970 return EBADF; 971 } 930 if (!parent) 931 return EBADF; 972 932 973 933 fibril_rwlock_read_lock(&namespace_rwlock);
Note:
See TracChangeset
for help on using the changeset viewer.