Changeset 61042de in mainline for uspace/lib
- Timestamp:
- 2017-03-18T20:58:08Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 61600e7
- Parents:
- b7f69f2
- Location:
- uspace/lib
- Files:
-
- 2 edited
-
c/generic/vfs/vfs.c (modified) (22 diffs)
-
fs/libfs.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/vfs/vfs.c
rb7f69f2 r61042de 73 73 fibril_mutex_lock(&root_mutex); 74 74 int r; 75 if (root_fd < 0) {75 if (root_fd < 0) 76 76 r = ENOENT; 77 } else {77 else 78 78 r = vfs_clone(root_fd, true); 79 }80 79 fibril_mutex_unlock(&root_mutex); 81 80 return r; … … 85 84 { 86 85 fibril_mutex_lock(&root_mutex); 87 if (root_fd >= 0) {86 if (root_fd >= 0) 88 87 close(root_fd); 89 }90 88 root_fd = vfs_clone(nroot, true); 91 89 fibril_mutex_unlock(&root_mutex); … … 101 99 fibril_mutex_lock(&vfs_mutex); 102 100 103 while (vfs_sess == NULL) 101 while (vfs_sess == NULL) { 104 102 vfs_sess = service_connect_blocking(SERVICE_VFS, INTERFACE_VFS, 105 103 0); 104 } 106 105 107 106 fibril_mutex_unlock(&vfs_mutex); … … 132 131 async_wait_for(req, &rc_orig); 133 132 134 if (rc_orig != EOK) {133 if (rc_orig != EOK) 135 134 return (int) rc_orig; 136 }137 135 138 if (rc != EOK) {136 if (rc != EOK) 139 137 return (int) rc; 140 }141 138 142 139 return (int) IPC_GET_ARG1(answer); … … 147 144 size_t size; 148 145 char *p = vfs_absolutize(path, &size); 149 if (!p) {146 if (!p) 150 147 return ENOMEM; 151 }152 148 int root = vfs_root(); 153 149 if (root < 0) { … … 221 217 222 218 int vfs_mount(int mp, const char *fs_name, service_id_t serv, const char *opts, 223 unsigned int flags, unsigned int instance, int *mountedfd)219 unsigned int flags, unsigned int instance, int *mountedfd) 224 220 { 225 221 sysarg_t rc, rc1; 226 222 227 if (!mountedfd) {223 if (!mountedfd) 228 224 flags |= VFS_MOUNT_NO_REF; 229 } 230 if (mp < 0) { 225 if (mp < 0) 231 226 flags |= VFS_MOUNT_CONNECT_ONLY; 232 }233 227 234 228 ipc_call_t answer; 235 229 async_exch_t *exch = vfs_exchange_begin(); 236 aid_t req = async_send_4(exch, VFS_IN_MOUNT, mp, serv, flags, instance, &answer); 230 aid_t req = async_send_4(exch, VFS_IN_MOUNT, mp, serv, flags, instance, 231 &answer); 237 232 238 233 rc1 = async_data_write_start(exch, (void *) opts, str_size(opts)); 239 234 240 235 if (rc1 == EOK) { 241 rc1 = async_data_write_start(exch, (void *) fs_name, str_size(fs_name)); 236 rc1 = async_data_write_start(exch, (void *) fs_name, 237 str_size(fs_name)); 242 238 } 243 239 … … 246 242 async_wait_for(req, &rc); 247 243 248 if (mountedfd) {244 if (mountedfd) 249 245 *mountedfd = (int) IPC_GET_ARG1(answer); 250 } 251 252 if (rc != EOK) { 246 247 if (rc != EOK) 253 248 return rc; 254 }255 249 return rc1; 256 250 } … … 271 265 272 266 if (str_cmp(fqsn, "") == 0) { 273 /* No device specified, create a fresh 274 null/%d device instead */ 267 /* 268 * No device specified, create a fresh null/%d device instead. 269 */ 275 270 null_id = loc_null_create(); 276 271 … … 282 277 } 283 278 284 if (flags & IPC_FLAG_BLOCKING) {279 if (flags & IPC_FLAG_BLOCKING) 285 280 flags = VFS_MOUNT_BLOCKING; 286 } else {281 else 287 282 flags = 0; 288 }289 283 290 284 service_id_t service_id; … … 315 309 if (root_fd >= 0) { 316 310 fibril_mutex_unlock(&root_mutex); 317 if (null_id != -1) {311 if (null_id != -1) 318 312 loc_null_destroy(null_id); 319 }320 313 return EBUSY; 321 314 } 322 315 323 316 int root; 324 rc = vfs_mount(-1, fs_name, service_id, opts, flags, instance, &root); 325 if (rc == EOK) { 317 rc = vfs_mount(-1, fs_name, service_id, opts, flags, instance, 318 &root); 319 if (rc == EOK) 326 320 root_fd = root; 327 }328 321 } else { 329 322 if (root_fd < 0) { 330 323 fibril_mutex_unlock(&root_mutex); 331 if (null_id != -1) {324 if (null_id != -1) 332 325 loc_null_destroy(null_id); 333 }334 326 return EINVAL; 335 327 } … … 337 329 int mpfd = _vfs_walk(root_fd, mpa, WALK_DIRECTORY); 338 330 if (mpfd >= 0) { 339 rc = vfs_mount(mpfd, fs_name, service_id, opts, flags, instance, NULL); 331 rc = vfs_mount(mpfd, fs_name, service_id, opts, flags, 332 instance, NULL); 340 333 close(mpfd); 341 334 } else { … … 355 348 { 356 349 int mp = vfs_lookup(mpp, WALK_MOUNT_POINT | WALK_DIRECTORY); 357 if (mp < 0) {350 if (mp < 0) 358 351 return mp; 359 }360 352 361 353 int rc = vfs_unmount(mp); … … 368 360 int flags = 0; 369 361 if (oflags & O_CREAT) { 370 if (oflags & O_EXCL) {362 if (oflags & O_EXCL) 371 363 flags |= WALK_MUST_CREATE; 372 } else {364 else 373 365 flags |= WALK_MAY_CREATE; 374 }375 366 } 376 367 return flags; … … 403 394 404 395 int mode = 405 ((oflag & O_RDWR) ? MODE_READ|MODE_WRITE : 0) |406 ((oflag & O_RDONLY) ? MODE_READ : 0) |407 ((oflag & O_WRONLY) ? MODE_WRITE : 0) |408 ((oflag & O_APPEND) ? MODE_APPEND : 0);396 ((oflag & O_RDWR) ? MODE_READ | MODE_WRITE : 0) | 397 ((oflag & O_RDONLY) ? MODE_READ : 0) | 398 ((oflag & O_WRONLY) ? MODE_WRITE : 0) | 399 ((oflag & O_APPEND) ? MODE_APPEND : 0); 409 400 410 401 int rc = _vfs_open(fd, mode); … … 476 467 vfs_exchange_end(exch); 477 468 478 if (rc == EOK) {469 if (rc == EOK) 479 470 async_wait_for(req, &rc); 480 } else {471 else 481 472 async_forget(req); 482 }483 473 484 474 if (rc != EOK) … … 518 508 vfs_exchange_end(exch); 519 509 520 if (rc == EOK) {510 if (rc == EOK) 521 511 async_wait_for(req, &rc); 522 } else {512 else 523 513 async_forget(req); 524 }525 514 526 515 if (rc != EOK) … … 850 839 async_wait_for(req, &rc_orig); 851 840 852 if (rc_orig != EOK) {841 if (rc_orig != EOK) 853 842 return (int) rc_orig; 854 }855 843 return rc; 856 844 } … … 911 899 912 900 int rc = _vfs_unlink2(root, pa, -1, WALK_DIRECTORY); 913 914 901 if (rc != EOK) { 915 902 errno = rc; … … 1037 1024 fibril_mutex_lock(&cwd_mutex); 1038 1025 1039 if (cwd_fd >= 0) {1026 if (cwd_fd >= 0) 1040 1027 close(cwd_fd); 1041 } 1042 1043 if (cwd_path) { 1028 1029 if (cwd_path) 1044 1030 free(cwd_path); 1045 }1046 1031 1047 1032 cwd_fd = fd; … … 1248 1233 int vfs_pass_handle(async_exch_t *vfs_exch, int file, async_exch_t *exch) 1249 1234 { 1250 return async_state_change_start(exch, VFS_PASS_HANDLE, (sysarg_t)file, 0, vfs_exch); 1235 return async_state_change_start(exch, VFS_PASS_HANDLE, (sysarg_t) file, 1236 0, vfs_exch); 1251 1237 } 1252 1238 … … 1264 1250 1265 1251 sysarg_t ret; 1266 sysarg_t rc = async_req_1_1(vfs_exch, VFS_IN_WAIT_HANDLE, high_descriptor, &ret); 1252 sysarg_t rc = async_req_1_1(vfs_exch, VFS_IN_WAIT_HANDLE, 1253 high_descriptor, &ret); 1267 1254 1268 1255 async_exchange_end(vfs_exch); 1269 1256 1270 if (rc != EOK) {1257 if (rc != EOK) 1271 1258 return rc; 1272 }1273 1259 return ret; 1274 1260 } … … 1277 1263 { 1278 1264 async_exch_t *vfs_exch = vfs_exchange_begin(); 1279 int rc = async_req_2_0(vfs_exch, VFS_IN_CLONE, (sysarg_t) file, (sysarg_t) high_descriptor); 1265 int rc = async_req_2_0(vfs_exch, VFS_IN_CLONE, (sysarg_t) file, 1266 (sysarg_t) high_descriptor); 1280 1267 vfs_exchange_end(vfs_exch); 1281 1268 return rc; -
uspace/lib/fs/libfs.c
rb7f69f2 r61042de 79 79 static void libfs_open_node(libfs_ops_t *, fs_handle_t, ipc_callid_t, 80 80 ipc_call_t *); 81 static void libfs_statfs(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *); 81 static void libfs_statfs(libfs_ops_t *, fs_handle_t, ipc_callid_t, 82 ipc_call_t *); 82 83 83 84 static void vfs_out_mounted(ipc_callid_t rid, ipc_call_t *req) … … 157 158 rc = vfs_out_ops->write(service_id, index, pos, &wbytes, &nsize); 158 159 159 if (rc == EOK) 160 async_answer_3(rid, EOK, wbytes, LOWER32(nsize), UPPER32(nsize)); 161 else 160 if (rc == EOK) { 161 async_answer_3(rid, EOK, wbytes, LOWER32(nsize), 162 UPPER32(nsize)); 163 } else 162 164 async_answer_0(rid, rc); 163 165 } … … 198 200 bool destroy = (libfs_ops->lnkcnt_get(node) == 0); 199 201 libfs_ops->node_put(node); 200 if (destroy) {202 if (destroy) 201 203 rc = vfs_out_ops->destroy(service_id, index); 202 }203 204 } 204 205 async_answer_0(rid, rc); … … 239 240 fs_node_t *node = NULL; 240 241 rc = libfs_ops->node_get(&node, service_id, index); 241 if (rc != EOK) {242 if (rc != EOK) 242 243 async_answer_0(rid, rc); 243 } 244 if (node == NULL) { 244 if (node == NULL) 245 245 async_answer_0(rid, EINVAL); 246 }247 246 248 247 uint64_t size = libfs_ops->size_get(node); … … 260 259 fs_node_t *node = NULL; 261 260 rc = libfs_ops->node_get(&node, service_id, index); 262 if (rc != EOK) {261 if (rc != EOK) 263 262 async_answer_0(rid, rc); 264 } 265 if (node == NULL) { 263 if (node == NULL) 266 264 async_answer_0(rid, EINVAL); 267 }268 265 269 266 bool children = false; … … 271 268 libfs_ops->node_put(node); 272 269 273 if (rc != EOK) {270 if (rc != EOK) 274 271 async_answer_0(rid, rc); 275 }276 272 async_answer_0(rid, children ? ENOTEMPTY : EOK); 277 273 } … … 445 441 } 446 442 447 static int plb_get_component(char *dest, unsigned *sz, unsigned *ppos, unsigned last) 443 static int plb_get_component(char *dest, unsigned *sz, unsigned *ppos, 444 unsigned last) 448 445 { 449 446 unsigned pos = *ppos; … … 456 453 457 454 char c = plb_get_char(pos); 458 if (c == '/') {455 if (c == '/') 459 456 pos++; 460 }461 457 462 458 for (int i = 0; i <= NAME_MAX; i++) { … … 480 476 ipc_callid_t wcall; 481 477 482 if (!async_data_write_receive(&wcall, &size)) {478 if (!async_data_write_receive(&wcall, &size)) 483 479 return ENOENT; 484 }485 480 if (size > NAME_MAX + 1) { 486 481 async_answer_0(wcall, ERANGE); … … 492 487 /** Link a file at a path. 493 488 */ 494 void libfs_link(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, ipc_call_t *req) 489 void libfs_link(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, 490 ipc_call_t *req) 495 491 { 496 492 service_id_t parent_sid = IPC_GET_ARG1(*req); … … 658 654 int64_t size = ops->size_get(cur); 659 655 int32_t lsize = LOWER32(size); 660 if (lsize != size) {656 if (lsize != size) 661 657 lsize = -1; 662 }663 658 664 659 async_answer_5(rid, fs_handle, service_id, … … 680 675 681 676 if (!cur) { 682 rc = ops->create(&cur, service_id, lflag & (L_FILE|L_DIRECTORY)); 677 rc = ops->create(&cur, service_id, 678 lflag & (L_FILE | L_DIRECTORY)); 683 679 if (rc != EOK) { 684 680 async_answer_0(rid, rc); … … 703 699 out1: 704 700 if (!cur) { 705 async_answer_5(rid, fs_handle, service_id, 706 ops->index_get(par),last_next, -1, true);701 async_answer_5(rid, fs_handle, service_id, ops->index_get(par), 702 last_next, -1, true); 707 703 goto out; 708 704 } … … 718 714 int64_t size = ops->size_get(cur); 719 715 int32_t lsize = LOWER32(size); 720 if (lsize != size) {716 if (lsize != size) 721 717 lsize = -1; 722 }723 718 724 719 async_answer_5(rid, fs_handle, service_id, ops->index_get(cur), last, … … 726 721 727 722 out: 728 if (par) {723 if (par) 729 724 (void) ops->node_put(par); 730 } 731 732 if (cur) { 725 726 if (cur) 733 727 (void) ops->node_put(cur); 734 } 735 736 if (tmp) { 728 729 if (tmp) 737 730 (void) ops->node_put(tmp); 738 }739 731 } 740 732 … … 857 849 async_answer_4(rid, rc, LOWER32(size), UPPER32(size), 858 850 ops->lnkcnt_get(fn), 859 (ops->is_file(fn) ? L_FILE : 0) | (ops->is_directory(fn) ? L_DIRECTORY : 0)); 851 (ops->is_file(fn) ? L_FILE : 0) | 852 (ops->is_directory(fn) ? L_DIRECTORY : 0)); 860 853 861 854 (void) ops->node_put(fn);
Note:
See TracChangeset
for help on using the changeset viewer.
