Changes in uspace/lib/block/block.c [b7adc22:dd8b6a8] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/block/block.c
rb7adc22 rdd8b6a8 40 40 #include <ipc/services.h> 41 41 #include <errno.h> 42 #include <sys/mman.h>43 42 #include <async.h> 44 43 #include <as.h> … … 56 55 #include "block.h" 57 56 57 #define MAX_WRITE_RETRIES 10 58 58 59 /** Lock protecting the device connection list */ 59 60 static FIBRIL_MUTEX_INITIALIZE(dcl_lock); … … 80 81 void *bb_buf; 81 82 aoff64_t bb_addr; 83 aoff64_t pblocks; /**< Number of physical blocks */ 82 84 size_t pblock_size; /**< Physical block size. */ 83 85 cache_t *cache; … … 104 106 105 107 static int devcon_add(service_id_t service_id, async_sess_t *sess, 106 size_t bsize, bd_t *bd)108 size_t bsize, aoff64_t dev_size, bd_t *bd) 107 109 { 108 110 devcon_t *devcon; … … 119 121 devcon->bb_addr = 0; 120 122 devcon->pblock_size = bsize; 123 devcon->pblocks = dev_size; 121 124 devcon->cache = NULL; 122 125 … … 165 168 return rc; 166 169 } 167 168 rc = devcon_add(service_id, sess, bsize, bd); 170 171 aoff64_t dev_size; 172 rc = bd_get_num_blocks(bd, &dev_size); 169 173 if (rc != EOK) { 170 174 bd_close(bd); … … 173 177 } 174 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 175 186 return EOK; 176 187 } … … 183 194 if (devcon->cache) 184 195 (void) block_cache_fini(service_id); 196 197 (void)bd_sync_cache(devcon->bd, 0, 0); 185 198 186 199 devcon_remove(devcon); … … 350 363 fibril_mutex_initialize(&b->lock); 351 364 b->refcnt = 1; 365 b->write_failures = 0; 352 366 b->dirty = false; 353 367 b->toxic = false; … … 374 388 block_t *b; 375 389 link_t *link; 376 390 aoff64_t p_ba; 377 391 int rc; 378 392 … … 383 397 384 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 385 410 386 411 retry: … … 459 484 * another block next time. 460 485 */ 461 fibril_mutex_unlock(&b->lock); 462 goto retry; 463 } 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 464 499 b->dirty = false; 465 500 if (!fibril_mutex_trylock(&cache->lock)) { … … 578 613 rc = write_blocks(devcon, block->pba, cache->blocks_cluster, 579 614 block->data, block->size); 615 if (rc == EOK) 616 block->write_failures = 0; 580 617 block->dirty = false; 581 618 } … … 603 640 */ 604 641 block->refcnt++; 605 fibril_mutex_unlock(&block->lock); 606 fibril_mutex_unlock(&cache->lock); 607 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 } 608 654 } 609 655 /* … … 771 817 devcon_t *devcon = devcon_search(service_id); 772 818 assert(devcon); 773 819 774 820 return bd_get_num_blocks(devcon->bd, nblocks); 775 821 } … … 833 879 * 834 880 * @return Allocated TOC structure. 835 * @return NULL on failure. 836 * 837 */ 838 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) 839 886 { 840 887 devcon_t *devcon = devcon_search(service_id); 841 toc_block_t *toc = NULL; 842 int rc; 843 844 assert(devcon); 845 846 toc = (toc_block_t *) malloc(sizeof(toc_block_t)); 847 if (toc == NULL) 848 return NULL; 849 850 rc = bd_read_toc(devcon->bd, session, toc, sizeof(toc_block_t)); 851 if (rc != EOK) { 852 free(toc); 853 return NULL; 854 } 855 856 return toc; 888 889 assert(devcon); 890 return bd_read_toc(devcon->bd, session, buf, bufsize); 857 891 } 858 892
Note:
See TracChangeset
for help on using the changeset viewer.