Changes in uspace/lib/block/libblock.c [867e2555:7a72ce1a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/block/libblock.c
r867e2555 r7a72ce1a 39 39 #include "libblock.h" 40 40 #include "../../srv/vfs/vfs.h" 41 #include <ipc/ devmap.h>41 #include <ipc/loc.h> 42 42 #include <ipc/bd.h> 43 43 #include <ipc/services.h> … … 78 78 typedef struct { 79 79 link_t link; 80 devmap_handle_t devmap_handle;80 service_id_t service_id; 81 81 async_sess_t *sess; 82 82 fibril_mutex_t comm_area_lock; … … 93 93 static int get_block_size(async_sess_t *, size_t *); 94 94 static int get_num_blocks(async_sess_t *, aoff64_t *); 95 static int read_toc(async_sess_t *, uint8_t); 95 96 static aoff64_t ba_ltop(devcon_t *, aoff64_t); 96 97 97 static devcon_t *devcon_search( devmap_handle_t devmap_handle)98 static devcon_t *devcon_search(service_id_t service_id) 98 99 { 99 100 fibril_mutex_lock(&dcl_lock); … … 101 102 list_foreach(dcl, cur) { 102 103 devcon_t *devcon = list_get_instance(cur, devcon_t, link); 103 if (devcon-> devmap_handle == devmap_handle) {104 if (devcon->service_id == service_id) { 104 105 fibril_mutex_unlock(&dcl_lock); 105 106 return devcon; … … 111 112 } 112 113 113 static int devcon_add( devmap_handle_t devmap_handle, async_sess_t *sess,114 static int devcon_add(service_id_t service_id, async_sess_t *sess, 114 115 size_t bsize, void *comm_area, size_t comm_size) 115 116 { … … 124 125 125 126 link_initialize(&devcon->link); 126 devcon-> devmap_handle = devmap_handle;127 devcon->service_id = service_id; 127 128 devcon->sess = sess; 128 129 fibril_mutex_initialize(&devcon->comm_area_lock); … … 137 138 list_foreach(dcl, cur) { 138 139 devcon_t *d = list_get_instance(cur, devcon_t, link); 139 if (d-> devmap_handle == devmap_handle) {140 if (d->service_id == service_id) { 140 141 fibril_mutex_unlock(&dcl_lock); 141 142 free(devcon); … … 155 156 } 156 157 157 int block_init(exch_mgmt_t mgmt, devmap_handle_t devmap_handle,158 int block_init(exch_mgmt_t mgmt, service_id_t service_id, 158 159 size_t comm_size) 159 160 { … … 163 164 return ENOMEM; 164 165 165 async_sess_t *sess = devmap_device_connect(mgmt, devmap_handle,166 async_sess_t *sess = loc_service_connect(mgmt, service_id, 166 167 IPC_FLAG_BLOCKING); 167 168 if (!sess) { … … 190 191 } 191 192 192 rc = devcon_add( devmap_handle, sess, bsize, comm_area, comm_size);193 rc = devcon_add(service_id, sess, bsize, comm_area, comm_size); 193 194 if (rc != EOK) { 194 195 munmap(comm_area, comm_size); … … 200 201 } 201 202 202 void block_fini( devmap_handle_t devmap_handle)203 { 204 devcon_t *devcon = devcon_search( devmap_handle);203 void block_fini(service_id_t service_id) 204 { 205 devcon_t *devcon = devcon_search(service_id); 205 206 assert(devcon); 206 207 207 208 if (devcon->cache) 208 (void) block_cache_fini( devmap_handle);209 (void) block_cache_fini(service_id); 209 210 210 211 devcon_remove(devcon); … … 219 220 } 220 221 221 int block_bb_read( devmap_handle_t devmap_handle, aoff64_t ba)222 int block_bb_read(service_id_t service_id, aoff64_t ba) 222 223 { 223 224 void *bb_buf; 224 225 int rc; 225 226 226 devcon_t *devcon = devcon_search( devmap_handle);227 devcon_t *devcon = devcon_search(service_id); 227 228 if (!devcon) 228 229 return ENOENT; … … 249 250 } 250 251 251 void *block_bb_get( devmap_handle_t devmap_handle)252 { 253 devcon_t *devcon = devcon_search( devmap_handle);252 void *block_bb_get(service_id_t service_id) 253 { 254 devcon_t *devcon = devcon_search(service_id); 254 255 assert(devcon); 255 256 return devcon->bb_buf; … … 277 278 }; 278 279 279 int block_cache_init( devmap_handle_t devmap_handle, size_t size, unsigned blocks,280 int block_cache_init(service_id_t service_id, size_t size, unsigned blocks, 280 281 enum cache_mode mode) 281 282 { 282 devcon_t *devcon = devcon_search( devmap_handle);283 devcon_t *devcon = devcon_search(service_id); 283 284 cache_t *cache; 284 285 if (!devcon) … … 315 316 } 316 317 317 int block_cache_fini( devmap_handle_t devmap_handle)318 { 319 devcon_t *devcon = devcon_search( devmap_handle);318 int block_cache_fini(service_id_t service_id) 319 { 320 devcon_t *devcon = devcon_search(service_id); 320 321 cache_t *cache; 321 322 int rc; … … 387 388 * @param block Pointer to where the function will store the 388 389 * block pointer on success. 389 * @param devmap_handle Device handleof the block device.390 * @param service_id Service ID of the block device. 390 391 * @param ba Block address (logical). 391 392 * @param flags If BLOCK_FLAGS_NOREAD is specified, block_get() … … 395 396 * @return EOK on success or a negative error code. 396 397 */ 397 int block_get(block_t **block, devmap_handle_t devmap_handle, aoff64_t ba, int flags)398 int block_get(block_t **block, service_id_t service_id, aoff64_t ba, int flags) 398 399 { 399 400 devcon_t *devcon; … … 408 409 int rc; 409 410 410 devcon = devcon_search( devmap_handle);411 devcon = devcon_search(service_id); 411 412 412 413 assert(devcon); … … 536 537 537 538 block_initialize(b); 538 b-> devmap_handle = devmap_handle;539 b->service_id = service_id; 539 540 b->size = cache->lblock_size; 540 541 b->lba = ba; … … 586 587 int block_put(block_t *block) 587 588 { 588 devcon_t *devcon = devcon_search(block-> devmap_handle);589 devcon_t *devcon = devcon_search(block->service_id); 589 590 cache_t *cache; 590 591 unsigned blocks_cached; … … 687 688 /** Read sequential data from a block device. 688 689 * 689 * @param devmap_handle Device handleof the block device.690 * @param service_id Service ID of the block device. 690 691 * @param bufpos Pointer to the first unread valid offset within the 691 692 * communication buffer. … … 699 700 * @return EOK on success or a negative return code on failure. 700 701 */ 701 int block_seqread( devmap_handle_t devmap_handle, size_t *bufpos, size_t *buflen,702 int block_seqread(service_id_t service_id, size_t *bufpos, size_t *buflen, 702 703 aoff64_t *pos, void *dst, size_t size) 703 704 { … … 707 708 devcon_t *devcon; 708 709 709 devcon = devcon_search( devmap_handle);710 devcon = devcon_search(service_id); 710 711 assert(devcon); 711 712 block_size = devcon->pblock_size; … … 753 754 /** Read blocks directly from device (bypass cache). 754 755 * 755 * @param devmap_handle Device handleof the block device.756 * @param service_id Service ID of the block device. 756 757 * @param ba Address of first block (physical). 757 758 * @param cnt Number of blocks. … … 760 761 * @return EOK on success or negative error code on failure. 761 762 */ 762 int block_read_direct( devmap_handle_t devmap_handle, aoff64_t ba, size_t cnt, void *buf)763 int block_read_direct(service_id_t service_id, aoff64_t ba, size_t cnt, void *buf) 763 764 { 764 765 devcon_t *devcon; 765 766 int rc; 766 767 767 devcon = devcon_search( devmap_handle);768 devcon = devcon_search(service_id); 768 769 assert(devcon); 769 770 … … 781 782 /** Write blocks directly to device (bypass cache). 782 783 * 783 * @param devmap_handle Device handleof the block device.784 * @param service_id Service ID of the block device. 784 785 * @param ba Address of first block (physical). 785 786 * @param cnt Number of blocks. … … 788 789 * @return EOK on success or negative error code on failure. 789 790 */ 790 int block_write_direct( devmap_handle_t devmap_handle, aoff64_t ba, size_t cnt,791 int block_write_direct(service_id_t service_id, aoff64_t ba, size_t cnt, 791 792 const void *data) 792 793 { … … 794 795 int rc; 795 796 796 devcon = devcon_search( devmap_handle);797 devcon = devcon_search(service_id); 797 798 assert(devcon); 798 799 … … 809 810 /** Get device block size. 810 811 * 811 * @param devmap_handle Device handleof the block device.812 * @param service_id Service ID of the block device. 812 813 * @param bsize Output block size. 813 814 * 814 815 * @return EOK on success or negative error code on failure. 815 816 */ 816 int block_get_bsize( devmap_handle_t devmap_handle, size_t *bsize)817 int block_get_bsize(service_id_t service_id, size_t *bsize) 817 818 { 818 819 devcon_t *devcon; 819 820 820 devcon = devcon_search( devmap_handle);821 devcon = devcon_search(service_id); 821 822 assert(devcon); 822 823 … … 826 827 /** Get number of blocks on device. 827 828 * 828 * @param devmap_handle Device handleof the block device.829 * @param service_id Service ID of the block device. 829 830 * @param nblocks Output number of blocks. 830 831 * 831 832 * @return EOK on success or negative error code on failure. 832 833 */ 833 int block_get_nblocks( devmap_handle_t devmap_handle, aoff64_t *nblocks)834 { 835 devcon_t *devcon = devcon_search( devmap_handle);834 int block_get_nblocks(service_id_t service_id, aoff64_t *nblocks) 835 { 836 devcon_t *devcon = devcon_search(service_id); 836 837 assert(devcon); 837 838 … … 841 842 /** Read bytes directly from the device (bypass cache) 842 843 * 843 * @param devmap_handle Device handleof the block device.844 * @param service_id Service ID of the block device. 844 845 * @param abs_offset Absolute offset in bytes where to start reading 845 846 * @param bytes Number of bytes to read … … 848 849 * @return EOK on success or negative error code on failure. 849 850 */ 850 int block_read_bytes_direct( devmap_handle_t devmap_handle, aoff64_t abs_offset,851 int block_read_bytes_direct(service_id_t service_id, aoff64_t abs_offset, 851 852 size_t bytes, void *data) 852 853 { … … 860 861 size_t offset; 861 862 862 rc = block_get_bsize( devmap_handle, &phys_block_size);863 rc = block_get_bsize(service_id, &phys_block_size); 863 864 if (rc != EOK) { 864 865 return rc; … … 878 879 } 879 880 880 rc = block_read_direct( devmap_handle, first_block, blocks, buffer);881 rc = block_read_direct(service_id, first_block, blocks, buffer); 881 882 if (rc != EOK) { 882 883 free(buffer); … … 889 890 890 891 return EOK; 892 } 893 894 /** Get TOC from device. 895 * 896 * @param service_id Service ID of the block device. 897 * @param session Starting session. 898 * @param data Buffer to read TOC into. 899 * 900 * @return EOK on success. 901 * @return Error code on failure. 902 * 903 */ 904 int block_get_toc(service_id_t service_id, uint8_t session, void *data) 905 { 906 devcon_t *devcon = devcon_search(service_id); 907 assert(devcon); 908 909 fibril_mutex_lock(&devcon->comm_area_lock); 910 911 int rc = read_toc(devcon->sess, session); 912 if (rc == EOK) 913 memcpy(data, devcon->comm_area, devcon->pblock_size); 914 915 fibril_mutex_unlock(&devcon->comm_area_lock); 916 917 return rc; 891 918 } 892 919 … … 912 939 printf("Error %d reading %zu blocks starting at block %" PRIuOFF64 913 940 " from device handle %" PRIun "\n", rc, cnt, ba, 914 devcon-> devmap_handle);941 devcon->service_id); 915 942 #ifndef NDEBUG 916 943 stacktrace_print(); … … 941 968 if (rc != EOK) { 942 969 printf("Error %d writing %zu blocks starting at block %" PRIuOFF64 943 " to device handle %" PRIun "\n", rc, cnt, ba, devcon-> devmap_handle);970 " to device handle %" PRIun "\n", rc, cnt, ba, devcon->service_id); 944 971 #ifndef NDEBUG 945 972 stacktrace_print(); … … 981 1008 } 982 1009 1010 /** Get TOC from block device. */ 1011 static int read_toc(async_sess_t *sess, uint8_t session) 1012 { 1013 async_exch_t *exch = async_exchange_begin(sess); 1014 int rc = async_req_1_0(exch, BD_READ_TOC, session); 1015 async_exchange_end(exch); 1016 1017 return rc; 1018 } 1019 983 1020 /** Convert logical block address to physical block address. */ 984 1021 static aoff64_t ba_ltop(devcon_t *devcon, aoff64_t lba)
Note:
See TracChangeset
for help on using the changeset viewer.