Changes in uspace/lib/libblock/libblock.c [08232ee:ed903174] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libblock/libblock.c
r08232ee red903174 1 1 /* 2 * Copyright (c) 2008 Jakub Jermar 3 * Copyright (c) 2008 Martin Decky 2 * Copyright (c) 2008 Jakub Jermar 3 * Copyright (c) 2008 Martin Decky 4 4 * All rights reserved. 5 5 * … … 52 52 #include <macros.h> 53 53 #include <mem.h> 54 #include <sys/typefmt.h> 55 #include <stacktrace.h> 54 56 55 57 /** Lock protecting the device connection list */ … … 79 81 size_t comm_size; 80 82 void *bb_buf; 81 bn_t bb_addr;83 aoff64_t bb_addr; 82 84 size_t pblock_size; /**< Physical block size. */ 83 85 cache_t *cache; 84 86 } devcon_t; 85 87 86 static int read_blocks(devcon_t *devcon, bn_t ba, size_t cnt);87 static int write_blocks(devcon_t *devcon, bn_t ba, size_t cnt);88 static int read_blocks(devcon_t *devcon, aoff64_t ba, size_t cnt); 89 static int write_blocks(devcon_t *devcon, aoff64_t ba, size_t cnt); 88 90 static int get_block_size(int dev_phone, size_t *bsize); 89 static int get_num_blocks(int dev_phone, bn_t *nblocks);91 static int get_num_blocks(int dev_phone, aoff64_t *nblocks); 90 92 91 93 static devcon_t *devcon_search(dev_handle_t dev_handle) … … 198 200 assert(devcon); 199 201 202 if (devcon->cache) 203 (void) block_cache_fini(dev_handle); 204 200 205 devcon_remove(devcon); 201 206 … … 203 208 free(devcon->bb_buf); 204 209 205 if (devcon->cache) {206 hash_table_destroy(&devcon->cache->block_hash);207 free(devcon->cache);208 }209 210 210 munmap(devcon->comm_area, devcon->comm_size); 211 211 ipc_hangup(devcon->dev_phone); … … 214 214 } 215 215 216 int block_bb_read(dev_handle_t dev_handle, bn_t ba)216 int block_bb_read(dev_handle_t dev_handle, aoff64_t ba) 217 217 { 218 218 void *bb_buf; … … 305 305 } 306 306 307 int block_cache_fini(dev_handle_t dev_handle) 308 { 309 devcon_t *devcon = devcon_search(dev_handle); 310 cache_t *cache; 311 int rc; 312 313 if (!devcon) 314 return ENOENT; 315 if (!devcon->cache) 316 return EOK; 317 cache = devcon->cache; 318 319 /* 320 * We are expecting to find all blocks for this device handle on the 321 * free list, i.e. the block reference count should be zero. Do not 322 * bother with the cache and block locks because we are single-threaded. 323 */ 324 while (!list_empty(&cache->free_head)) { 325 block_t *b = list_get_instance(cache->free_head.next, 326 block_t, free_link); 327 328 list_remove(&b->free_link); 329 if (b->dirty) { 330 memcpy(devcon->comm_area, b->data, b->size); 331 rc = write_blocks(devcon, b->boff, 1); 332 if (rc != EOK) 333 return rc; 334 } 335 336 unsigned long key = b->boff; 337 hash_table_remove(&cache->block_hash, &key, 1); 338 339 free(b->data); 340 free(b); 341 } 342 343 hash_table_destroy(&cache->block_hash); 344 devcon->cache = NULL; 345 free(cache); 346 347 return EOK; 348 } 349 307 350 #define CACHE_LO_WATERMARK 10 308 351 #define CACHE_HI_WATERMARK 20 … … 339 382 * @return EOK on success or a negative error code. 340 383 */ 341 int block_get(block_t **block, dev_handle_t dev_handle, bn_t boff, int flags)384 int block_get(block_t **block, dev_handle_t dev_handle, aoff64_t boff, int flags) 342 385 { 343 386 devcon_t *devcon; … … 614 657 * @return EOK on success or a negative return code on failure. 615 658 */ 616 int block_seqread(dev_handle_t dev_handle, off_t *bufpos, size_t *buflen,617 off_t *pos, void *dst, size_t size)618 { 619 off_t offset = 0;659 int block_seqread(dev_handle_t dev_handle, size_t *bufpos, size_t *buflen, 660 aoff64_t *pos, void *dst, size_t size) 661 { 662 size_t offset = 0; 620 663 size_t left = size; 621 664 size_t block_size; … … 647 690 } 648 691 649 if (*bufpos == (off_t)*buflen) {692 if (*bufpos == *buflen) { 650 693 /* Refill the communication buffer with a new block. */ 651 694 int rc; … … 675 718 * @return EOK on success or negative error code on failure. 676 719 */ 677 int block_read_direct(dev_handle_t dev_handle, bn_t ba, size_t cnt, void *buf)720 int block_read_direct(dev_handle_t dev_handle, aoff64_t ba, size_t cnt, void *buf) 678 721 { 679 722 devcon_t *devcon; … … 703 746 * @return EOK on success or negative error code on failure. 704 747 */ 705 int block_write_direct(dev_handle_t dev_handle, bn_t ba, size_t cnt,748 int block_write_direct(dev_handle_t dev_handle, aoff64_t ba, size_t cnt, 706 749 const void *data) 707 750 { … … 746 789 * @return EOK on success or negative error code on failure. 747 790 */ 748 int block_get_nblocks(dev_handle_t dev_handle, bn_t *nblocks)791 int block_get_nblocks(dev_handle_t dev_handle, aoff64_t *nblocks) 749 792 { 750 793 devcon_t *devcon; … … 765 808 * @return EOK on success or negative error code on failure. 766 809 */ 767 static int read_blocks(devcon_t *devcon, bn_t ba, size_t cnt)810 static int read_blocks(devcon_t *devcon, aoff64_t ba, size_t cnt) 768 811 { 769 812 int rc; … … 772 815 rc = async_req_3_0(devcon->dev_phone, BD_READ_BLOCKS, LOWER32(ba), 773 816 UPPER32(ba), cnt); 817 if (rc != EOK) { 818 printf("Error %d reading %d blocks starting at block %" PRIuOFF64 819 " from device handle %d\n", rc, cnt, ba, 820 devcon->dev_handle); 821 #ifndef NDEBUG 822 stacktrace_print(); 823 #endif 824 } 774 825 return rc; 775 826 } … … 784 835 * @return EOK on success or negative error code on failure. 785 836 */ 786 static int write_blocks(devcon_t *devcon, bn_t ba, size_t cnt)837 static int write_blocks(devcon_t *devcon, aoff64_t ba, size_t cnt) 787 838 { 788 839 int rc; … … 791 842 rc = async_req_3_0(devcon->dev_phone, BD_WRITE_BLOCKS, LOWER32(ba), 792 843 UPPER32(ba), cnt); 844 if (rc != EOK) { 845 printf("Error %d writing %d blocks starting at block %" PRIuOFF64 846 " to device handle %d\n", rc, cnt, ba, devcon->dev_handle); 847 #ifndef NDEBUG 848 stacktrace_print(); 849 #endif 850 } 793 851 return rc; 794 852 } … … 808 866 809 867 /** Get total number of blocks on block device. */ 810 static int get_num_blocks(int dev_phone, bn_t *nblocks)868 static int get_num_blocks(int dev_phone, aoff64_t *nblocks) 811 869 { 812 870 ipcarg_t nb_l, nb_h; … … 815 873 rc = async_req_0_2(dev_phone, BD_GET_NUM_BLOCKS, &nb_l, &nb_h); 816 874 if (rc == EOK) { 817 *nblocks = ( bn_t) MERGE_LOUP32(nb_l, nb_h);875 *nblocks = (aoff64_t) MERGE_LOUP32(nb_l, nb_h); 818 876 } 819 877
Note:
See TracChangeset
for help on using the changeset viewer.