Changeset 61042de in mainline for uspace/lib/c/generic/vfs/vfs.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/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 407 408 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;
Note:
See TracChangeset
for help on using the changeset viewer.