Changeset 15d0046 in mainline for uspace/lib/block/block.c
- Timestamp:
- 2014-09-12T13:22:33Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9b20126
- Parents:
- 8db09e4 (diff), 105d8d6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/block/block.c
r8db09e4 r15d0046 55 55 #include "block.h" 56 56 57 #define MAX_WRITE_RETRIES 10 58 57 59 /** Lock protecting the device connection list */ 58 60 static FIBRIL_MUTEX_INITIALIZE(dcl_lock); … … 79 81 void *bb_buf; 80 82 aoff64_t bb_addr; 83 aoff64_t pblocks; /**< Number of physical blocks */ 81 84 size_t pblock_size; /**< Physical block size. */ 82 85 cache_t *cache; … … 103 106 104 107 static int devcon_add(service_id_t service_id, async_sess_t *sess, 105 size_t bsize, bd_t *bd)108 size_t bsize, aoff64_t dev_size, bd_t *bd) 106 109 { 107 110 devcon_t *devcon; … … 118 121 devcon->bb_addr = 0; 119 122 devcon->pblock_size = bsize; 123 devcon->pblocks = dev_size; 120 124 devcon->cache = NULL; 121 125 … … 164 168 return rc; 165 169 } 166 167 rc = devcon_add(service_id, sess, bsize, bd); 170 171 aoff64_t dev_size; 172 rc = bd_get_num_blocks(bd, &dev_size); 168 173 if (rc != EOK) { 169 174 bd_close(bd); … … 172 177 } 173 178 179 rc = devcon_add(service_id, sess, bsize, dev_size, bd); 180 if (rc != EOK) { 181 bd_close(bd); 182 async_hangup(sess); 183 return rc; 184 } 185 174 186 return EOK; 175 187 } … … 182 194 if (devcon->cache) 183 195 (void) block_cache_fini(service_id); 196 197 (void)bd_sync_cache(devcon->bd, 0, 0); 184 198 185 199 devcon_remove(devcon); … … 349 363 fibril_mutex_initialize(&b->lock); 350 364 b->refcnt = 1; 365 b->write_failures = 0; 351 366 b->dirty = false; 352 367 b->toxic = false; … … 373 388 block_t *b; 374 389 link_t *link; 375 390 aoff64_t p_ba; 376 391 int rc; 377 392 … … 382 397 383 398 cache = devcon->cache; 399 400 /* Check whether the logical block (or part of it) is beyond 401 * the end of the device or not. 402 */ 403 p_ba = ba_ltop(devcon, ba); 404 p_ba += cache->blocks_cluster; 405 if (p_ba >= devcon->pblocks) { 406 /* This request cannot be satisfied */ 407 return EIO; 408 } 409 384 410 385 411 retry: … … 458 484 * another block next time. 459 485 */ 460 fibril_mutex_unlock(&b->lock); 461 goto retry; 462 } 486 if (b->write_failures < MAX_WRITE_RETRIES) { 487 b->write_failures++; 488 fibril_mutex_unlock(&b->lock); 489 goto retry; 490 } else { 491 printf("Too many errors writing block %" 492 PRIuOFF64 "from device handle %" PRIun "\n" 493 "SEVERE DATA LOSS POSSIBLE\n", 494 b->lba, devcon->service_id); 495 } 496 } else 497 b->write_failures = 0; 498 463 499 b->dirty = false; 464 500 if (!fibril_mutex_trylock(&cache->lock)) { … … 577 613 rc = write_blocks(devcon, block->pba, cache->blocks_cluster, 578 614 block->data, block->size); 615 if (rc == EOK) 616 block->write_failures = 0; 579 617 block->dirty = false; 580 618 } … … 602 640 */ 603 641 block->refcnt++; 604 fibril_mutex_unlock(&block->lock); 605 fibril_mutex_unlock(&cache->lock); 606 goto retry; 642 643 if (block->write_failures < MAX_WRITE_RETRIES) { 644 block->write_failures++; 645 fibril_mutex_unlock(&block->lock); 646 fibril_mutex_unlock(&cache->lock); 647 goto retry; 648 } else { 649 printf("Too many errors writing block %" 650 PRIuOFF64 "from device handle %" PRIun "\n" 651 "SEVERE DATA LOSS POSSIBLE\n", 652 block->lba, devcon->service_id); 653 } 607 654 } 608 655 /* … … 770 817 devcon_t *devcon = devcon_search(service_id); 771 818 assert(devcon); 772 819 773 820 return bd_get_num_blocks(devcon->bd, nblocks); 774 821 } … … 832 879 * 833 880 * @return Allocated TOC structure. 834 * @return NULL on failure. 835 * 836 */ 837 toc_block_t *block_get_toc(service_id_t service_id, uint8_t session) 881 * @return EOK on success or negative error code. 882 * 883 */ 884 int block_read_toc(service_id_t service_id, uint8_t session, void *buf, 885 size_t bufsize) 838 886 { 839 887 devcon_t *devcon = devcon_search(service_id); 840 toc_block_t *toc = NULL; 841 int rc; 842 843 assert(devcon); 844 845 toc = (toc_block_t *) malloc(sizeof(toc_block_t)); 846 if (toc == NULL) 847 return NULL; 848 849 rc = bd_read_toc(devcon->bd, session, toc, sizeof(toc_block_t)); 850 if (rc != EOK) { 851 free(toc); 852 return NULL; 853 } 854 855 return toc; 888 889 assert(devcon); 890 return bd_read_toc(devcon->bd, session, buf, bufsize); 856 891 } 857 892
Note:
See TracChangeset
for help on using the changeset viewer.