Changeset 61042de in mainline
- 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
- Location:
- uspace
- Files:
-
- 8 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; -
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); -
uspace/srv/fs/fat/fat.h
rb7f69f2 r61042de 41 41 #include <sys/types.h> 42 42 #include <stdbool.h> 43 #include <macros.h> 43 44 #include "../../vfs/vfs.h" 44 45 … … 46 47 #define dprintf(...) printf(__VA_ARGS__) 47 48 #endif 48 49 #define min(a, b) ((a) < (b) ? (a) : (b))50 49 51 50 /* -
uspace/srv/fs/mfs/mfs.h
rb7f69f2 r61042de 45 45 #include <assert.h> 46 46 #include <stdbool.h> 47 #include <macros.h> 47 48 #include "../../vfs/vfs.h" 48 49 … … 50 51 51 52 /* #define DEBUG_MODE */ 52 53 #define min(a, b) ((a) < (b) ? (a) : (b))54 53 55 54 #ifdef DEBUG_MODE -
uspace/srv/fs/tmpfs/tmpfs_ops.c
rb7f69f2 r61042de 54 54 #include <libfs.h> 55 55 56 #define min(a, b) ((a) < (b) ? (a) : (b))57 #define max(a, b) ((a) > (b) ? (a) : (b))58 59 56 /** All root nodes have index 0. */ 60 57 #define TMPFS_SOME_ROOT 0 -
uspace/srv/vfs/vfs_lookup.c
rb7f69f2 r61042de 49 49 #include <assert.h> 50 50 51 #define DPRINTF(...)52 53 #define min(a, b) ((a) < (b) ? (a) : (b))54 55 51 FIBRIL_MUTEX_INITIALIZE(plb_mutex); 56 52 LIST_INITIALIZE(plb_entries); /**< PLB entry ring buffer. */ 57 53 uint8_t *plb = NULL; 58 54 59 static int plb_insert_entry(plb_entry_t *entry, char *path, size_t *start, size_t len) 55 static int plb_insert_entry(plb_entry_t *entry, char *path, size_t *start, 56 size_t len) 60 57 { 61 58 fibril_mutex_lock(&plb_mutex); … … 174 171 175 172 rc = vfs_lookup_internal(base, path, L_DIRECTORY, &res); 176 if (rc != EOK) {173 if (rc != EOK) 177 174 goto out; 178 }179 175 triplet = &res.triplet; 180 176 … … 190 186 } 191 187 192 if (triplet->fs_handle != child->fs_handle || triplet->service_id != child->service_id) { 188 if (triplet->fs_handle != child->fs_handle || 189 triplet->service_id != child->service_id) { 193 190 rc = EXDEV; 194 191 goto out; … … 196 193 197 194 async_exch_t *exch = vfs_exchange_grab(triplet->fs_handle); 198 aid_t req = async_send_3(exch, VFS_OUT_LINK, triplet->service_id, triplet->index, child->index, NULL); 195 aid_t req = async_send_3(exch, VFS_OUT_LINK, triplet->service_id, 196 triplet->index, child->index, NULL); 199 197 200 198 rc = async_data_write_start(exch, component, str_size(component) + 1); … … 202 200 async_wait_for(req, &orig_rc); 203 201 vfs_exchange_release(exch); 204 if (orig_rc != EOK) {202 if (orig_rc != EOK) 205 203 rc = orig_rc; 206 }207 204 208 205 out: 209 DPRINTF("vfs_link_internal() with path '%s' returns %d\n", path, rc);210 206 return rc; 211 207 } 212 208 213 209 static int out_lookup(vfs_triplet_t *base, size_t *pfirst, size_t *plen, 214 210 int lflag, vfs_lookup_res_t *result) 215 211 { 216 212 assert(base); … … 220 216 ipc_call_t answer; 221 217 async_exch_t *exch = vfs_exchange_grab(base->fs_handle); 222 aid_t req = async_send_5(exch, VFS_OUT_LOOKUP, (sysarg_t) *pfirst, (sysarg_t) *plen, 223 (sysarg_t) base->service_id, (sysarg_t) base->index, (sysarg_t) lflag, &answer); 218 aid_t req = async_send_5(exch, VFS_OUT_LOOKUP, (sysarg_t) *pfirst, 219 (sysarg_t) *plen, (sysarg_t) base->service_id, 220 (sysarg_t) base->index, (sysarg_t) lflag, &answer); 224 221 async_wait_for(req, &rc); 225 222 vfs_exchange_release(exch); 226 223 227 if ((int) rc < 0) {224 if ((int) rc < 0) 228 225 return (int) rc; 229 }230 226 231 227 unsigned last = *pfirst + *plen; … … 237 233 result->triplet.index = (fs_index_t) IPC_GET_ARG2(answer); 238 234 result->size = (int64_t)(int32_t) IPC_GET_ARG4(answer); 239 result->type = IPC_GET_ARG5(answer) ? VFS_NODE_DIRECTORY : VFS_NODE_FILE; 235 result->type = IPC_GET_ARG5(answer) ? 236 VFS_NODE_DIRECTORY : VFS_NODE_FILE; 240 237 return EOK; 241 238 } … … 253 250 * 254 251 */ 255 int vfs_lookup_internal(vfs_node_t *base, char *path, int lflag, vfs_lookup_res_t *result) 252 int vfs_lookup_internal(vfs_node_t *base, char *path, int lflag, 253 vfs_lookup_res_t *result) 256 254 { 257 255 assert(base != NULL); … … 262 260 char *npath = canonify(path, &len); 263 261 if (!npath) { 264 DPRINTF("vfs_lookup_internal() can't canonify path: %s\n", path);265 262 rc = EINVAL; 266 263 return rc; … … 274 271 plb_entry_t entry; 275 272 rc = plb_insert_entry(&entry, path, &first, len); 276 if (rc != EOK) { 277 DPRINTF("vfs_lookup_internal() can't insert entry into PLB: %d\n", rc); 273 if (rc != EOK) 278 274 return rc; 279 }280 275 281 276 size_t next = first; … … 286 281 /* Resolve path as long as there are mount points to cross. */ 287 282 while (nlen > 0) { 288 while (base->mount != NULL) {283 while (base->mount) { 289 284 if (lflag & L_DISABLE_MOUNTS) { 290 285 rc = EXDEV; … … 295 290 } 296 291 297 rc = out_lookup((vfs_triplet_t *) base, &next, &nlen, lflag, &res); 298 if (rc != EOK) { 292 rc = out_lookup((vfs_triplet_t *) base, &next, &nlen, lflag, 293 &res); 294 if (rc != EOK) 299 295 goto out; 300 }301 296 302 297 if (nlen > 0) { … … 349 344 out: 350 345 plb_clear_entry(&entry, first, len); 351 DPRINTF("vfs_lookup_internal() with path '%s' returns %d\n", path, rc);352 346 return rc; 353 347 } -
uspace/srv/vfs/vfs_node.c
rb7f69f2 r61042de 113 113 node->refcnt--; 114 114 if (node->refcnt == 0) { 115 116 115 /* 117 116 * We are dropping the last reference to this node. … … 127 126 if (free_node) { 128 127 /* 129 * DESTROY will free up the file's resources if there are no more hard links. 128 * VFS_OUT_DESTROY will free up the file's resources if there 129 * are no more hard links. 130 130 */ 131 131 132 132 async_exch_t *exch = vfs_exchange_grab(node->fs_handle); 133 async_msg_2(exch, VFS_OUT_DESTROY, 134 (sysarg_t) node->service_id,(sysarg_t)node->index);133 async_msg_2(exch, VFS_OUT_DESTROY, (sysarg_t) node->service_id, 134 (sysarg_t)node->index); 135 135 vfs_exchange_release(exch); 136 136 … … 300 300 vfs_triplet_t *tri = key; 301 301 vfs_node_t *node = hash_table_get_inst(item, vfs_node_t, nh_link); 302 return node->fs_handle == tri->fs_handle 303 && node->service_id == tri->service_id 304 && node->index == tri->index; 302 return node->fs_handle == tri->fs_handle && 303 node->service_id == tri->service_id && node->index == tri->index; 305 304 } 306 305 … … 323 322 324 323 async_exch_t *exch = vfs_exchange_grab(node->fs_handle); 325 (void) async_req_2_2(exch, VFS_OUT_GET_SIZE, 326 node->service_id,node->index, &sz1, &sz2);324 (void) async_req_2_2(exch, VFS_OUT_GET_SIZE, node->service_id, 325 node->index, &sz1, &sz2); 327 326 vfs_exchange_release(exch); 328 327 … … 335 334 { 336 335 async_exch_t *exch = vfs_exchange_grab(node->fs_handle); 337 int rc = async_req_2_0(exch, VFS_OUT_IS_EMPTY, node->service_id, node->index); 336 int rc = async_req_2_0(exch, VFS_OUT_IS_EMPTY, node->service_id, 337 node->index); 338 338 vfs_exchange_release(exch); 339 339 return rc == ENOTEMPTY; -
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.