Changeset a35b458 in mainline for uspace/srv/fs/udf/udf_ops.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/udf/udf_ops.c
r3061bc1 ra35b458 75 75 if (rc != EOK) 76 76 return rc; 77 77 78 78 udf_node_t *node; 79 79 rc = udf_idx_get(&node, instance, index); … … 82 82 if (rc != EOK) 83 83 return rc; 84 84 85 85 rc = udf_node_get_core(node); 86 86 if (rc != EOK) { … … 89 89 } 90 90 } 91 91 92 92 *rfn = FS_NODE(node); 93 93 return EOK; … … 100 100 if (rc != EOK) 101 101 return rc; 102 102 103 103 return udf_node_get(rfn, service_id, 104 104 instance->volumes[DEFAULT_VOL].root_dir); … … 110 110 if (udfn) 111 111 return udfn->instance->service_id; 112 112 113 113 return 0; 114 114 } … … 119 119 if (name == NULL) 120 120 return ENOMEM; 121 121 122 122 block_t *block = NULL; 123 123 udf_file_identifier_descriptor_t *fid = NULL; 124 124 size_t pos = 0; 125 125 126 126 while (udf_get_fid(&fid, &block, UDF_NODE(pfn), pos) == EOK) { 127 127 udf_long_ad_t long_ad = fid->icb; 128 128 129 129 udf_to_unix_name(name, MAX_FILE_NAME_LEN, 130 130 (char *) fid->implementation_use + FLE16(fid->lenght_iu), 131 131 fid->lenght_file_id, &UDF_NODE(pfn)->instance->charset); 132 132 133 133 if (str_casecmp(name, component) == 0) { 134 134 errno_t rc = udf_node_get(rfn, udf_service_get(pfn), 135 135 udf_long_ad_to_pos(UDF_NODE(pfn)->instance, &long_ad)); 136 136 137 137 if (block != NULL) 138 138 block_put(block); 139 139 140 140 free(name); 141 141 return rc; 142 142 } 143 143 144 144 if (block != NULL) { 145 145 errno_t rc = block_put(block); … … 147 147 return rc; 148 148 } 149 149 150 150 pos++; 151 151 } 152 152 153 153 free(name); 154 154 return ENOENT; … … 165 165 if (!node) 166 166 return EINVAL; 167 167 168 168 fibril_mutex_lock(&node->lock); 169 169 node->ref_cnt--; 170 170 fibril_mutex_unlock(&node->lock); 171 171 172 172 /* Delete node from hash table and memory */ 173 173 if (!node->ref_cnt) 174 174 udf_idx_del(node); 175 175 176 176 return EOK; 177 177 } … … 208 208 if (node) 209 209 return node->index; 210 210 211 211 return 0; 212 212 } … … 217 217 if (node) 218 218 return node->data_size; 219 219 220 220 return 0; 221 221 } … … 226 226 if (node) 227 227 return node->link_cnt; 228 228 229 229 return 0; 230 230 } … … 235 235 if (node) 236 236 return node->type == NODE_DIR; 237 237 238 238 return false; 239 239 } … … 244 244 if (node) 245 245 return node->type == NODE_FILE; 246 246 247 247 return false; 248 248 } … … 257 257 if (NULL == instance) 258 258 return ENOENT; 259 259 260 260 *size = instance->volumes[DEFAULT_VOL].logical_block_size; 261 261 262 262 return EOK; 263 263 } … … 266 266 { 267 267 *count = 0; 268 268 269 269 return EOK; 270 270 } … … 273 273 { 274 274 *count = 0; 275 275 276 276 return EOK; 277 277 } … … 308 308 { 309 309 enum cache_mode cmode; 310 310 311 311 /* Check for option enabling write through. */ 312 312 if (str_cmp(opts, "wtcache") == 0) … … 314 314 else 315 315 cmode = CACHE_MODE_WB; 316 316 317 317 udf_instance_t *instance = malloc(sizeof(udf_instance_t)); 318 318 if (!instance) 319 319 return ENOMEM; 320 320 321 321 instance->sector_size = 0; 322 322 323 323 /* Check for block size. Will be enhanced later */ 324 324 if (str_cmp(opts, "bs=512") == 0) … … 328 328 else if (str_cmp(opts, "bs=2048") == 0) 329 329 instance->sector_size = 2048; 330 330 331 331 /* initialize block cache */ 332 332 errno_t rc = block_init(service_id, MAX_SIZE); 333 333 if (rc != EOK) 334 334 return rc; 335 335 336 336 rc = fs_instance_create(service_id, instance); 337 337 if (rc != EOK) { … … 340 340 return rc; 341 341 } 342 342 343 343 instance->service_id = service_id; 344 344 instance->open_nodes_count = 0; 345 345 346 346 /* Check Volume Recognition Sequence */ 347 347 rc = udf_volume_recongnition(service_id); … … 353 353 return rc; 354 354 } 355 355 356 356 /* Search for Anchor Volume Descriptor */ 357 357 udf_anchor_volume_descriptor_t avd; … … 364 364 return rc; 365 365 } 366 366 367 367 log_msg(LOG_DEFAULT, LVL_DEBUG, 368 368 "Volume: Anchor volume descriptor found. Sector size=%" PRIu32, … … 376 376 PRIu32 " (sector)]", avd.reserve_extent.length, 377 377 avd.reserve_extent.location); 378 378 379 379 /* Initialize the block cache */ 380 380 rc = block_cache_init(service_id, instance->sector_size, 0, cmode); … … 385 385 return rc; 386 386 } 387 387 388 388 /* Read Volume Descriptor Sequence */ 389 389 rc = udf_read_volume_descriptor_sequence(service_id, avd.main_extent); … … 396 396 return rc; 397 397 } 398 398 399 399 fs_node_t *rfn; 400 400 rc = udf_node_get(&rfn, service_id, instance->volumes[DEFAULT_VOL].root_dir); … … 407 407 return rc; 408 408 } 409 409 410 410 udf_node_t *node = UDF_NODE(rfn); 411 411 *index = instance->volumes[DEFAULT_VOL].root_dir; 412 412 *size = node->data_size; 413 413 414 414 return EOK; 415 415 } … … 421 421 if (rc != EOK) 422 422 return rc; 423 423 424 424 udf_node_t *nodep = UDF_NODE(fn); 425 425 udf_instance_t *instance = nodep->instance; 426 426 427 427 /* 428 428 * We expect exactly two references on the root node. … … 434 434 return EBUSY; 435 435 } 436 436 437 437 /* 438 438 * Put the root node twice. … … 440 440 udf_node_put(fn); 441 441 udf_node_put(fn); 442 442 443 443 fs_instance_destroy(service_id); 444 444 free(instance); 445 445 block_cache_fini(service_id); 446 446 block_fini(service_id); 447 447 448 448 return EOK; 449 449 } … … 456 456 if (rc != EOK) 457 457 return rc; 458 458 459 459 fs_node_t *rfn; 460 460 rc = udf_node_get(&rfn, service_id, index); 461 461 if (rc != EOK) 462 462 return rc; 463 463 464 464 udf_node_t *node = UDF_NODE(rfn); 465 465 466 466 ipc_callid_t callid; 467 467 size_t len = 0; … … 471 471 return EINVAL; 472 472 } 473 473 474 474 if (node->type == NODE_FILE) { 475 475 if (pos >= node->data_size) { … … 479 479 return EOK; 480 480 } 481 481 482 482 size_t read_len = 0; 483 483 if (node->data == NULL) … … 489 489 rc = EOK; 490 490 } 491 491 492 492 *rbytes = read_len; 493 493 (void) udf_node_put(rfn); … … 498 498 if (udf_get_fid(&fid, &block, node, pos) == EOK) { 499 499 char *name = malloc(MAX_FILE_NAME_LEN + 1); 500 500 501 501 // FIXME: Check for NULL return value 502 502 503 503 udf_to_unix_name(name, MAX_FILE_NAME_LEN, 504 504 (char *) fid->implementation_use + FLE16(fid->lenght_iu), 505 505 fid->lenght_file_id, &node->instance->charset); 506 506 507 507 async_data_read_finalize(callid, name, str_size(name) + 1); 508 508 *rbytes = 1; 509 509 free(name); 510 510 udf_node_put(rfn); 511 511 512 512 if (block != NULL) 513 513 return block_put(block); 514 514 515 515 return EOK; 516 516 } else {
Note:
See TracChangeset
for help on using the changeset viewer.